SpringMVC的请求处理
目录
请求映射路径的配置
请求数据的接收
接收Restful风格的数据
什么是Restful风格?
接收上传文件
JavaWeb常用对象获取
请求静态资源
注解驱动标签
请求映射路径的配置
- 请求映射路径的配置主要是通过@RequestMapping注解实现的
-
相关注解 作用 使用位置 @RequestMapping 设置控制器方法访问路径的资源,可以接收任何请求 方法和类上 @GetMapping 设置控制器方法访问路径的资源,可接收GET请求 方法和类上 @PostMapping 设置控制器方法访问路径的资源,可接收Post请求 方法和类上
请求数据的接收
参数的接收在JavaWeb后端SpringBoot专栏已经进行了学习,此处就不再赘述。感兴趣可以去我主页对应专栏进行阅读。主页传送门:内容管理-CSDN创作中心
-
接收Restful风格的数据
-
什么是Restful风格?
- Rest(表象化状态转变/表述性状态转变),在2000年被提出,基于HTTP,URI,xml,JSON等标准和协议,支持轻量级、跨平台、跨语言架构设计。是Web服务的一种新网络应用程序的设计风格和开发方式。
- 常用规则
- 用URI表示某个模块资源,资源名称为名词:
-
模块 URI资源
用户模块user http://localhost/user 商品模块product http://localhost/product 账户模块account http://localhost/account 日志模块log http://localhost/log
- 用HTTP响应状态码表示结果,国内常用的响应包括三部分:状态码、状态信息、响应数据
- Restful风格参数是通过路径参数进行传递的,具体可以参照文章:请求响应-路径参数的接收_保持敬畏的博客-CSDN博客
-
接收上传文件
- 接收上传文件的数据,文件上传的表单有一定的要求:如下
- 表单的提交方式必须是POST
- 表单的enctype属性必须是,multipart/form-data
- 文件上传需要name属性
- 具体可以参照文章:SpringBoot案例-文件上传_保持敬畏的博客-CSDN博客
- 虽然使用了不同的框架但是对于原理介绍是一样的。
-
获取headers头信息和cookie信息
- 接收Http请求头数据,接受指定名称的数据头
-
package com.example.Controller;import com.example.Service.Service01; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping;import java.util.Map;@Controller public class Controller01 {@Autowiredprivate Service01 service01;@RequestMapping("/show")// 获取指定请求头信息public String show(@RequestHeader("Accept-Encoding") String requestHeader) {System.out.println(requestHeader);return "/index.jsp";}@RequestMapping("/show1")// 获取所有请求头信息public String show1(@RequestHeader Map<String, String> requestHeader) {requestHeader.forEach((k, v) -> {System.out.println(k + "====" + v);});return "/index.jsp";} }
- 启动web服务器后就可以,请求对应的路径
- 请求show路径,终端输出
- 请求show1
- 终端输出
- 获取客户端携带的Cookie数据
- 关键代码如下
-
package com.example.Controller;import com.example.Service.Service01; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.CookieValue; import org.springframework.web.bind.annotation.RequestMapping;@Controller public class Controller01 {@Autowiredprivate Service01 service01;@RequestMapping("/show")// 获取Cookie信息public String show(@CookieValue(value = "JSESSIONID", defaultValue = "") String requestHeader) {System.out.println(requestHeader);return "/index.jsp";}}
JavaWeb常用对象获取
JavaWeb常用对象就是HttpServletRequest request和HttpServletResponse response,方法中要调用上述参数直接在方法的形参位置写入即可,SpringMVC框架在接收到请求后就会主动的将参数注入,具体代码如下
运行结果如下
请求静态资源
- 在web服务器内部默认配置了一个defaul的tServlet,其匹配路径为“/”,该Servlet具备访问服务器中静态资源的能力,但是当我们自己配置一个DispatcherServlet时,如果设置的访问路径也是“/”那么就会对其进行覆盖,就无法访问到服务器中的静态资源。(上述是为什么不能访问到静态资源的原理)
- 解决方法一(spring的方式)
- 将default的servlet的匹配路径更加精确一点
- servlet的url-pattern匹配优先级时:精确匹配>目录匹配>拓展名匹配>缺省匹配
- 解决方法二(SpringMVC框架中的方法)
- 在SpringMVC框架的配置文件中去设置静态资源的映射关系
- 解决方法三(SpringMVC框架中的方法)
- 在SpringMVC框架的配置文件中去注册一个DefaultServletHttpRequestHandler处理器,静态资源由该处理器去处理,该方法也是使用最多的。
注解驱动<mvc:annotation-driven>标签
- 存在的问题,我们在上述解决方法三中,使用的注解,其底层代码的实现会相Spring容器中注入一个SimpleUrlHandlerMapping,该类继承了HandlerMapping
- 由此Spring就不会默认自动加载该RequestMappingHandlerMapping,那么就会造成框架无法解析注解中的路径,以及实现路径与资源的映射。要解决上述问题,就需要人为的在SpringMVC框架中注册上述HandlerMapping
- 由此可以完美解决上述问题
但是在Spring框架中,可以将上述配置以及各种配置浓缩为一个简单的配置标签,那就是mvc的注解驱动,该标签内会帮我们注册RequestMappinghandlerMapping、注册RequsestingMappingHandlerAdapter并注入JSON消息转换器等,上述配置就可以简化为一下配置
ps:上述标签在不同版本的Spring框架中帮我们注册的组件不同。