参数绑定
-
handler method 参数绑定常用的注解,我们根据他们处理的Request的不同内容部分分为四类:
- A、处理requet uri 部分(这里指uri template中variable,不含queryString部分)的注解: @PathVariable;
- B、处理request header部分的注解: @RequestHeader, @CookieValue;
- C、处理request body部分的注解:@RequestParam, @RequestBody;
- D、处理attribute类型是注解: @SessionAttributes, @ModelAttribute;
-
@RequestParam注解接收的参数来自于reuqestHeader中,即请求头,也就是url中
@RequestBody注解接收的参数来自于requestBody中,即请求体中
-
如果为get请求,后台接收参数注解应该为RequestParam,post请求,后台接收参数注解就是RequestBody
@RequestParam
主要用于将请求参数区域的数据映射到控制层方法的参数上
-
参数
-
value:请求中传入参数的名称,如果不设置后台接口的vaue值,则默认为该变量名
-
required:是否必须传该参数,默认为true。如果不传,会报404错误。如果为false,当请求中没有此参数,会默认为null,对于基本类型变量,必须有值,此时报空指针错误。如果允许空值,则接口变量要用包装类来声明
-
defaultValue:没有同名参数,则默认值为此值,默认值可以使用SpEL表达式
-
-
如果请求的参数为多个同名参数,比如:
url?userName=zhi&userName=holley
此时传入的数据格式为“zhi,holley”,即多个数据使用逗号隔开,在后台接口中可以使用数组或List类型的变量来接受,如:
@RequestParam(value="userName") String[] userNames
或@RequestParam(value="list") List<String> list
-
前端传
url?id=1&name=
@RequestBody
该注解用来处理Content-Type为application/json, application/xml等内容
@PathVariable
接受请求路径中占位符的值,参数值需要在url中进行占位
前端传url=url/{id}/{name}
后端为@PathVariable long id,@PathVariable String name
如果方法参数名称和需要绑定的uri tempate中的变量名称不一样,则需要在@PathVariable(“name”)指定uri template名称
@RequestHeader
可以把Request请求header部分的值绑定到方法的参数上
这是一个Request的header部分
Host localhost:8080
Accept text/html,application/xhtml+xml,application/xml;q=0.9
Accept-Language fr,en-gb;q=0.7,en;q=0.3
Accept-Encoding gzip,deflate
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive 300
@RequestHeader(Accept-Encoding) String encoding
@CookieValue
可以把Request header中关于cookie的值绑定到方法的参数上
例如有以下Cookie值
JSESSIONID=415A4AC178C59DACE0B2C9CA727CDD84
@CookieValue("JSESSIONID") String cookie
@SessionAttributes
该注解用来绑定HttpSession中的attribute对象的值,便于在方法的参数里使用
该注解有vaue、types两个属性,可以通过名字和类型来指定要使用的attribute对象
- 若希望多个请求之间共用数据,则可以在控制器上标注一个@SessionAttributes,配置需要在session中存放的数据范围,
- @SessionAttributes只能使用在类定义上,一般作用于处理器类上,用于在多个请求之间传递参数,类似于Session的Attribute,但不完全一样,一般来说@SessionAttributes设置的参数只用于暂时的传递,而不是长久的保存,长期保存的数据还是放到Session中
- 除了可以通过属性名指定需要放在会话中的属性外,还可以通过模型属性的对象类型指定哪些模型属性需要放在会话中
- value和type是交集关系
@ModelAttribute
该注解有两个用法,一个是用于方法上,一个是用于参数上;
- 用于方法上时: 通常用来在处理@RequestMapping之前,为请求绑定需要从后台查询的model;
// Add one attribute
// The return value of the method is added to the model under the name "account"
// You can customize the name via @ModelAttribute("myAccount")
@ModelAttribute
public Account addAccount(@RequestParam String number) {
return accountManager.findAccount(number);
}
这种方式实际的效果就是在调用@RequestMapping的方法之前,为request对象的model里put(“account”, Account);
- 用于参数上时: 用来通过名称对应,把相应名称的值绑定到注解的参数bean上;要绑定的值来源于:
A) @SessionAttributes 启用的attribute 对象上;
B) @ModelAttribute 用于方法上时指定的model对象;
C) 上述两种情况都没有时,new一个需要绑定的bean对象,然后把request中按名称对应的方式把值绑定到bean中。
@RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST)
public String processSubmit(@ModelAttribute Pet pet) {
}
首先查询 @SessionAttributes有无绑定的Pet对象,若没有则查询@ModelAttribute方法层面上是否绑定了Pet对象,若没有则将URI template中的值按对应的名称绑定到Pet对象的各属性上。
地址映射
@RequestMethod
RequestMethod是一个用来处理请求地址映射的注解,可用于类或方法上,用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径
-
属性说明
-
value:指定请求的实际地址,指定的地址可以是URI Template模式
普通具体值、含有某变量的一类值、含正则表达式的一类值
-
method:指定请求的method类型,GET、POST、PUT、DELETE
-
consumes:指定处理请求的提交内容类型,例如application/json,text/html
-
produces:指定返回的内容类型,仅当request请求头中的Accept类型中包含该指定类型才返回
-
params:指定request中必须包含某些参数值,才让该方法处理
@RequestMapping(value="/{petId}",method=RequestMethod.GET,params="myParam=myValue")
仅处理请求中包含了名为“myParam”,值为“myValue”的请求
-
headers:指定request中必须包含某些指定的header值,才让该方法处理
@RequestMapping(value="/spets",method=RequestMethod.GET,headers="Referer=http://url")
仅处理request的header中包含了指定"Refer"请求头和对应值为”http://url“的请求
-