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

news2024/12/23 4:02:19

文章目录

一、SpringWeb概述

二、SpringWeb特点

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

1、导包

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

3、开启 SpringWEB 注解

4、处理器搭建

四、SpringWeb运行流程

五、SpringWeb组件

1、前端控制器:

2、处理器映射器:

3、处理器适配器:

4、处理器:

六、接收请求

1、@RequestMapping注解

2、使用method定义请求方式

七、获取请求数据

1、使用 request 对象接收

2、使用Spring中的自动封装

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

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

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

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

八、SpringWeb的优点

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

 1、中文乱码处理

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、导包

<!--springweb层-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.2.RELEASE</version>
        </dependency>

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

<!--配置统一拦截分发器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 注解

<!-- 开启spring的web层注解-->
    <mvc:annotation-driven></mvc:annotation-driven>

4、处理器搭建

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

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

@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定义请求方式

@RequestMapping(path = "/login",method = RequestMethod.POST)
@RequestMapping(value = "/login",method = RequestMethod.GET)

七、获取请求数据

1、使用 request 对象接收

// 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中的自动封装

// 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";
    }
// 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 保持一致

/*@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("")绑定参数,用于接收请求头中的数据

/*@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 格式数据并将其封装到实体类对象中

/*@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格式数据

<!--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类型属性指定转换格式

// 指定从前端接收来的日期格式的json数据的转换
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birthday;
@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

@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提供的过滤器

<!--中文乱码处理-->
    <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组件

<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>

3、跨域访问处理

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

(1)添加依赖

<!--spring中提供的解决跨域问题的过滤器-->
        <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>

十、SpringWeb中的拦截器

1、定义

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

2、作用

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

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

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

4、定义拦截器

// 定义拦截器
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、配置拦截器

<!--配置拦截器-->
    <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>

          

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2264036.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

构建MacOS应用小白教程(打包 签名 公证 上架)

打包 在package.json中&#xff0c;dependencies会被打进 Electron 应用的包里&#xff0c;而devDependencies则不会&#xff0c;所以必要的依赖需要放到dependencies中。files中定义自己需要被打进 Electron 包里的文件。以下是一个完整的 mac electron-builder的配置文件。 …

2.4 网络概念(分层、TCP)

网络层与传输层概述 网络层&#xff1a; 抽象概念&#xff1a;网络层是基于 IP 的抽象概念&#xff0c;与数据链路层用 MAC 地址标记设备不同。MAC 地址是一种具体化的概念&#xff0c;绑定于所在的物理网络&#xff0c;而 IP 地址可以是固定的&#xff0c;也可以通过路由动态…

【JetPack】Room数据库笔记

Room数据库笔记 ORM框架&#xff1a;对齐数据库数据结构与面向对象数据结构之间的关系&#xff0c;使开发编程只考虑面向对象不需要考虑数据库的结构 Entity : 数据实体&#xff0c;对应数据库中的表 <完成面向对象与数据库表结构的映射> 注解&#xff1a; 类添加注解…

基于前端技术UniApp和后端技术Node.js的电影购票系统

文章目录 摘要Abstruct第一章 绪论1.1 研究背景与意义1.2 国内外研究现状 第二章 需求分析2.1 功能需求分析2.2 非功能性需求分析 第二章系统设计3.1 系统架构设计3.1.1 总体架构3.1.2 技术选型 3.2 功能架构 第四章 系统实现4.1 用户端系统实现4.1.1 用户认证模块实现4.1.2 电…

大模型微调---Lora微调实战

目录 一、前言二、LoRA实战2.1、下载模型到本地2.2、加载模型与数据集2.3、处理数据2.4、LoRA微调2.5、训练参数配置2.6、开始训练 三、模型评估四、完整训练代码 一、前言 LoRA是一种参数高效的微调技术&#xff0c;通过低秩转换对大型语言模型进行适应性更新&#xff0c;减少…

centos7下docker 容器实现redis主从同步

1.下载redis 镜像 docker pull bitnami/redis2. 文件夹授权 此文件夹是 你自己映射到宿主机上的挂载目录 chmod 777 /app/rd13.创建docker网络 docker network create mynet4.运行docker 镜像 安装redis的master -e 是设置环境变量值 docker run -d -p 6379:6379 \ -v /a…

SLAAC如何工作?

SLAAC如何工作&#xff1f; IPv6无状态地址自动配置(SLAAC)-常见问题 - 苍然满关中 - 博客园 https://support.huawei.com/enterprise/zh/doc/EDOC1100323788?sectionj00shttps://www.zhihu.com/question/6691553243/answer/57023796400 主机在启动或接口UP后&#xff0c;发…

2024.12.21辩论赛感受

背景 今天辩论赛的双方论点是&#xff1a; 正方&#xff1a;寒假留在研发中心的收获大 反方&#xff1a;寒假去做其他事情的收获 辩论赛&#xff0c;为了锻炼自己&#xff0c;选择了不想选择以及相对不好辩论的反方。出现的状况有一下几点&#xff1a; 1.发现自己脑子完全跟不…

【从零开始入门unity游戏开发之——C#篇21】C#面向对象的封装——`this`扩展方法、运算符重载、内部类、`partial` 定义分部类

文章目录 一、this扩展方法1、扩展方法的基本语法2、使用扩展方法3、扩展方法的注意事项5、扩展方法的限制6、总结 二、运算符重载1、C# 运算符重载2、运算符重载的基本语法3. 示例&#xff1a;重载加法运算符 ()4、使用重载的运算符5、支持重载的运算符6、不能重载的运算符7、…

C语言:文件IO

C语言&#xff1a;文件IO 文件操作 概述 什么是文件 文件是保存在外存储器&#xff08;一般代指磁盘&#xff0c;U盘&#xff0c;移动硬盘等&#xff09;的数据的集合 文件操作体现在哪几个方面 文件内容的读取文件内容的写入 数据的读取和写入可被视为针对文件进行输入&…

时间序列异常值处理方法

文章目录 一、删除法二、替换法三、插值法四、滑动窗口五、基于模型的替换 时间序列相关参考文章&#xff1a; 时间序列预测算法—ARIMA 时间序列预测算法—Prophet 时间序列分类任务—tsfresh python时间序列处理 有季节效应的非平稳序列分析 时间序列异常值检测方法 时间序列…

【报错】node:internal/modules/cjs/loader:936

报错问题&#xff1a; 当执行npm run dev后&#xff0c;出现下面错误 这个错误一般是由于Node.js无法找到所需的模块而引起的&#xff0c;解决此问题的一种方法就是重新安装所需的模块。 解决办法&#xff1a; 删除npm install 所下载在项目里的node_modules文件执行操作&…

故障诊断 | 一个小创新:特征提取+KAN分类

往期精彩内容&#xff1a; Python-凯斯西储大学&#xff08;CWRU&#xff09;轴承数据解读与分类处理 基于FFT CNN - BiGRU-Attention 时域、频域特征注意力融合的轴承故障识别模型-CSDN博客 基于FFT CNN - Transformer 时域、频域特征融合的轴承故障识别模型-CSDN博客 P…

javac 编译java文件源码 怎么生成 ast语法树 步骤详解

在 javac 中&#xff0c;编译源代码并生成抽象语法树&#xff08;AST&#xff09;是一个多步骤的过程&#xff0c;涉及从源码解析到最终生成字节码。以下是详细步骤&#xff0c;描述了如何使用 javac 编译源码并生成 AST。 1. 准备源文件 javac 首先需要源文件。这些源文件是…

人工智能入门是先看西瓜书还是先看花书?

在人工智能入门时&#xff0c;关于先看《机器学习》&#xff08;西瓜书&#xff09;还是先看《深度学习》&#xff08;花书&#xff09;的问题&#xff0c;实际上取决于个人的学习目标和背景。 《机器学习》&#xff08;西瓜书&#xff09;由周志华教授撰写&#xff0c;是一本…

Linux 安装Nginx 并配置启动 (已实测)

文章目录 一、安装Nginx二、配置 Nginx 为系统服务 一、安装Nginx 安装依赖&#xff0c;确保Nginx编译和运行正常&#xff0c;打开终端执行以下命令 yum install -y wget gcc-c pcre-devel zlib-devel openssl-devel下载Nginx # 例如&#xff0c;下载Nginx 1.24.0版本 wget …

Linux 下的 GPT 和 MBR 分区表详解

文章目录 Linux 下的 GPT 和 MBR 分区表详解一、分区表的作用二、MBR&#xff08;Master Boot Record&#xff09;1. **特点**2. **优点**3. **缺点**4. **适用场景** 三、GPT&#xff08;GUID Partition Table&#xff09;1. **特点**2. **优点**3. **缺点**4. **适用场景** 四…

10. 虚拟机VMware Workstation Pro下共享Ubuntu和Win11文件夹

本文记录当前最新版虚拟机VMware Workstation Pro&#xff08;2024.12&#xff09;如何在win11下共享文件&#xff0c;以实现Windows与Ubuntu互传文件的目的。 1. 创建共享文件夹 1.1 先关闭虚拟机的客户机&#xff0c;打开虚拟机设置 1.2 在虚拟机设置界面找到“选项”->“…

有哪些免费的 ERP 软件可供选择?哪些 ERP 软件使用体验较好?

想找个 “免费” 的 ERP 软件&#xff1f; 咱得知道&#xff0c;ERP 那可是涉及财务、人力、供应链、采购、销售等好多方面的重要企业软件。功能这么全&#xff0c;能免费才怪呢&#xff01;真要是有免费的&#xff0c;早就火遍大江南北&#xff0c;说不定把市场都垄断了&…

2024 年的科技趋势

2024 年在科技领域有着诸多重大进展与突破。从人工智能、量子计算到基因组医学、可再生能源以及新兴技术重塑了众多行业。随着元宇宙等趋势的兴起以及太空探索取得的进步&#xff0c;未来在接下来的岁月里有望继续取得进展与突破。让我们来探讨一下定义 2024 年的一些关键趋势&…