这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战
请求参数处理
请求映射
之前我们定义路径使用getUser这种风格的,但是当路径多了之后就会显得十分麻烦,现在我们使用新的风格去开发,Rest的方式(使用HTTP请求方式动词来表示对资源的操作)
例如
/user GET-获取用户 DELETE-删除用户
多余的我们就不展示了,就简单举两个例子
@RequestMapping(value = "/user",method = RequestMethod.GET)
public String getUser(){
return "GET-用户";
}
@RequestMapping(value = "/user",method = RequestMethod.POST)
public String saveUser(){
return "POST-用户";
}
复制代码
因为不想写前端页面了,所以直接使用Postman进行测试,效果都是一样的
可以看我们的路径是一样的,但是我们请求的方式不同,我们的得到的反馈就不同
如果是写页面测试的小伙伴,可能会遇到一个问题,就是除了get和post这两种方式好使以外,其他的请求方式不好使,这时候在method="post"
,下面再加上一个隐藏参数,<input name="_method" type="hidden" type="xxx"
,这样子做就可以了
当我们使用不同方式请求的时候,就会显得很麻烦,他就有一种新的注解@GetMapping("/user")
映射原理
SpringBoot自动配置欢迎页的 WelcomePageHandlerMapping。访问/能访问到index.html;
SpringBoot自动配置了默认的 RequestMapping
请求进来,挨个尝试所有的HandlerMapping看是否有请求信息。
- 如果有就找到这个请求对应的handler ...如果有就找到这个请求对应的处理器
- 如果没有就是下一个 HandlerMapping ...如果没有就是下一个处理映射
我们需要一些自定义的映射处理,我们也可以自己给容器中放HandlerMapping。
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
if (this.handlerMappings != null) {
for (HandlerMapping mapping : this.handlerMappings) {
HandlerExecutionChain handler = mapping.getHandler(request);
if (handler != null) {
return handler;
}
}
}
return null;
}
复制代码
普通参数
我们传参的方式主要有四种
注解
使用@RequestParam
,我们可以通过路径的方式去获取信息
@GetMapping("/car/{id}")
public Map<String,Object> getCar(@PathVariable("id") Integer id){
Map<String,Object> map = new HashMap<>();
map.put("id",id);
return null;
}
复制代码
其中的ID我们就可以通过指定的路径去获取
我们可以这样一个一个去获取值,也可以使用一个Map,都收集起来
@GetMapping("/car/{id}/owner/{username}")
public Map<String,Object> getCar(@PathVariable("id") Integer id,
@PathVariable("username") String name,
@PathVariable Map<String,String> pv){
Map<String,Object> map = new HashMap<>();
map.put("id",id);
map.put("name",name);
map.put("pv",pv);
return map;
}
复制代码
我们的测试工具还是postman
小插曲
postman官网下载地址
www.postman.com/downloads/
postman汉化包
github.com/hlmd/Postma…
我们只需要将汉化包放在postman的文件夹下
C:\Users\79367\AppData\Local\Postman\app-9.1.5\resources
上面是我的路径
回归正题,我们可以使用注解去获取请求头
@GetMapping("/car/{id}/owner/{username}")
public Map<String,Object> getCar(@PathVariable("id") Integer id,
@PathVariable("username") String name,
@PathVariable Map<String,String> pv,
@RequestHeader("User-Agent") String userAgent,
@RequestHeader Map<String,String> herder){
Map<String,Object> map = new HashMap<>();
map.put("id",id);
map.put("name",name);
map.put("pv",pv);
map.put("userAgent",userAgent);
map.put("headers",herder);
return map;
}
复制代码
使用HttpServletRequest request
可以将信息传到域中
@GetMapping("/goto")
public String geto(HttpServletRequest request){
request.setAttribute("msg","111");
return "s";
}
复制代码