【Spring Boot】Web开发请求参数处理

网友投稿 731 2022-10-01

【Spring Boot】Web开发请求参数处理

【Spring Boot】Web开发请求参数处理

文章目录

​​请求参数处理​​

​​一、请求映射​​

​​1.Rest风格使用与原理​​​​2.请求映射原理​​​​3.普通参数与基本注解​​

​​3.1 注解​​

​​@PathVariable 路径变量​​​​@RequestHeader 获取请求头信息​​​​@RequestParam 获取请求参数​​​​@RequestBody 获取请求体​​​​@RequestAttribute 获取request域属性​​​​@MatrixVariable 矩阵变量​​

​​3.2 支持Servlet API​​​​3.3 复杂参数​​

请求参数处理

一、请求映射

1.Rest风格使用与原理

@xxxMapping;常用注解Rest风格支持(使用HTTP请求方式动词来表示对资源的操作)

以前:/getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveUser 保存用户,大都使用象征意义名称来发送请求现在: /user GET-获取用户 DELETE-删除用户 PUT-修改用户 POST-保存用户,统一对user用户操作,通过不同的请求方式来区分对于资源的操作核心Filter;HiddenHttpMethodFilter

用法: 表单method=post,隐藏域 _method=put

SpringBoot中手动开启扩展:如何把_method 这个名字换成我们自己喜欢的。

创建表单,进行四中REST风格的请求方式测试:

可以发现后面的delete、put请求方式最终都是实现的get方式?!也就是默认的方式中不支持delete、put形式的请求,这里我们需要配置HiddenHttpMethodFilter进行请求的处理~进入底层源码,可以发现:

同时,深入底层我们可以看到:

Rest原理(表单提交要使用REST的时候)

表单提交会带上_method=PUT请求过来被HiddenHttpMethodFilter拦截

请求是否正常,并且是POST

在我们使用表单提交用REST的时候,需要设定为POST请求形式,并且同时设定一个 _method 参数

对于REST风格的请求,我们可以使用更加简便的注解,如下:

@RestControllerpublic class WebController { @RequestMapping("/傍晚.jpg") @ResponseBody public String test01(){ return "您好!"; } //@RequestMapping(value = "/user",method = RequestMethod.GET) @GetMapping("/user") public String getUser(){ return "GET-张三"; } //@RequestMapping(value = "/user",method = RequestMethod.POST) @PostMapping("/user") public String saveUser(){ return "POST-张三"; } //@RequestMapping(value = "/user",method = RequestMethod.PUT) @PutMapping("/user") public String putUser(){ return "PUT-张三"; } //@RequestMapping(value = "/user",method = RequestMethod.DELETE) @DeleteMapping("/user") public String deleteUser(){ return "DELETE-张三"; }}

扩展:修改_method参数

_method 参数是Spring Boot 内部默认配置的常量,常量不可更改,但是配置了set方法供我们修改。

package com.zyx.boot.demo.config;import org.springframework.context.annotation.Configuration;import org.springframework.web.filter.HiddenHttpMethodFilter;@Configuration(proxyBeanMethods = false)public class WebConfig { // 自定义配置- public HiddenHttpMethodFilter hiddenHttpMethodFilter(){ HiddenHttpMethodFilter methodFilter = new HiddenHttpMethodFilter(); methodFilter.setMethodParam("_m"); return methodFilter; }}

​​返回顶部​​

2.请求映射原理

1.SpringMVC功能分析都从 org.springframework.web.servlet.DispatcherServlet - > doDispatch()

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { HttpServletRequest processedRequest = request; HandlerExecutionChain mappedHandler = null; boolean multipartRequestParsed = false; WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request); try { ModelAndView mv = null; Exception dispatchException = null; try { processedRequest = checkMultipart(request); multipartRequestParsed = (processedRequest != request); // 找到当前请求使用哪个Handler(Controller的方法)处理 mappedHandler = getHandler(processedRequest);

2.底层还有个HandlerMapping(处理器映射 / * * —> xxx方法),存储有 请求-处理方法 的映射信息,默认有5个HandlerMapping:

3.拿欢迎页来看:它会匹配 / 路径下的 index.html 文件

4.RequestMappingHandlerMapping:保存了所有@RequestMapping 和handler的映射规则。

5.所有的请求映射都在HandlerMapping中。

如果有就找到这个请求对应的handler如果没有就是下一个 HandlerMapping

如果需要一些自定义的映射处理,也可以自己给容器中放HandlerMapping。

​​返回顶部​​

3.普通参数与基本注解

3.1 注解

@PathVariable、@RequestHeader、@RequestAttribute、@RequestParam、@MatrixVariable、@CookieValue、@RequestBody

@PathVariable 路径变量

@RequestHeader 获取请求头信息

@RequestParam 获取请求参数

注意:在获取所有参数的时候interests这一参数的值仅获取第一个!

@RequestBody 获取请求体

@RequestAttribute 获取request域属性

用于页面转发的时候可以取出当前页面的某些属性信息,这里使用 forward:/xxx 来模拟页面的跳转(转发请求),并且通过原生的request来设定、获取参数。

注意使用的是@Controller注解,不能使用@RestController()!!!

原因:@RestController 主要是针对数据接口使用应为它标注了@Controller和@ResponseBody注解,而@Controller主要实现静态URL的映射和使用@Component实现Java类的注入。由于有了@ResponseBody注解,则会将return的内容当做文本显示,覆盖了forward的转发请求功能!!!

@MatrixVariable 矩阵变量

/cars/{path}xxx=xxx&aaa=ccc querystrig 查询字符串。@RequestParam:获取请求参数的形式去获取

/cars/{path;low=34; brand=byd,udi,yd} (寻找汽车中大于34万,品牌在byd,udi,yd中的)使用 ;表示使用矩阵变量形式获取

注意:

页面开发中, cookie禁用了, session里面的内容怎么使用?通常情况下的流程:session.set(a,b) —> jsessionid —> cookie —>每次发请求携带。ur1重写: /abc; jsesssionid=xxxx 把 cookie的值使用矩阵变量的方式进行传递

/cars/sell;low=34;brand=byd,audi,yd 形式:

1、语法: 请求路径:/cars/sell;low=34;brand=byd,audi,yd @GetMapping("/cars/{path}")2、SpringBoot默认是禁用了矩阵变量的功能 底层 UrlPathHelper() 中: private boolean removeSemicolonContent = true; (移除分号内容)就不支持矩阵变量的3、矩阵变量必须有url路径变量才能被解析

变式:/boss/1;age=20/2;age=10

同变量名,不同路径下;,利用 pathVar 参数指定所属路径

这里就是利用bossId指明boss的年龄矩阵变量;empId指明emp的年龄矩阵变量。

​​返回顶部​​

3.2 支持Servlet API

WebRequest、ServletRequest、MultipartRequest、 HttpSession、javax.servlet.可以解析上面的部分参数:

@Overridepublic boolean supportsParameter(MethodParameter parameter) { Class paramType = parameter.getParameterType(); return (WebRequest.class.isAssignableFrom(paramType) || ServletRequest.class.isAssignableFrom(paramType) || MultipartRequest.class.isAssignableFrom(paramType) || HttpSession.class.isAssignableFrom(paramType) || (pushBuilder != null && pushBuilder.isAssignableFrom(paramType)) || Principal.class.isAssignableFrom(paramType) || InputStream.class.isAssignableFrom(paramType) || Reader.class.isAssignableFrom(paramType) || HttpMethod.class == paramType || Locale.class == paramType || TimeZone.class == paramType || ZoneId.class == paramType);}

在测试@RequestAttribute 获取request域属性的时候,就使用了传入原生的servlet做参数,对应的就是利用上面的supportsParamete参数解析器

整个过程中是遍历各种解析器进行参数解析判断:

当匹配到 ServletRequestMethodArgumentResolver 解析器时,步骤如下:

最终经过处理返回request对象~

​​返回顶部​​

3.3 复杂参数

Map、Model(map、model里面的数据会被放在request的请求域 request.setAttribute)、Errors/BindingResult、RedirectAttributes( 重定向携带数据)、ServletResponse(response)、SessionStatus、UriComponentsBuilder、ServletUriComponentsBuilder

map、model里面的数据会被放在request的请求域Map、Model类型的参数,会返回 mavContainer.getModel();—> BindingAwareModelMap 是Model 也是Map

mavContainer.getModel(); 获取到值的

​​​返回顶部​​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:熔断机制
下一篇:答题小程序怎么随机发题目(可以随机出题的小程序)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~