绑定:将请求中的信息按照名字匹配的原则赋值给方法参数。

1. 请求路径变量@PathVariable

从请求URI中获取参数,不包含查询字符串,及?号后面的内容。

@RestController
@RequestMapping("/user")
public class UserAction {
    @GetMapping("/{id}")
    public Result getUser(@PathVariable int id) {
        return ResultUtil.successResult("123456");
    }
}

若方法参数名称和需要绑定的uri中变量名称不一致,需要在@PathVariable(“name”)指定uri中的名称,名称需要采用{name}格式。

2. 请求头@RequestHeader

@GetMapping("/getRequestHeader")
public Result getRequestHeader(@RequestHeader("Accept-Encoding") String encoding) {
    return ResultUtil.successResult(encoding);
}

从请求头中获取参数,需要指定请求头的名称。

3. Cookie @CookieValue

@RequestMapping("/getCookie")
public Result getCookie(@CookieValue("JSESSIONID") String cookie) {
    return ResultUtil.successResult(cookie);
}

从cookie中获取参数,需要指定cookie的名称。

4. 请求体@RequestParam

4.1 处理简单类型的绑定

通过Request.getParameter() 获取的String可直接转换为简单类型的情况( String–> 简单类型的转换操作由ConversionService配置的转换器来完成);
因为使用request.getParameter()方式获取参数,所以可以处理get 方式中queryString的值,也可以处理post方式中 body data的值

4.2 处理表单请求

用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容,提交方式GET、POST;

4.3 注解属性

该注解有两个属性: value、required; value用来指定要传入值的id名称,required用来指示参数是否必须绑定;

@GetMapping("/tesRequestParam")
public Result tesRequestParam(@RequestParam("username") String username) {
    return ResultUtil.successResult(username);
}

5. 请求体@RequestBody

该注解常用来处理Content-Type: 不是application/x-www-form-urlencoded编码的内容,例如application/json, application/xml等;
它是通过使用HandlerAdapter 配置的HttpMessageConverters来解析post data body,然后绑定到相应的bean上的。

@PostMapping("/tesRequestBody")
public Result tesRequestBody(@RequestBody User user) {
    return ResultUtil.successResult(user);
}

用来处理json格式参数的情况比较常用。

@RequestBody通过list接收对象数组

当我们需要传递对象数组的时候,表单编码就不行了,这时我们是可以采用json传递,然后后台使用@RequestBody注解,通过list接收来对象数组。

@PostMapping("saveUsers")
public Result saveUsers(@RequestBody List<User> users) {
    return ResultUtil.successResult(users);
}

6. 会话属性@SessionAttribute

这个用的比较少,简单了解即可。

@PostMapping("/setSessionAttribute")
public Result setSessionAttribute(HttpSession session, String attribute) {
    session.setAttribute("attribute", attribute);
    return ResultUtil.SUCCESS_RESULT;
}

@GetMapping("/getSessionAttribute")
public Result getSessionAttribute(@SessionAttribute("attribute") String attribute) {
    return ResultUtil.successResult(attribute);
}

7. model属性@ModelAttribute

@ModelAttribute标注可被应用在方法或方法参数上。
标注在方法参数上的@ModelAttribute说明了该方法参数的值将由model中取得。如果model中找不到,那么该参数会先被实例化,然后被添加到model中。在model中存在以后,请求中所有名称匹配的参数都会填充到该参数中。
请求传递代码:

$(document).ready(function () {
    var users = [];
    var user1 = {"username": "dd", "password": "123"};
    var user2 = {"username": "gg", "password": "123"};
    users.push(user1);
    users.push(user2);
    $.ajax({
        type: "POST",
        url: "users/saveUsers",
        timeout: 30000,
        dataType: "json",
        contentType: "application/json",
        data: JSON.stringify(users),
        success: function (data) {
            //将返回的数据展示成table
            showTable(data);
        },
        error: function () { //请求出错的处理
            $("#result").text("请求出错");
        }
    });
});

服务端代码:

@PostMapping
public Result saveUser(@ModelAttribute User user) {
    return ResultUtil.successResult(user);
}

这个User类型的实例可能来自:

  • 可能因为@SessionAttributes标注的使用已经存在于model中
  • 可能因为在同个控制器中使用了@ModelAttribute方法已经存在于model中,正如上一小节所叙述的
  • 可能是由URI模板变量和类型转换中取得的
  • 可能是调用了自身的默认构造器被实例化出来的

8. 参数没有注解时的默认绑定

8.1 参数是简单类型,调用@RequestParam来处理

绑定的对象时简单类型:调用@RequestParam来处理的。
这里的简单类型指Java的原始类型(boolean, int 等)、原始类型对象(Boolean, Int等)、String、Date等ConversionService里可以直接String转换成目标对象的类型。即@RequestParam可以省略。

8.2 参数是复杂类,调用@ModelAttribute来处理

绑定的对象时复杂类型:调用@ModelAttribute来处理的。也就是说如果不需要从model或者session中得到数据,@ModelAttribute可以省略。

8.3 @RequestMapping支持的方法参数

下面这些参数Spring在调用请求方法的时候会自动给它们赋值,所以当在请求方法中需要使用到这些对象的时候,可以直接在方法上给定一个方法参数的申明,然后在方法体里面直接用就可以了。

  • HttpServlet 对象,主要包括HttpServletRequest 、HttpServletResponse 和HttpSession 对象。 但是有一点需要注意的是在使用HttpSession 对象的时候,如果此时HttpSession 对象还没有建立起来的话就会有问题。
  • Spring 自己的WebRequest 对象。 使用该对象可以访问到存放在HttpServletRequest 和HttpSession 中的属性值。
  • InputStream 、OutputStream 、Reader 和Writer 。 InputStream 和Reader 是针对HttpServletRequest 而言的,可以从里面取数据;OutputStream 和Writer 是针对HttpServletResponse 而言的,可以往里面写数据。
  • 使用@PathVariable 、@RequestParam 、@CookieValue 和 @RequestHeader 标记的参数。
  • 使用@ModelAttribute 标记的参数。
  • java.util.Map 、Spring 封装的Model 和ModelMap 。 这些都可以用来封装模型数据,用来给视图做展示。
  • 实体类。 可以用来接收上传的参数,比较常用。
  • Spring 封装的MultipartFile 。 用来接收上传文件的。
  • Spring 封装的Errors 和BindingResult 对象。 这两个对象参数必须紧接在需要验证的实体对象参数之后,它里面包含了实体对象的验证结果。