绑定:将请求中的信息按照名字匹配的原则赋值给方法参数。
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 对象。 这两个对象参数必须紧接在需要验证的实体对象参数之后,它里面包含了实体对象的验证结果。