SpringBoot参数绑定注解详解及其使用场景
在使用Spring Boot作接口开发的过程中发现接受参数的注解,有时不能准确理解其含义,故抽空总结一下以备将来参阅。
首先将常用的handler method注解通过他们处理Request的不同内容部分,分类如下:
1. 处理request uri部分(这里指uri template中variable,不含queryString部分)的注解: @PathVariable;2. 处理request header部分的注解:@RequestHeader,@CookieValue;
3. 处理request body部分的注解:@RequestParam, @RequestBody;
4. 处理attribute类型是注解:@SessionAttributes, @ModelAttribute;
下面是几个注解的说明:
1. @RequestParam
常用来处理简单类型的绑定,通过Request.getParameter()获取的String可直接转换为简单类型的情况;因为使用request.getParameter()方式获取参数,所以可以处理get和post方式中queryString的值,也可以处理post方式中post方式中body data的值,此时的请求类型为application/x-www-form-urlencoded,如果类型为application/json,只能用@RequestBody处理;
该注解有两个属性:value、required;value用来指定要传入值的id名称,required不写默认是true;
@RequestMapping("/login")public String login(@RequestParam(value="username") String username, @RequestParam(value="password") String password){
return username+password;
}
2. @RequestBody
- 该注解常用来处理Content-Type:一般是application/json,application/xml;通过使用HandlerAdapter配置的HttpMessageConverters来解析post data body,然后绑定到相应的bean上的。支持post、put方式。
@RequestMapping(value="/something", method=RequestMethod.PUT)public void handle(@RequestBody String body){
System.out.println(body);
}
3. @PathVariable
- 通过@PathVariable可以将URL中占位符参数绑定到控制器处理方法的入参中:URL中的{xxx}占位符可以通过@PathVariable("xxx")绑定到操作方法的入参中。促使SpringMVC支持Rest风格。
@RequestMapping("/get/{id}")public void getSomethingById(@PathVariable String id) {
// implementation omitted
}
4. @RequestHeader,@CookieValue;
(1) @RequestHeader
@RequestHeader注解,可以把Request请求header部分的值绑定到方法的参数上。
@RequestMapping("/setHeader")public void setHeaderInfo(@RequestHeader("Accept-Encoding") String encoding, @RequestHeader("Keep-Alive") long keepAlive) {
}
- 上述代码将request header部分的Accept-Encoding的值,绑定到参数encoding上了,Keep-Alive header的值绑定到参数keepAlive上。
为了固定参数统一处理,当然也支持在header中传入参数,如token信息,此时的写法如下:
@RequestMapping("/setHeader")public void setHeaderInfo(@RequestHeader String token) {
//...
}
(2)@CookieValue
@CookieValue可以把Request header中关于Cookie的值绑定到方法的参数上。
@RequestMapping("/setHeader")public void setHeaderInfo(@CookieValue("JSESSIONID") String cookie) {
// ...
}
上述代码将JSESSIONID的值绑定到参数cookie上。
5. @SessionAttributes, @ModelAttribute
(1)SessionAttributes
该注解用来绑定HttpSession中的attribute对象的值,便于在方法中的参数里使用。默认情况下SpringMVC将模型中的数据存储到request域中。当一个请求结束后,数据就失效了。如果要夸页面使用,那么需要使用到session。而@SessionAttribute注解就可以使得模型中的数据存储一份到session域中。
@Controller@RequestMapping("/editPet.do")
@SessionAttributes("attr1","attr2")
public class TestSessionAttributes {
@RequestMapping(values="/index1")
public ModelAndView index(){
ModelAndView mav = new ModelAndView("index.jsp");
mav.addObject("attr1","attr1Value");
mav.addObject("attr2","attr2Value");
return mav;
}
@RequestMapping(values="/index2")
public ModelAndView index2(@ModelAttribute("attr1") String attr1, @ModelAttribute("attr2") String attr2) {
ModelAndView mav = new ModelAndView("success.jsp");
return mav;
}
}
index方法返回一个ModelAndView其中包括视图index.jsp和两个键值放在model中,在没有加入@SessionAttributes注解的时候,放入model当中的键值是request级别的。
现在因为在Controller上面标记了@SessionAttributes(value={"attr1", "attr2"})那么model中的attr1, attr2会同步到session中,这样访问index然后再去访问index2的时候也会获取这两个属性的值。
当需要清除session中的值的时候,我们只需要在controller的方法中传入一个SessionStatus的类型对象,通过调用setComplete方法就可以清除了。
@RequestMapping(params="method=index3")public ModelAndView index4(SessionStatus status) {
ModelAndView mav = new ModelAndView("success.jsp");
status.setComplete();
return mav;
}
另外,@SessionAttribute注解只能在类上使用,不能在方法上使用。
(2)ModelAttribute
该注解有两个用法,一个是用于方法上,一个是用于参数上;
用于方法上时:通常用来在处理@RequestMapping之前,为请求绑定需要从后台查询的model;
用于参数上时:用来通过名称对应,把相应名称的值绑定到注解的参数bean上;
要绑定的值来源于:
A) @SessionAttributes启用的attribute对象上;
B) @ModelAttribute用于方法上时指定的model对象;
C) 上述两种情况都没有时,new一个需要绑定的bean对象,然后把request中按名称对应的方式把值绑定到bean中。
- @ModelAttribute用在参数上:
@RequestMapping("/hello")public ModelAndView hello(@ModelAttribute Account account) {
acount.setAge(12);
account.setName("456");
return new ModelAndView("hello");
}
注解在方法参数上的@ModelAttribute说明了该方法的值将由model中取得。如果model中找不到,那么该参数会先被实例化,然后被添加到model中。在model中存在以后,请求中所有名称匹配的参数都会填充到该参数中。这在Spring MVC中被称为数据绑定,一个非常有用的特性,节约了每次都需要手动从表格数据中转换这些字段数据的时间。
- @ModelAttribute用在方法上:
方法通过返回值的方式默认地将添加一个属性。属性名没有被显式指定的时候,框架将根据属性的类型给予一个默认名称。例如:本例返回一个Account类型的对象,则默认的属性名为"account",你可以通过设置@ModelAttribute注解的值来改变默认值。
@ModelAttributepublic Account addAccount(@RequestParam(value = "name", defaultValue = "test") String name) {
Account ac = new Account();
ac.setName(name);
ac.setAge(12);
return ac;
}
参考文章:
https://blog.csdn.net/ztchun/article/details/84073120
以上是 SpringBoot参数绑定注解详解及其使用场景 的全部内容, 来源链接: utcz.com/z/511558.html