SpringWeb(SpringMVC)详解

SpringWeb 概述

SpringWeb 是 spring 框架的一个模块,与spring无缝集成,  是一个基于 mvc 的 web 框架,方便前后端数据的传输.
拥有控制器,接收外部请求,解析参数传给服务层.

SpringMVC 运行流程

MVC架构是后端的架构,是jsp时代的称呼,mvc的概念在前后端分离时代就不存在了

1. 用 户 向 服 务 器 发 送 请 求 , 请 求 被 Spring 前 端 控 制 Servelt ,  DispatcherServlet 捕获,springWeb底层用的就是servlet接收用户所有请求
2.前端控制器DispatcherServlet接收请求后,调用处理器映射 HandlerMapping。
处理器映射器 HandlerMapping 根据请求的 url 找到处理该请求的处理器 Handler ( 即 Controller ) , 将 处 理 器 Handler 返 回 给 前 端 控 制 器DispatcherServlet,  如果本次请求有拦截器,就会执行相应的拦截器
3. DispatcherServlet 根 据 获 得 的 Handler , 选 择 一 个 合 适 的
HandlerAdapter(适配器)。 在填充 Handler 的入参过程中,根据你的配置,Spring 将
帮你做一些额外的工作(封装参数):
HttpMessageConveter: 将请求消息(如 Json、xml 等数据)转换成一个对象,将对象转换为指定的响应信息
数据转换:对请求消息进行数据转换。如 String 转换成 Integer、Double等
数据格式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
4. 到达自己定义的Handler控制器, 进行接收参数,  处理,  响应

控制器类接收请求

@RestController 用于标记在一个类上,使用它标记的类就是一个 SpringMVC Controller 对象.
Spring 配置中指定了自动扫描的 basepackage 后,Spring 会扫描这些包以及
子包中的使用了@RestController 标识的类,然后将类加入到 Spring IOC 容器中, 注入依赖
@RequestMapping 注解是一个用来处理请求地址映射的注解,可用于类或方法上。
 
                                  在类上面使用,整个项目必须是唯一的,不能重复
                                   
                                  在方法上定义时,  同一个类中地址也必须是唯一的
                
                                   可以使用path/value来定义地址(请求的路径)
                                   
                                   可以使用method来定义请求的方法,我们知道 HTTP 协议的请求方式有 GET 和 POST,我们可以分别使用者使用@GetMapping, @PostMapping
@RequestMapping在没有指定请求方式的时候,默认任何方式都可以
         

                                 指定请求方式:@RequestMapping(value = "/login",method = RequestMethod.GET)

1.在参数列表定义形参接收

请求方法:对应到@RequestMapping 中的 method

请求 URI:中的"/students/create" 对应到@RequestMapping 中的 value 或者 path
请求头:比如获取 User-Agent 中的值则使用@RequestHeader("User-Agent")来获取
请求参数:比如获取 name 参数的值,则使用@RequestParam("name")来获取。


   

 @RestController
 @RequestMapping("/students")
 public class StudentController {
  @RequestMapping(value="/create",method=RequestMethod.POST)
  public String create(
      @RequestParam("name") String name,
      @RequestParam("age") Integer age,
      @RequestHeader("User-Agent") String userAgent){
  return null;
 }
}

注意:   请求中的键与形参名字一致,直接接收,不一致需要通过注解标签进行接收

2.直接使用对象接收

中文乱码

在提交请求的时候,如果输入的是中文,处理器方法获取到之后是乱码。 解决的方法就是添加一个过滤器,为 request 对象设置编码集。SpringMVC 中已经为我们提供了这个过滤器,只需要在 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>

控制器中返回结果(Ajax 返回 JSON)

由于@RequestMapping中包含@RequestBody标签,所以方法返回结果默认是json格式,  并将json字符串写入到响应体返回一个对象时,  必须加入一个转json的第三方组件

 <!--转json需要的组件-->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.6</version>
        </dependency>

跨域处理

1.添加跨域过滤器
<dependency>
<groupId>com.thetransactioncompany</groupId>
<artifactId>cors-filter</artifactId>
<version>2.5</version>
</dependency>

2.在 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>

拦截器

SpringMVC 定义了拦截器接口 HandlerInterceptor , 该接口中定义了三个方法,这三个方法的调用时在 SpringMVC 框架内部完成的, 调用这个三个方法的时候,其参数的值也是从框架内部传递进来的。 boolean preHandle 预处理方法,实现处理器方法的预处理,就是在处理器方法执行之前这个方法会被执行,相当于拦截了处理器方法,框架会传递请求和响应对象给该方法,第三个参数为被拦截的处理器方法。如果 preHandle 方法返回 true 表示继续流程(如调用下一个拦截器或处理器方法),返回 false 表示流程中断,不会继续调用其他的拦截器或处理器方法
拦截器的实现:
1.编写一个类,继承 HandlerInterceptorAdapter

 2.注册拦截器

 <!--配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/><!--配置那些请求可以进入到拦截器-->
            <mvc:exclude-mapping path="/loginCtl/login"/><!--配置那些请求不可以进入拦截器-->
            <bean class="com.ffyc.ssm.common.TokenInterceptor"></bean><!--配置实现类的拦截器-->
        </mvc:interceptor>
    </mvc:interceptors>

猜你喜欢

转载自blog.csdn.net/weixin_71243923/article/details/128285808
今日推荐