获取请求参数汇总
导读
-
通过前面对JavaWEB和SpringMVC的学习,有通过servletAPI的,也有通过注解的
-
分为五类
① 注解
② Servlet原生API
③ 复杂参数
④ 实体类映射
⑤ 方法参数名与请求中的参数名保持一致
一、注解
-
获取参数的注解汇总表
注解 使用场景 1 @PathVariable 作用于RestFul风格的请求,标注在对应的方法参数前
可以获取单个参数,也可以获取所有参数的Map2 @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 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 { // 针对该方式的矩阵变量<a href="/cars/sell;low=34;brand=byd,audi,yd">获取参数测试</a> @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; } // 针对该方式的矩阵变量 <a href="/boss/1;age=20/2;age=10">获取请求参数测试</a> @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