Spring(三)-SpringWeb-概述、特点、搭建、运行流程、组件、接受请求、获取请求数据、特殊处理、拦截器

文章目录

一、SpringWeb概述

二、SpringWeb特点

三、搭建SpringWeb(在web项目中)

1、导包

[2、在web.xml文件中配置统一拦截分发器 DispatcherServlet](#2、在web.xml文件中配置统一拦截分发器 DispatcherServlet)

[3、开启 SpringWEB 注解](#3、开启 SpringWEB 注解)

4、处理器搭建

四、SpringWeb运行流程

五、SpringWeb组件

1、前端控制器:

2、处理器映射器:

3、处理器适配器:

4、处理器:

六、接收请求

1、@RequestMapping注解

2、使用method定义请求方式

七、获取请求数据

[1、使用 request 对象接收](#1、使用 request 对象接收)

2、使用Spring中的自动封装

3、使用@RequestParam("")绑定参数,用于接收请求中的数据

4、使用@RequestHeader("")绑定参数,用于接收请求头中的数据

[5、使用@RequestBody接收前端提交的json 格式数据并将其封装到实体类对象中](#5、使用@RequestBody接收前端提交的json 格式数据并将其封装到实体类对象中)

[6、使用@DateTimeFormat(pattern = "yyyy-MM-dd")为Date类型属性指定转换格式](#6、使用@DateTimeFormat(pattern = "yyyy-MM-dd")为Date类型属性指定转换格式)

八、SpringWeb的优点

九、中文乱码处理、返回Json处理、跨域访问处理

1、中文乱码处理

[2、 返回Json处理(将响应对象转为json数据格式)](#2、 返回Json处理(将响应对象转为json数据格式))

3、跨域访问处理

十、SpringWeb中的拦截器

1、定义

2、作用

3、拦截器与过滤器的区别

4、定义拦截器

5、配置拦截器


一、SpringWeb概述

1、SpringWeb是Spring框架中的一个模块,是基于ServletAPI构建的web框架,是Spring为web层开发提供的一套完备的解决方案。

2、在web层框架经历了Strust1,、WebWork、Struct2等诸多产品的历代更迭之后,业界普遍选择SpringWeb作为JavaEE项目web层开发的首选方案。

二、SpringWeb特点

1、SpringWeb是Spring家族的原生产品,与IOC容器等基础设施可以实现无缝对接。

2、基于原生的Servlet,StringWeb提供了一个前端控制器DispatcherServlet,开发人员不再需要额外开发控制器对象。

3、SpringWeb可以自动绑定用户输入,并正确地转换数据类型。

4、StringWeb的使用代码清新简洁

5、StringWeb内部组件化程度高,可插拔式组件即插即用。

6、StringWeb性能卓著,特别符合现代大型、超大型互联网项目的要求。

三、搭建SpringWeb(在web项目中)

1、导包

XML 复制代码
<!--springweb层-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.2.RELEASE</version>
        </dependency>

2、在web.xml文件中配置统一拦截分发器 DispatcherServlet

XML 复制代码
<!--配置统一拦截分发器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>
    <!-- 请求映射 -->
    <servlet-mapping>
        <servlet-name>application</servlet-name>
        <url-pattern>/</url-pattern><!--可以让所有的请求都被DispatcherServlet拦截,然后对这些请求统一进行分发处理-->
    </servlet-mapping>

3、开启 SpringWEB 注解

XML 复制代码
<!-- 开启spring的web层注解-->
    <mvc:annotation-driven></mvc:annotation-driven>

4、处理器搭建

(1)@RestController注解: 标记在一个类上,标记的类就是一个 SpringWeb控制类。 Spring 配置中指定了自动扫描的 basepackage 后,Spring 会扫描这些包以及子包中的使用了@RestController 标识的类,然后将类加入到 Spring IOC 容器 中,注入依赖。

(2)@RequestMapping注解:是一个用来处理请求地址映射的注解,可用于类或方法上。

java 复制代码
@RestController
@RequestMapping(path = "/loginCtl")// 使用web层注解,为类定义地址
public class LoginController {

    @RequestMapping(path = "/login")// 使用web层注解,为方法定义地址
    public String login(){
        System.out.println("hello springweb");
        return "success";
    }
}

四、SpringWeb运行流程

用户发送一次请求到后端,先进入DispatcherServlet统一拦截,再调用HanderMapping解析请求中的处理器地址和方法地址,判断地址是否存在,不存在返回404,如果存在,判断该地址是否有对应的拦截器,如果有,进入到拦截器。之后回到DispatcherServlet,再调用HanderAdapter,最终由处理器适配器调用我们自己的处理器,如:LoginController。

五、SpringWeb组件

1、前端控制器:

(1)定义:DispatcherServlet,由框架提供,在 web.xml 中配置。

(2)作用:统一处理请求和响应,是整个流程控制的中心,由它调用其它组件处理 用户的请求。

2、处理器映射器:

(1)定义:HandlerMapping,由框架提供。

(2)作用:根据请求的 url 查找 Handler(处理器/Controller)。

3、处理器适配器:

(1)定义:HandlerAdapter,由框架提供。

(2)作用:按照特定规则(HandlerAdapter 要求的规则)去执行 Handler。

4、处理器:

(1)定义:Handler(也称之为 Controller,需要工程师开发)。

(2)注意:编写 Handler 时必须按照HandlerAdapter 的要求去做,这样处理器适配器才可以去正确执行Handler。

(3)作用:接受用户请求信息,调用业务方法处理请求,也称之为后端控制器。

六、接收请求

1、@RequestMapping注解

(1)作用:为处理器进行地址映射,添加在类或者方法的上方。且如果添加在类的上方,其path属性在整个项目中都不能重复。如果添加在方法的上方,其path属性在整个类中不能重复。

(2)常用属性:

  • path/vale:定义地址
  • method:定义请求方式,其默认值是所有请求方式

2、使用method定义请求方式

java 复制代码
@RequestMapping(path = "/login",method = RequestMethod.POST)
java 复制代码
@RequestMapping(value = "/login",method = RequestMethod.GET)

七、获取请求数据

1、使用 request 对象接收

java 复制代码
// method = RequestMethod.POST - 指定允许哪些请求方式可以访问此方法
    @RequestMapping(path = "/login",method = RequestMethod.POST)// 使用web层注解,为方法定义地址
    public String login(HttpServletRequest request){
        System.out.println(request.getParameter("name"));
        System.out.println(request.getParameter("age"));
        System.out.println("hello springweb");
        return "success";
    }

2、使用Spring中的自动封装

java 复制代码
// method = RequestMethod.POST - 指定允许哪些请求方式可以访问此方法
    @RequestMapping(path = "/login",method = RequestMethod.POST)// 使用web层注解,为方法定义地址
    public String login(String name,Integer age){
        System.out.println(name);
        System.out.println(age);
        System.out.println("hello springweb");
        return "success";
    }
java 复制代码
// method = RequestMethod.POST - 指定允许哪些请求方式可以访问此方法
    @RequestMapping(value = "/login",method = RequestMethod.GET)// 使用web层注解,为方法定义地址
    public String login(Admin admin){
        Admin admin1 = loginService.login(admin);
        System.out.println(admin1);
        System.out.println("hello springweb");
        return "success";
    }

Spring 在对数据进行封装时,必须保证处理器接收参数的形参名称和表单的name 属性保持一致,否则会接收失败!

3、使用@RequestParam("")绑定参数,用于接收请求中的数据

当请求参数名与形参名不一致时,必须使用@RequestParam注解进行参数绑定,即让@RequestParam 注解的 value 值和表单的 name 保持一致

java 复制代码
/*@RequestParam("password") String pwd,@RequestParam(value = "account") String ac 绑定请求中的参数与方法中的形参*/
    @RequestMapping(value = "/login",method = RequestMethod.POST)
    public String login(@RequestParam("password") String pwd,@RequestParam(value = "account") String ac){
        System.out.println(pwd);
        System.out.println(ac);
        return "success";
    }

4、使用@RequestHeader("")绑定参数,用于接收请求头中的数据

java 复制代码
/*@RequestHeader("User-Agent") String userAgent 绑定请求头中的参数与方法中的形参*/
    @RequestMapping(value = "/login",method = RequestMethod.POST)
    public String login(@RequestHeader("User-Agent") String userAgent){
        System.out.println(userAgent);
        return "success";
    }

5、使用@RequestBody接收前端提交的json 格式数据并将其封装到实体类对象中

java 复制代码
/*@RequestBody Admin admin 接收前端提交的json格式的数据并将其封装到admin对象中*/
@RequestMapping(value = "/login",method = RequestMethod.POST)
public String login(@RequestBody Admin admin){
    System.out.println(admin);
    return "success";
}

注意:必须导入jar包让后端项目支持json格式数据

XML 复制代码
<!--jackson-->
<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-databind</artifactId>
	<version>2.14.2</version>
</dependency>

6、使用@DateTimeFormat(pattern = "yyyy-MM-dd")为Date类型属性指定转换格式

java 复制代码
// 指定从前端接收来的日期格式的json数据的转换
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birthday;
java 复制代码
@RequestMapping(value = "/login", method = RequestMethod.POST)
    public String login(@RequestBody Admin admin) {
        Admin admin1 = loginService.login(admin);
        System.out.println(admin1);
        return "success";
    }

八、SpringWeb的优点

对web层进行了封装,让我们可以快速搭建自己的后端处理程序

比如:LoginController

java 复制代码
@RestController // 将此类交给spring管理
@RequestMapping(path = "/loginCtl")// 使用web层注解,为类定义映射地址
public class LoginController {

    @Autowired
    LoginService loginService;// 注入其他对象

    // 为方法定义映射地址,设置该方法允许哪些请求进行访问
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public String login(@RequestBody Admin admin) {// 可以方便的接收请求中的参数
        Admin admin1 = loginService.login(admin);
        System.out.println(admin1);
        return "success";// 可以直接将返回的对象转换为json字符串
    }

}

九、中文乱码处理、返回Json处理、跨域访问处理

1、中文乱码处理

目标:前端数据传到后端时不会出现乱码

在web.xml中添加配置,启用SpringWeb提供的过滤器

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>

2、返回Json处理(将响应对象转为json数据格式)

目标:将响应对象转为json数据格式

(1)在Springweb中如果想要向前端返回的数据格式为json时,只需要在方法上添加 @ResponseBody 注解即可,而@RestController注解中包含了 @ResponseBody 注解

(2)在项目中必须导入转json组件

XML 复制代码
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>

3、跨域访问处理

目标:允许异步访问(一个服务器向另一个服务器发送请求和接收响应)

(1)添加依赖

XML 复制代码
<!--spring中提供的解决跨域问题的过滤器-->
        <dependency>
            <groupId>com.thetransactioncompany</groupId>
            <artifactId>cors-filter</artifactId>
            <version>2.5</version>
        </dependency>

(2)在web.xml文件中添加配置

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>

十、SpringWeb中的拦截器

1、定义

SpringWeb中的拦截器(Interceptor)类似于 Servlet 中的过滤器(Filter)

2、作用

拦截用户请求并作出相应的处理

3、拦截器与过滤器的区别

过滤器时servlet规范中定义并实现的,是在进入到servlet之前截获请求,而拦截器是spring中定义的拦截机制,是在进入到处理器之前拦截请求。

4、定义拦截器

java 复制代码
// 定义拦截器
public class AdminTokenInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("进入拦截器了");
        // 从请求头中获取token
        String token = request.getHeader("token");
        if (token.equals("123456")) {
            return true;// 请求出了拦截器继续向后执行,进入处理器
        } else {
            response.setContentType("test/html;charset=utf-8");// 防止响应字符串乱码
            // 向前端做出响应
            PrintWriter writer = response.getWriter();
            writer.print("token验证失败");
            return false;// 请求出了拦截器不再向后执行
        }
    }
}

5、配置拦截器

XML 复制代码
<!--配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/><!--允许进入拦截器的请求地址-->
            <mvc:exclude-mapping path="/loginCtl/login"/><!--不允许进入拦截器的请求地址-->
            <bean id="admintoken" class="com.ffyc.ssm.interceptor.AdminTokenInterceptor"></bean><!--拦截器实现类地址-->
        </mvc:interceptor>
    </mvc:interceptors>
相关推荐
葫芦和十三5 小时前
图解 MongoDB 21|选举与 failover:Primary 是怎么选出来的
后端·mongodb·agent
GetcharZp6 小时前
26k Star 开源内网穿透神器 NetBird,一分钟实现全球设备互联!
后端
考虑考虑6 小时前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯7 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式
lizhongxuan9 小时前
多Agent之间的区别
后端
青石路11 小时前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java
杨充11 小时前
1.面向对象设计思想
后端
IT_陈寒11 小时前
Java的Date类又坑了我一次,改用时间戳真香
前端·人工智能·后端
systemPro12 小时前
2.6亿条设备数据,历史查询从超时到50ms,我做了什么
后端
要阿尔卑斯吗12 小时前
提示词优化启示:为什么“按顺序输出“比“关键度评分“更有效
后端