获取请求参数汇总
导读
-
通过前面对JavaWEB和SpringMVC的学习,有通过servletAPI的,也有通过注解的 -
分为五类 ① 注解 ② Servlet原生API ③ 复杂参数 ④ 实体类映射 ⑤ 方法参数名与请求中的参数名保持一致
一、注解
-
获取参数的注解汇总表
| 注解 | 使用场景 |
---|
1 | @PathVariable | 作用于RestFul风格的请求,标注在对应的方法参数前 可以获取单个参数,也可以获取所有参数的Map | 2 | @RequestHeader | 获取请求头 | 3 | @RequestParam | 对普通风格请求中参数的获取,即queryString查询字符串 | 4 | @CookieValue | 有的请求可能没有cookie,会报错 | 5 | @RequestBody | 只有post请求有请求体 | 6 | @RequestAttribute | 和@RequestParam用法一样, 用于获取存在request作用域中的数据 |
-
@PathVariable测试 可以获取单个参数,也可以获取所有参数的Map html <a href="/car/2/owner/zhangsan">获取请求参数测试</a>
controller @RestController
public class ParamsTestController {
@GetMapping("/car/{id}/owner/{username}")
public Map<String,Object> restfulTest(@PathVariable("id") Integer id,
@PathVariable("username") String username,
@PathVariable Map<String,String> pv) {
Map<String, Object> map = new HashMap<>();
map.put("id",id);
map.put("username",username);
map.put("pv",pv);
return map;
}
}
Browser响应结果 -
@RequsetHeader测试 html <a href="/car/2/owner/zhangsan">获取请求参数测试</a>
controller @RestController
public class ParamsTestController {
@GetMapping("/car/{id}/owner/{username}")
public Map<String,Object> restfulTest(
@RequestHeader("User-Agent") String userAgent,
@RequestHeader Map<String,String> rh
) {
Map<String, Object> map = new HashMap<>();
map.put("userAgent",userAgent);
map.put("rh",rh);
return map;
}
}
Browser响应结果 -
@RequestParam测试 对普通风格请求中参数的获取 html <a href="/car/2/owner/zhangsan?age=18&inters=basketball&inters=game">获取请求参数测试</a>
controller @RestController
public class ParamsTestController {
@GetMapping("/car/{id}/owner/{username}")
public Map<String,Object> restfulTest(
@RequestParam("age") Integer age,
@RequestParam Map<String,String> rp
) {
Map<String, Object> map = new HashMap<>();
map.put("age",age);
map.put("rp",rp);
return map;
}
}
Browser响应结果 -
@CookieValue测试 @RestController
public class ParamsTestController {
@GetMapping("/car/{id}/owner/{username}")
public Map<String,Object> restfulTest(
@CookieValue("_ga") String _ga,
@CookieValue Cookie cookie
) {
Map<String, Object> map = new HashMap<>();
map.put("_ga",_ga);
map.put("cookie",cookie);
return map;
}
}
二、矩阵变量@MatrixVariable
-
书写规则 <a href="/car/sell;low=34;brand=byd,audi,yd">获取请求参数测试</a>
<a href="/car/sell;low=34;brand=byd;brand=audi;brand=yd">获取请求参数测试</a>
<a href="/boss/1;age=20/2;age=10">获取请求参数测试</a>
-
SpringBoot对矩阵变量默认是不生效的 SpringBoot的web场景的底层是SpringMVC,SpringMVC的自动配置组件WebMvcAutoConfiguration中路径匹配配置方法中,调用了调用了UrlPathHelper对象 public void configurePathMatch(PathMatchConfigurer configurer) {
if (servletUrlMapping.equals("/") && this.singleDispatcherServlet()) {
UrlPathHelper urlPathHelper = new UrlPathHelper();
urlPathHelper.setAlwaysUseFullPath(true);
configurer.setUrlPathHelper(urlPathHelper);
}
});
}
在UrlPathHelper类中,有一个属性是removeSemicolonContent=true,因为其作用是移除分号后的内容,故无法匹配矩阵变量 -
如何可以识别矩阵变量 需要更改SpringMVC的配置,需要让自己创建的配置类实现 WebMvcConfigurer接口,然后重写configurePathMatch方法,设置removeSemicolonContent=false,并重置UrlPathHelper @Configuration(proxyBeanMethods = false)
public class MyConfig implements WebMvcConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
UrlPathHelper urlPathHelper = new UrlPathHelper();
urlPathHelper.setRemoveSemicolonContent(false);
configurer.setUrlPathHelper(urlPathHelper);
}
}
-
获取矩阵变量的controller @RestController
public class MatrixTest {
@GetMapping("/cars/{path}")
public Map<String,Object> matrixTest(
@MatrixVariable("low") Integer low,
@MatrixVariable("brand") List<String> brand,
@PathVariable("path") String path) {
Map<String, Object> map = new HashMap<>();
map.put("low",low);
map.put("brand",brand);
map.put("path",path);
return map;
}
@GetMapping("/boss/{bossId}/{empId}")
public Map<String,Object> matrixTest1(
@MatrixVariable(value = "age",pathVar = "bossId") Integer bossId,
@MatrixVariable(value = "age",pathVar = "empId") Integer empId ) {
Map<String, Object> map = new HashMap<>();
map.put("bossId",bossId);
map.put("empId",empId);
return map;
}
}
-
浏览器响应结果
三、错误
-
Required matrix variable ‘path’ for method parameter type String is not present -
解决方法 ① 需要使用{path}来接收矩阵变量类型的请求参数 ② 路径类型的请求参数需要使用注解@PathVariable
参考资料
- SpringMVC三:获取请求参数_e_nanxu的博客-CSDN博客
|