Spring Web

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 运行流程

在这里插入图片描述

  1. 请求进入到 DispatcherServlet 统一进行拦截,再调用其他其他程序处理。
  2. 调用 HandlerMapping(处理器映射器),解析请求中处理器的地址和方法地址,判断地址是否存在。不存在返回404,存在的话判断是否有拦截器,有拦截器进入到拦截器。
  3. 回到 DispatcherServlet,再调用 HandlerAdapter(处理器适配器)。
  4. 最终由处理器适配器调用 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 核心请求分发器

<!--   配置统一拦截的 分发器  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:spring2.xml</param-value>  <!--Spring全局配置文件 -->
        </init-param>
        <load-on-startup>0</load-on-startup>
    </servlet>

    <!-- 请求映射 -->
    <servlet-mapping>
        <servlet-name>application</servlet-name>
   
        <url-pattern>/</url-pattern>   
       <!-- /  对  DispatcherServlet 发送的所有请求都能被接收       -->
    </servlet-mapping>

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){
    ...
    }

方法四:注释标签

  1. @RequestParam(" ") 将 请求体 中值传给参数
    @RequestMapping(path = "/login")
    public String login(@RequestParam("userName") String name)
  1. @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>
  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浩然缭绕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值