Springweb详解

Springweb详解

一.springweb介绍

1.1 SpringWEB 特点

 SpringWEB 是 spring 家族原生产品,与 IOC 容器等基础设施无缝对接.

 基于原生的 Servlet,提供了一个前端控制器 DispatcherServlet ,开发者 无须额外开发控制器对象.

 可以自动绑定用户输入,并正确地转换数据类型.

 代码清新简洁,大幅度提升开发效率.

 内部组件化程度高,可插拔式组件即插即用.

 性能卓著,尤其适合现代大型、超大型互联网项目要求.

1.2 springweb组件

前端控制器:DispatcherServlet(不需要程序员开发)由框架提供,在 web.xml 中配置。 作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理 用户的请求.

处理器映射器:HandlerMapping(不需要程序员开发),由框架提供。 作用:根据请求的 url 查找 Handler(处理器/Controller)

处理器适配器:HandlerAdapter(不需要程序员开发),由框架提供。 作用:按照特定规则(HandlerAdapter 要求的规则)去执行 Handler。

处理器:Handler(也称之为 Controller,需要工程师开发)。 注意:编写 Handler 时按照 HandlerAdapter 的要求去做,这样适配器才可 以去正确执行 Handler。 作用:接受用户请求信息,调用业务方法处理请求,也称之为后端控制器

二.springweb搭建

2.1 导包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
2.2 配置DispatcherServlet

在 web.xml 文件中配置 DispatcherServlet

配置 spring 核心请求分发器

<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>
</servlet-mapping>
2.3 开启Springweb注解
<mvc:annotation-driven></mvc:annotation-driven>
2.4 处理器类搭建

@RestController 用于标记在一个类上,使用它标记的类就是一个 SpringWEB 控制器类。用@RequestMapping标记一个类或方法,spring会扫描包中用了@RM的类,方法然后加入到IOC容器中,注入依赖

//@RequestMapping 用来为类和方法定义访问地址,类上面的地址不能重复
@RequestMapping(path = "/loginCtl")
public class LoginController {@RequestMapping(path = "/login")public String login(){......}
}

三. 接受请求

3.1 @RequestMapping

@RequestMapping 是一个用来为处理器地址映射的注解,可用于类或方法上. 作用在类上,在整个项目中不能重复,作用在方法上,整个类中不能重复. 常用属性 path,value,method. path 和 value 用来定义地址 method 用来定义请求方式 @RequestMapping(value = “/hello”,method = RequestMethod.GET) @RequestMapping(path= “/hello”,method = RequestMethod.POST)

//  path和value都表示定义一个此类或方法的地址    
//  method=RequestMethod.POST   指定允许哪些请求方式访问此方法@RequestMapping(path = "/login",method = RequestMethod.POST)public String login(Admin admin){......}

ok我们来总结一下:

springweb好处:对web层进行封装,让我们可以快速搭建自己的后端处理程序(LoginController):

@RestController	//表示此类由spring创建管理
@RequestMapping(path = "/loginCtl")	//为类定义一个映射地址
public class LoginController {@AutowiredLoginService loginService;	//方便的注入其他对象//为方法定义映射地址,设置该方法允许哪些请求方式访问,可以方便接收请求中的参数@RequestMapping(path = "/login",method = RequestMethod.POST)public String login(Admin admin){Admin admin1=loginService.login(admin);System.out.println(admin1);//可以直接将返回的对象,自动转为json字符串return "success";	}
}

四.springweb请求的运行流程(截至目前)

一次请求到后端,先进入DispatcherServlet,统一进行拦截,再调用其他程序进行处理,调用HandlerMapping(处理器映射器) 解析请求中处理器的地址和方法地址。判断地址是否存在,不存在返回404,如果存在,判断该地址有没有拦截器。如果有拦截器,进入拦截器。

然后会回到DispatcherServlet,再调用HandlerAdapter(处理器适配器),最终由处理器适配器调用我们自己的处理器(LoginController),由我们自己的处理器进行接受请求,处理请求,响应。

五.获取请求数据

5.1 spring自动封装

spring会自定进行数据封装,这里需要注意的是,处理器接收参数的形参名称必须和表单的name属性保持一致

    @RequestMapping(path = "/login",method = RequestMethod.POST)    public String login(Admin admin,String mark){......return "success";}
5.2 当请求参数名和形参名不一致
5.2.1 可以使用@RequestParam(“”)进行参数绑定
    @RequestMapping(path = "/login",method = RequestMethod.POST)    public String login(Admin admin,@RequestParam("m") String mark){......return "success";}
5.2.2 可以使用@RequestHeader(“”)接收请求头中的数据
    @RequestMapping(path = "/login",method = RequestMethod.POST) //因为请求头中的User-Agent传回来发现java中没有-命名的变量,所以需要用到这个public String login(Admin admin,@RequestHeader("User-Agent") String userAgent){......return "success";}
5.3 使用实体类对象接收

@RequestBody 可以接收前端提交的json格式数据,将json格式封装到对象中

    @RequestMapping(path = "/login",method = RequestMethod.POST)    public String login(@RequestBody Admin admin){......return "success";}
5.4 日期类型转换

属性类型为Date类型需要指定转换格式,在声明属性上方添加:

	 @DateTimeFormat(pattern = "yyyy-MM-dd")private Date birthday;

@DateTimeFormat():前端提交到后端的数据日期指定转换格式

@JsonFormat():后端把对象转为json时,指定的日期格式

六.中文乱码处理

SpringWEB 中已经为我们提供了过滤器,只需要在 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>

七.跨域访问处理:

添加依赖:

<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>

八.返回JSON

我们在后端返回的对象springweb会自动帮我们返回成json格式,只需要导入json组件即可:

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

九.拦截器

springweb中的拦截器类似于servlet中的过滤器,主要用于拦截用户请求并作相应的处理

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

配置拦截器:

    <!--配置拦截器--><mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/>   <!--定义哪些地址可以进入到拦截器中--><mvc:exclude-mapping path="/loginCtl/login"/>  <!--定义哪些地址不进入拦截器--><mvc:exclude-mapping path="/loginCtl/login"/>  <!--可以配多个--><bean id="admin" class="com.ffyc.ssm.interceptor.AdminTokenInterceptor"></bean> <!--配置拦截器的实现类--></mvc:interceptor></mvc:interceptors>

定义一个拦截器:

当请求进入拦截器时判断token,符合则true然后继续执行处理器,不符合false则不往后执行可以在此给用户做出相应

//定义一个拦截器
public class AdminTokenInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("进入到拦截器");//获得tokenString token = request.getHeader("token");if (token.equals("123456")) {return true;    //拦截器中返回true,请求就会离开拦截器,继续向后执行,到达处理器}else{response.setContentType("text/html;charset=utf-8");PrintWriter writer=response.getWriter();writer.write("token验证失败");return false;   //拦截器中返回false,不会继续向后执行,可以在拦截器中向用户做出响应}}
}

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

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

相关文章

【SQL】聚簇索引与⾮聚簇索引的区别

聚簇索引&#xff08;Clustered Index&#xff09;和非聚簇索引&#xff08;Non-Clustered Index&#xff09;是数据库索引的两种主要类型&#xff0c;它们在数据存储和访问方式上有显著区别。 聚簇索引 数据存储顺序&#xff1a;聚簇索引将数据行按照索引键的顺序进行存储。…

VSCode打开其它IDE项目注释显示乱码的解决方法

问题描述&#xff1a;VSCode打开Visual Studio&#xff08;或其它IDE&#xff09;工程&#xff0c;注释乱码&#xff0c;如下图所示&#xff1a; 解决方法&#xff1a;点击VSCode右下角的UTF-8&#xff0c;根据提示点击“通过编码重新打开”&#xff0c;再选择GB2312&#xff0…

R语言数据分析案例42-基于时间序列模型对股票预测分析和研究

一、研究背景和意义 随着全球经济的不断发展和数字化转型的加速推进&#xff0c;科技公司在全球市场中扮演着日益重要的角色。其中&#xff0c;中国的阿里巴巴集团作为全球最大的电子商务公司之一&#xff0c;其业务范围覆盖电子商务、云计算、金融科技等多个领域。由于其在中…

AI革命:RAG技术引领未来智能

AI革命:RAG技术引领未来智能 在人工智能的浪潮中,一种名为RAG(Retrieval-Augmented Generation)的技术正在悄然改变我们的世界。这种技术通过整合外部知识库,极大地增强了大型语言模型(LLM)的性能,为智能助手、聊天机器人等应用带来了革命性的提升。 1 突破性的RAG技…

【问题记录】Jenkins Pipeline读取变量的各种方法

方法一 输出docker image镜像标签给IMAGE_TAG def IMAGE_TAG sh(script: docker images | grep ${SERVER_NAME} | grep $NAME_SPACE | awk {print $2}|grep ${BUILD_NUMBER}, returnStdout: true) 另外&#xff0c;如果想输出docker image命令执行结果给IMAGE_TAG def IMAG…

【python】PyQt5可视化开发,如何设计鼠标显示的形状?

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

通信施工安全员B类测试题含答案

1.全国人民代表大会常务委员会关于修改<中华人民共和国安全生产法>的决定》由中华人民共和国第十二届全国人民代表大会常务委员会第十次会议通过&#xff0c;自( )起施行。 A、2002年11月1日 B、2014年8月31日C、2014年12月1日(正确答案) D、2015年1月01日 2.生产经营单…

JMeter:循环控制器While Controller的用法小结

前言 在之前的博文“JMeter案例优化&#xff1a;测试执行结束后&#xff0c;实现tearDown的几种方式”中&#xff0c;尝试了JMeter的循环控制器While Controller&#xff0c;发现还有点小复杂&#xff0c;将学习过程记录下来&#xff0c;免得遗忘。 注&#xff1a;我使用的是…

《C++20设计模式》外观模式

文章目录 一、前言二、实现1、UML类图2、实现 一、前言 一句话总结外观模式&#xff1a;简化接口&#xff0c;或者简化流程。&#x1f642; 相关代码可以在这里&#xff0c;如有帮助给个star&#xff01;AidenYuanDev/design_patterns_in_modern_Cpp_20 二、实现 原来需要很…

动手学深度学习(Pytorch版)代码实践 -循环神经网络-54~55循环神经网络的从零开始实现和简洁实现

54循环神经网络的从零开始实现 import math import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2l import matplotlib.pyplot as plt import liliPytorch as lp# 读取H.G.Wells的时光机器数据集 batch_size, num_steps 32, …

多特征线性回归

目录 一、多特征符号意义说明&#xff1a;二、多特征模型表示&#xff1a;三、Numpy向量表示、内积计算&#xff1a;1.向量表示&#xff1a;2.内积计算&#xff1a; 四、多元线性回归梯度下降算法&#xff1a; 一、多特征符号意义说明&#xff1a; x下标j&#xff1a;表示第j个…

怎么做外贸推广:10个详细教程和工具

1. 介绍 1.1 什么是外贸推广 外贸推广指的是将产品或服务推广到国际市场的过程。它的主要目的是吸引海外客户&#xff0c;增加销售额&#xff0c;并扩大企业的全球影响力。外贸推广不仅仅是销售产品&#xff0c;它还包括品牌建设、市场研究和客户关系管理。 谷歌外贸推广案例…

机器学习---线性回归

1、线性回归 例如&#xff1a;对于一个房子的价格&#xff0c;其影响因素有很多&#xff0c;例如房子的面积、房子的卧室数量、房子的卫生间数量等等都会影响房子的价格。这些影响因子不妨用 x i x_{i} xi​表示&#xff0c;那么房价 y y y可以用如下公式表示&#xff1a; y …

吴恩达机器学习 第三课 week3 强化学习(月球着陆器自动着陆)

目录 01 学习目标 02 概念 2.1 强化学习 2.2 深度Q学习&#xff08;Deep Q-Learning &#xff09; 03 问题描述 04 算法中的概念及原理 05 月球着陆器自动着陆的算法实现 06 拓展&#xff1a;基于pytorch实现月球着陆器着陆 07 总结 写在最前&#xff1a;关于强化学习…

python conda查看源,修改源

查看源 conda config --show-sources 修改源 可以直接vim .condarc修改源&#xff0c;

Shell学习——Shell变量

文章目录 Shell变量使用变量只读变量删除变量变量类型字符串变量&#xff1a; 在 Shell中&#xff0c;变量通常被视为字符串。整数变量&#xff1a; 在一些Shell中&#xff0c;你可以使用 declare 或 typeset 命令来声明整数变量。数组变量&#xff1a; Shell 也支持数组&#…

平价猫粮新选择!福派斯鲜肉猫粮,让猫咪享受美味大餐!

福派斯鲜肉猫粮&#xff0c;作为一款备受铲屎官们青睐的猫粮品牌&#xff0c;凭借其卓越的品质和高性价比&#xff0c;为众多猫主带来了健康与美味的双重享受。接下来&#xff0c;我们将从多个维度对这款猫粮进行解析&#xff0c;让各位铲屎官更加全面地了解它的魅力所在。 1️…

【三】ubuntu24虚拟机集群配置免密登陆

文章目录 环境背景1. 配置域名映射2. 配置免密登录2.1 在每台机器上生成SSH密钥对&#xff1a;2.2 将公钥分发到其他机器&#xff1a;2.2.1 报错问题2.2.2 修复方法 3. 验证免密登录在 ubuntu1 上&#xff1a;在 ubuntu2 上&#xff1a;在 ubuntu3 上&#xff1a; 测试连接 环境…

三级_02_网络系统结构与设计的基本原则

1.下列关于接入技术特征的描述中&#xff0c;错误的是()。 无线统一网络中AC如果发现某个AP出现故障&#xff0c;将自动调高周围AP的发射功率以覆盖出现的空洞 ADSL技术具有非对称带宽特性 APON是一种无线接入技术 Cable Modem利用频分复用的方法将信道分为上行信道和下行信…

Linux系统的服务——以Centos7为例

一、Linux系统的服务简介 服务是向外部提供对应功能的进程&#xff0c;其运行在系统后台&#xff0c;能够7*24小时持续不断的提供外界随时发来的服务请求&#xff0c;且服务进程常驻在内存中&#xff0c;具有固定的端口号&#xff0c;通过端口号就能找到服务内容。 提供服务的一…