mvc学习小笔记(二) 请求参数绑定

493 阅读4分钟

1.请求参数为单独字符串等单独格式

@Controller
@RequestMapping("/param")
public class ParamController {

    /**
     * 请求参数绑定入门
     * @return
     */
    @RequestMapping("/testParam")
    public String testParam(String username,String password){
        System.out.println("执行了...");
        System.out.println("用户名:"+username);
        System.out.println("密码:"+password);
        return "success";
    }
<a href="param/testParam?username=hehe&password=123">请求参数绑定</a>

如上,在请求参数中带有username和password的参数,可在请求方法中添加形参,若名称对应,其值会自动封存在形参中。

2.请求参数封装入javabean实体(封装类)中

●将请求参数封装在一个实体类中,让类的属性与其相对应进行封装。

把数据封装Account类中
<form action="param/saveAccount" method="post">
    姓名:<input type="text" name="username" /><br/>
    密码:<input type="text" name="password" /><br/>
    金额:<input type="text" name="money" /><br/>
    <input type="submit" value="提交" />
</form>
public class Account implements Serializable{

    private String username;
    private String password;
    private Double money;
/**
 * 请求参数绑定把数据封装到JavaBean的类中
 * @return
 */
@RequestMapping("/saveAccount")
public String saveAccount(Account account){
    System.out.println("执行了...");
    System.out.println(account);
    return "success";
}

把数据封装Account类中,注意要生成对应的get、set方法,若要输出内容,则生成tostring方法。在请求方法的形参中添加同名实体类,即可调用其封装内容。

●若引用其他类,比如封装类中再引入封装类。

把数据封装Account类中
<form action="param/saveAccount" method="post">
    姓名:<input type="text" name="username" /><br/>
    密码:<input type="text" name="password" /><br/>
    金额:<input type="text" name="money" /><br/>
    用户姓名:<input type="text" name="user.uname" /><br/>
    用户年龄:<input type="text" name="user.age" /><br/>
    <input type="submit" value="提交" />
</form>
public class User implements Serializable{

    private String uname;
    private Integer age;

user已作为Account类的属性,所以要对应user的属性,则用”user.属性“的形式

●请求参数数据封装入类的集合中

效果为将两组用户姓名年龄各封装在list和map集合中

把数据封装Account类中,类中存在list和map的集合
<form action="param/saveAccount" method="post">
    姓名:<input type="text" name="username" /><br/>
    密码:<input type="text" name="password" /><br/>
    金额:<input type="text" name="money" /><br/>

    用户姓名:<input type="text" name="list[0].uname" /><br/>
    用户年龄:<input type="text" name="list[0].age" /><br/>

    用户姓名:<input type="text" name="map['one'].uname" /><br/>
    用户年龄:<input type="text" name="map['one'].age" /><br/>
    <input type="submit" value="提交" />
</form>
public class Account implements Serializable{

    private String username;
    private String password;
    private Double money;

    private List<User> list;
    private Map<String,User> map;

将user类封装入集合list中,list[0].uname为将uname值封装在list集合的0位置,集合内存放user类

将user类封装入集合map中,map['one'].uname为将uname值封装在map集合的value中,value为user属性,map需要key,此处随便设定key为string类型的“one”。

image-20201222140713003

最后打印效果如上。

3.获取servlet原生API的地址

/**
 * 原生的API
 * @return
 */
@RequestMapping("/testServlet")
public String testServlet(HttpServletRequest request, HttpServletResponse response){
    System.out.println("执行了...");
    System.out.println(request);

    HttpSession session = request.getSession();
    System.out.println(session);

    ServletContext servletContext = session.getServletContext();
    System.out.println(servletContext);

    System.out.println(response);
    return "success";
}

只需在形参中写所需API,就能获取。 以上为控制台的输出打印。

4.@RequestParam

@RequestMapping(value ="/testRequestParam")
public String testRequestParam(@RequestParam(name="name") String username){
    System.out.println("执行了...");
    System.out.println(username);
    return "success";
}
<a href="anno/testRequestParam?name=哈哈">RequestParam</a>

不用注解,则是找请求参数中的username属性或是封装类的username属性。

传入参数key是name,所以若要拿到值,形参中得用同名的name,否则获取不到。

(@RequestParam(name="name") String username)则将name参数封装到username中,相当于自定义。

public @interface RequestParam {
    @AliasFor("name")
    String value() default "";

    @AliasFor("value")
    String name() default "";

    boolean required() default true;

如上name和value效果是一样的。required默认为true,指若使用了则必须传此命名的name参数,否则报错。

5.@RequestBody

/**
 * 获取到请求体的内容
 * @return
 */
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody String body){
    System.out.println("执行了...");
    System.out.println(body);
    return "success";
}
<form action="anno/testRequestBody" method="post">
    用户姓名:<input type="text" name="username" /><br/>
    用户年龄:<input type="text" name="age" /><br/>
    <input type="submit" value="提交" />
</form>

RequestBody是将请求参数整体封装到形参body中去,之后关于json的时候再详细讲。

2020.12.23进行补充

<script>
    // 页面加载,绑定单击事件
    $(function(){
        $("#btn").click(function(){
            // alert("hello btn");
            // 发送ajax请求
            $.ajax({
                // 编写json格式,设置属性和值
                url:"user/testAjax",
                contentType:"application/json;charset=UTF-8",
                data:'{"username":"hehe","password":"123","age":30}',
                dataType:"json",
                type:"post",
                success:function(data){
                    // data服务器端响应的json的数据,进行解析
                    alert(data);
                    alert(data.username);
                    alert(data.password);
                    alert(data.age);
                }
            });

        });
    });

</script>

前端发送ajax请求,发送数据为json字符串类型的data请求,然后后端要响应给前端json类型的数据data,之后才能解析。

/**
 * 模拟异步请求响应
 */
@RequestMapping("/testAjax")
public @ResponseBody User testAjax(@RequestBody User user){
    System.out.println("testAjax方法执行了...");
    // 客户端发送ajax的请求,传的是json字符串,后端把json字符串封装到user对象中
    System.out.println(user);
    // 做响应,模拟查询数据库
    user.setUsername("haha");
    user.setAge(40);
    // 做响应
    return user;
}

通过@RequestBody注解将json数据封装在user中,根据同名自动封装在形参user的属性中(则提取了json字符串中的键值对),之后做响应,return了user类对象,但前端需要json类型的数据响应,@ResponseBody注解,可以吧返回的user对象转化为json类型。

6.restful编程风格与@PathVariable

即根据请求方法等的区别选择要使用的方法。

@RequestMapping(value="/testPathVariable/{sid}")
public String testPathVariable(@PathVariable(name="sid") String id){
    System.out.println("执行了...");
    System.out.println(id);
    return "success";
}

{sid}是占位符,而PathVariable就是获取占位符的值,将其赋予字符串id

<a href="anno/testPathVariable/10">testPathVariable</a>

则最后输出结果为10

7.@RequestHeader

/**
 * 获取请求头的值
 * @param header
 * @return
 */
@RequestMapping(value="/testRequestHeader")
public String testRequestHeader(@RequestHeader(value="Accept") String header) {
    System.out.println("执行了...");
    System.out.println(header);
     return "success";

如上,获得请求头Accept的值

8.@CookieValue

游览器向服务器发送请求,服务器会开辟session空间,然后向游览器返回结果jsessionid。@CookieValue可以获取其值。

/**
 * 获取Cookie的值
 * @return
 */
@RequestMapping(value="/testCookieValue")
public String testCookieValue(@CookieValue(value="JSESSIONID") String cookieValue){
    System.out.println("执行了...");
    System.out.println(cookieValue);
    return "success";
}

9.@ModelAttribute