说明:本节内容全部都是关于SpringMVC的
1.基本参数注解
下面我们常用的这些注解:
- @PathVariable(路径变量)
- @RequestHeader(获取请求头)
- @RequestParam(获取请求参数)
- @CookieValue(获取cookie值)
- @RequestBody(获取请求体[POST])
- @RequestAttribute(获取request域属性)
- @MatrixVariable(矩阵变量)
首先,来看一下 @RequestAttribute
注解
@RequestAttribute和@RequestParam
首先,这个Spring MVC注解@RequestAttribute
类似于@RequestParam
,但既然分开作为两个注解,那就肯定是有所不同的
@RequestAttribute
注解的参数在项目里是自己解析出来的,并不是前端传递的。具体一点,在项目里的拦截器里会对Token信息进行解析,解析出来的参数重新放在请求里 (用httpServletRequest.setAttribute(name, value)),后边接口接收参数时就用这个注解。
@RequestParam
注解则表示这个参数是通过前端传递过来的,如果请求里没有这个参数,则会报错400 Bad Request。这个注解用来解析请求路径里的参数(get请求)或者post请求中form表单格式的请求参数
@MatrixVariable 矩阵变量
在页面开发的时候,cookie
禁用了,session
里面的内容怎么使用( 因为使用session需要获取cookie
中的 sessionid ,所以一旦禁用了cookie
就无法正常使用session
了 )
SpringBoot 默认是禁用了矩阵变量的功能,需要我们手动开启
对于路径的处理,要通过UrlPathHelper进行解析,而在UrlPathHelper中setRemoveSemicolonContent
移除分号内容,默认是true
的
/**
* Set if ";" (semicolon) content should be stripped from the request URI.
* <p>Default is "true".
*/
public void setRemoveSemicolonContent(boolean removeSemicolonContent) {
checkReadOnly();
this.removeSemicolonContent = removeSemicolonContent;
}
所以我们需要在自己的配置类中重新实现WebMvcConfigurer的该方法(两种方式)
@Bean
public WebMvcConfigurer webMvcConfigurer(){
return new WebMvcConfigurer() {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
UrlPathHelper urlPathHelper=new UrlPathHelper();
//不移除分号;后面的内容,矩阵变量可以生效
urlPathHelper.setRemoveSemicolonContent(false);
configurer.setUrlPathHelper(urlPathHelper);
}
};
}
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
UrlPathHelper urlPathHelper=new UrlPathHelper();
//不移除分号;后面的内容,矩阵变量可以生效
urlPathHelper.setRemoveSemicolonContent(false);
configurer.setUrlPathHelper(urlPathHelper);
}
@PathVariable路径变量
@PathVariable
用于将请求URL中的模板变量映射到功能处理方法的参数上
例如:
public Map<String,Object> getCar(@PathVariable("id") Integer id,
@PathVariable("username") String name)
它自动将URL中模板变量 {id} 和 {username} 绑定到参数中去。
@RequestHeader 请求头
@RequestHeader
用于将请求的头信息区数据映射到功能处理方法的参数上
例如:
public String test(
@RequestHeader("User-Agent") String userAgent,
@RequestHeader(value="Accept") String[] accepts)
如上配置将自动将请求头“User-Agent”值入参到 userAgent 参数上,并将“Accept”请求头值入参到 accepts 参数上。
@RequestHeader
也拥有和@RequestParam
相同的三个参数,含义一样。
@CookieValue 获取cookie值
@CookieValue
用于将请求的 cookie 数据映射到功能处理方法的参数上
例如:
public String test(@CookieValue(value="JSESSIONID", defaultValue="") String sessionId)
如上配置将自动将 JSESSIONID 值入参到 sessionId 参数上,defaultValue表示 cookie 中没有 JSESSIONID 时默认为空。
@RequestBody 请求体
@RequestBody
注解用来接收POST请求BODY里的参数,格式为JSON格式。
2.复杂参数
我们在传入参数的时候,除了上面的这些注解,有时候我们还会传入一些不一样的参数,例如HttpServletRequest
,还有Map
、Model
这些,以及我们自己定义的对象(可以用 list 集合)也都是可以接收到的。
(事实上,你往map,model里面添加数据,其实就是往request域中加数据了)