SpringWeb
SpringWeb 简介
SpringWeb 是 spring 框架中的一个模块。基于原生的 Servlet ,提供了一个前端控制器 DispatcherServlet ,开发者无须额外开发控制器对象
springWeb 是 Spring 框架中的一部分,是对 web 层进行封装。目前是企业开发首选。
注解标签
@RestController
@RestController 用于标记在一个类上,使用它标记的类就是一个SpringWEB控制器类.
表示类由 spring 管理
Spring 配置中指定了 自动扫描 的 包地址 后,Spring 会扫描这些包以及子包中的使用了@RestController 标识的类,然后将类加入到 Spring IOC 容器中,注入依赖。
@RequestMapping
@RequestMapping 是一个用来为处理器添加 地址映射的注解
配置在类上 :path 不可重复
配置在方法上 :
path 类内不可重复, value 与 path 意义相同,均能配置路径
method : 限制能请求的类型 类型不同跳出错误 405-方法不允许
@RequestMapping(path = "/test",method = RequestMethod.POST)
SpringWEB 组件和运行流程
组件介绍
前端控制器:DispatcherServlet 由框架提供,在web.xml 中配置。
作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理用户的请求.
处理器映射器:HandlerMapping 由框架提供。
作用:根据请求的 url 查找 Handler(处理器/Controller)
拦截器:Interceptor,
作用:若配置可过滤请求,不配置无影响。
处理器适配器:HandlerAdapter 由框架提供。
作用:按照特定规则(HandlerAdapter 要求的规则)去执行 Handler。
处理器:Handler 由程序员编写
注意:编写 Handler 时按照 HandlerAdapter 的要求去做,这样适配器才可以去正确执行 Handler。
作用:接受用户请求信息,调用业务方法处理请求,也称之为后端控制器。
SpringWeb 运行流程
- 请求进入到 DispatcherServlet 统一进行拦截,再调用其他其他程序处理。
- 调用 HandlerMapping(处理器映射器),解析请求中处理器的地址和方法地址,判断地址是否存在。不存在返回404,存在的话判断是否有拦截器,有拦截器进入到拦截器。
- 回到 DispatcherServlet,再调用 HandlerAdapter(处理器适配器)。
- 最终由处理器适配器调用 Handler(处理器)。
SSM 项目导入 Spring web
导入SpringWeb依赖
<!-- spring web 层依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!-- servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
web.xml配置 Spring 核心请求分发器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 配置 DispatcherServlet -->
<servlet>
<servlet-name>application</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<!-- 映射所有请求到 DispatcherServlet -->
<servlet-mapping>
<servlet-name>application</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
Spring 全局配置文件添加 Web
xmlns:mvc="http://www.springframework.org/schema/mvc"
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
<!--开启 spring web 注解标签-->
<mvc:annotation-driven></mvc:annotation-driven>
获取请求数据
接收参数
方法一:
参数中加入
HttpServletRequest :接收参数
HttpServletResponse :传回参数
方法二:spring自动封装
参数中加入类型: (请求的参数名 和 接收的名字一致)
@RequestMapping(path = "/login")
public String login(Integer id,String name){
...
}
方法三:封装成类
将传入的参数封装成类。可以为多个,按从左到右开始接收。
@RequestMapping(path = "/login")
public String login(Admin admin,String token){
...
}
方法四:注释标签
- @RequestParam(" ") 将 请求体 中值传给参数
@RequestMapping(path = "/login")
public String login(@RequestParam("userName") String name)
- @RequestHeader(" ") 将 请求头 中值传给参数
@RequestMapping(path = "/login")
public String login(@RequestHeader("user-Name") String name)
@RequestBody 接收 JSON 格式数据
JSON格式: {“account”:“1”,“password”:“1”}
JSON依赖
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.14.2</version>
</dependency>
@RequestBody
@RequestBody(" ") 前端向后端传 JSON 格式数据格式,后端接收时使用。
public String login(@RequestBody Admin admin){
...
}
@RestControllen 与json
@RestControllen 中包含原本Controllen 的功能和 json 转化功能的 @RequestBody。
后端向前端传 JSON 格式时,由于有@RestControllen 所以会自动转为JSON格式。
接收日期类型
属性类型为 Date 类型 接收时 需要指定转换格式
前端到后端
@DateTimeFormat(pattern = "yyyy-MM-dd") //给前端提交到后端的数据日期指定转换格式
传入为 yyyy-MM-dd 格式
后端到前端
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") //后端把对象转为json时,指定日期的格式
中文乱码处理
spring 提供了编码过滤器,可以解决 post 请求存在的编码转化问题
在web.xml中配置编码过滤器
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
跨域问题
spring中 有可以解决跨域问题的过滤器。
依赖
<!--spring中提供的解决跨域问题的过滤器-->
<dependency>
<groupId>com.thetransactioncompany</groupId>
<artifactId>cors-filter</artifactId>
<version>2.5</version>
</dependency>
web.xml
<filter>
<filter-name>CORS</filter-name>
<filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CORS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
拦截器
类似 servlet 中的过滤器,区别在与 过滤器在前端控制器之前,而拦截器位于处理器映射器之后。
相比而言,过滤器比拦截器先触发,拦截范围更大
定义 token 验证拦截器
创建拦截器类并 实现 HandlerInterceptor 接口,重写 preHandle (预处理)方法。
// 请求 响应
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{
System.out.println("进入拦截器");
//获得token
String token = request.getHeader("token");
if(token.equals("11111")){
return true; //拦截器中返回true, 请求就会离开拦截器,继续向后执行,到达处理器
}else{
response.setContentType("text/html;charset=utf-8");//token???? 确保流输出的编码一致
PrintWriter writer = response.getWriter();
writer.write("token验证失败");
return false;
}
}
//返回 true 继续向后执行 到达处理器
//返回false 在拦截器中停止 可以在拦截器中向用户做出响应
配置token拦截器
定义好拦截器时,但未配置什么请求进入该拦截器。
在spring 中配置拦截器。
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/> <!-- 定义那些地址进入拦截器 -->
<mvc:exclude-mapping path="/loginCtl/login"/> <!-- 定义那些地址不进入拦截器 可配置多条 -->
<bean id="demo1" class="com.ssm.interceptor.AdminTokenInterceptor"></bean> <!-- 配置拦截器实现类 -->
</mvc:interceptor>
</mvc:interceptors>