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 {

    @Autowired
    LoginService 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 {

    @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;    //拦截器中返回true,请求就会离开拦截器,继续向后执行,到达处理器
        }else
        {
            response.setContentType("text/html;charset=utf-8");
            PrintWriter writer=response.getWriter();
            writer.write("token验证失败");
            return false;   //拦截器中返回false,不会继续向后执行,可以在拦截器中向用户做出响应
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于 VuePress 的插件

插件就好比第三方功能&#xff0c;例如增加一个阅读进度条、增加光标效果等。VuePress 官网对插件的介绍&#xff1a;插件通常会为 VuePress 添加全局功能。 这里简单介绍几个本站用的插件吧&#xff01; ‍ ‍ 插件就好比第三方功能&#xff0c;例如增加一个阅读进度条、增…

nginx安装演示(离线安装,直接安装在Linux中)

文章目录 1、创建文件夹 tool / nginx2、把安装文件放到 /opt/tool/nginx 目录下面3、yum install gcc4、yum install gcc-c5、tar -zxvf pcre-8.37.tar.gz6、./configure7、make8、make install9、tar -zxvf openssl-1.0.1t.tar.gz10、./config11、/config 1、创建文件夹 tool…

防静电监控系统在电子制造业智能化转型中的应用价值

在电子制造业迅速向智能化转型的当下&#xff0c;防静电监控系统正发挥着日益重要的作用&#xff0c;其应用价值体现在多个关键方面。 一、ESD防静电监控系统简介 ESD防静电监控系统是对企业防静电设备&#xff08;机器、台垫、离子风机&#xff09;和人员进行实时监控、数据存…

护航端侧大模型平稳健康发展,百度大模型内容安全Lite版正式发布

6月28日&#xff0c;WAVE SUMMIT深度学习开发者大会 2024 “智变应用、码动产业”平行论坛在北京召开。与会&#xff0c;百度大模型内容安全Lite版正式发布&#xff0c;可面向低算力和超低算力的终端大模型提供离线场景下的一站式安全解决方案&#xff0c;为各类终端大模型平稳…

数据结构_线性表

线性表的定义和特点 线性表是具有相同特性的数据元素的一个有限序列 :线性起点/起始节点 :的直接前驱 :的直接后继 :线性终点/终端节点 n:元素总个数,表长 下标:是元素的序号,表示元素在表中的位置 n0时称为空表 线性表 由n(n>0)个数据元素(结点),组成的有限序列 将…

【系统架构设计师】计算机组成与体系结构 ⑩ ( 磁盘管理 | 磁盘移臂调度算法 | 先来先服务算法 | 最短寻道时间优先 | 扫描算法 | 循环扫描算法 )

文章目录 一、磁盘移臂调度算法1、磁盘移臂调度算法简介2、先来先服务算法3、最短寻道时间优先4、扫描算法5、循环扫描算法 二、最短寻道时间优先算法示例 一、磁盘移臂调度算法 1、磁盘移臂调度算法简介 磁盘 数据块读取 的 性能 主要由 寻道时间旋转延时 决定 ; 旋转延时 …

[SAP ABAP] 子例程

子例程 示例1 主程序(Z437_TEST_2024) INCLUDE文件(Z437_TEST_2024_F01) 输出结果如下所示 示例2 主程序(Z437_TEST_2024) INCLUDE文件(Z437_TEST_2024_F01) 输出结果如下所示 补充扩展练习 主程序(Z437_TEST_2024) INCLUDE文件(Z437_TEST_2024_F01) 输出结果如下所示 提示…

react+customize-cra使用less+less-loader时,可能遇到的问题及解决办法

目录 1、先附上各依赖版本和config-overrides.js配置代码&#xff0c;按这个版本和配置就没问题 2、问题&#xff08;注意&#xff1a;问题顺序没有先后之分哦&#xff09; 2.1、TypeError: Cannot read property tap of undefined 2.2、No module factory available for d…

谷歌地图Google JS API 实现

demo实现 实现源码&#x1f447; // 谷歌地图Google JS API 实现 <template><div class"myMap"><gmp-map :center"center" zoom"15" map-id"ab6b6643adfa1a70"><gmp-advanced-markerv-for"(res, index) in…

梅特勒同步热分析仪维修热重分析仪SDT650

仪器说明&#xff1a; 1、主要功能及应用范围&#xff1a; 一般可用于测量物质的晶态转变、熔融、凝固、纯度、蒸发、吸附水及结晶水含量、升华、吸附、解吸、吸收、玻璃化转变、液晶转变、热容的变化、燃烧、聚合、固化、催化反应、动力学。 2、主要规格及技术指标&#xff…

Redisson分布式锁、可重入锁

介绍Redisson 什么是 Redisson&#xff1f;来自于官网上的描述内容如下&#xff01; Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网格客户端&#xff08;In-Memory Data Grid&#xff09;。它不仅提供了一系列的 redis 常用数据结构命令服务&#xff0c;还提供了…

前端面试题14(贝塞尔曲线)

贝塞尔曲线在前端开发中经常用于创建平滑的动画路径或绘制复杂的矢量图形。贝塞尔曲线可以是一次、二次或三次的&#xff0c;其中三次贝塞尔曲线是最常见的&#xff0c;因为它提供了足够的灵活性来创建各种形状&#xff0c;同时保持计算上的可行性。 下面我将解释三次贝塞尔曲…

指标和量化交易那些事儿

最近很多朋友都在给我说&#xff0c;我要盘中打板的指标&#xff0c;我要盘中自动交易。今天我们来梳理下关于指标和量化交易这些事儿&#xff01; 第一&#xff1a;什么是指标&#xff1f;股票指标是属于统计学的范畴&#xff0c;依据一定的数理统计方法&#xff0c;运用一些…

【C++】认识使用string类

【C】STL中的string类 C语言中的字符串标准库中的string类string类成员变量string类的常用接口说明成员函数string(constructor构造函数)~string(destructor析构函数)默认赋值运算符重载函数 遍历string下标[ ]迭代器范围for反向迭代器 capacitysizelengthmax_sizeresizecapaci…

Outlook发送大文件的问题是什么?怎么解决?

Outlook不仅是一款电子邮件客户端&#xff0c;还包括日历、任务、笔记、联系人等功能&#xff0c;同时与Microsoft Office套件中的其他应用程序&#xff08;如Word、Excel、PowerPoint等&#xff09;集成紧密&#xff0c;方便用户在不同应用程序之间切换&#xff0c;提高工作效…

TC3xx NvM小细节解读

目录 1.FlsLoader Driver和FlsDmu Driver 2. FlsLoader小细节 3.小结 大家好&#xff0c;我是快乐的肌肉&#xff0c;今天聊聊TC3xx NvM相关硬件细节以及MCAL针对NvM的驱动。 1.FlsLoader Driver和FlsDmu Driver 在最开始做标定的时候&#xff0c;认为标定数据既然是数据&…

力扣双指针算法题目:复写零

1.题目 . - 力扣&#xff08;LeetCode&#xff09; 2.解题思路 本题要求就是对于一个数组顺序表&#xff0c;将表中的所有“0”元素都向后再写一遍&#xff0c;且我们还要保证此元素之后的元素不受到影响&#xff0c;且复写零之后此数组顺序表的总长度不可以改变&#xff0c;…

C#(asp.net)房屋租赁管理系统-计算机毕业设计源码64421

目 录 摘要 1 绪论 1.1 研究背景与意义 1.2开发现状 1.3论文结构与章节安排 2 房屋租赁管理系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 …

如何利用好用便签提高工作效率?

在忙碌的工作中&#xff0c;我们经常需要记住许多琐碎的任务。如果这些任务被遗忘&#xff0c;可能会对我们的工作产生影响。这时&#xff0c;便签就成为了我们的得力助手。通过合理的使用和管理&#xff0c;便签不仅能帮助我们记住重要的事项&#xff0c;还能提高我们的工作效…

中科蓝讯AB5607E蓝牙5.4 低成本带插卡带U盘音箱方案

方案概述 中科蓝讯AB5607E蓝牙5.4 低成本带插卡带U盘音箱方案&#xff0c;我们已有成熟的方案&#xff0c;用户可以免开发&#xff08;零代码&#xff09;快速完成带插卡带U盘蓝牙音箱&#xff0c;提供原理图&#xff0c;PCB Layout指导。 方案优势 低成本&#xff0c;IC成本低…