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

文章目录

一、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 {@AutowiredLoginService 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 {@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;// 请求出了拦截器继续向后执行,进入处理器} 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.rhkb.cn/news/494547.html

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

相关文章

Vue2四、 scoped样式冲突,data是一个函数,组件通信-父传子-子传父-非父子

组件通信 1. 父组件通过 props 将数据传递给子组件 2. 子组件利用 $emit 通知父组件修改更新 父--->子 子--->父

LLaMA-Factory(二)界面解析

这里写目录标题 1. 基础选项语言模型选择模型路径微调方法检查点路径量化等级量化方法提示模板RoPE加速方式 2.模型训练界面训练方式数据集超参数设置其他参数部分参数设置LoRA参数设置RLHF参数设置GaLore参数设置BAdam参数设置训练 3.评估预测界面4.Chat界面5.导出Export界面 …

SRE 与 DevOps记录

flashcat https://flashcat.cloud

Python入门:4.Python中的运算符

引言 Python是一间强大而且便捷的编程语言&#xff0c;支持多种类型的运算符。在Python中&#xff0c;运算符被分为算术运算符、赋值运算符、复合赋值运算符、比较运算符和逻辑运算符等。本文将从基础到进阶进行分析&#xff0c;并通过一个综合案例展示其实际应用。 1. 算术运…

蓝桥杯物联网开发板硬件组成

第一节 开发板简介 物联网设计与开发竞赛实训平台由蓝桥杯大赛技术支持单位北京四梯科技有限公司设计和生产&#xff0c;该产品可用于参加蓝桥杯物联网设计与开发赛道的竞赛实训或院校相关课程的 实践教学环节。 开发板基于STM32WLE5无线微控制器设计&#xff0c;芯片提供了25…

ARM异常处理 M33

1. ARMv8-M异常类型及其详细解释 ARMv8-M Exception分为两类&#xff1a;预定义系统异常(015)和外部中断(1616N)。 各种异常的状态可以通过Status bit查看&#xff0c;获取更信息的异常原因&#xff1a; CFSR是由UFSR、BFSR和MMFSR组成&#xff1a; 下面列举HFSR、MMFSR、…

百度热力图数据处理,可直接用于论文

数据简介1、CSV点数据2、SHP数据3、TIF数据4、png图片或标准经纬度出图5、案例6、论文的参考方向 其他数据处理/程序/指导&#xff01;&#xff01;&#xff01;&#xff08;1&#xff09;街景数据获取&#xff08;2&#xff09;街景语义分割后像素提取&#xff0c;指标计算代码…

利用Gurobi追溯模型不可行原因的四种方案及详细案例

文章目录 1. 引言2. 追溯不可行集的四种方法2.1 通过约束增减进行判断2.2 通过computeIIS函数获得冲突集2.3 利用 feasRelaxS() 或 feasRelax() 函数辅助排查2.4 利用 IIS Force 属性1. 引言 模型不可行是一个让工程师头疼的问题,对于复杂模型而言,导致模型不可行的原因可能…

数据流图和流程图的区别

在结构化建模中&#xff0c;数据流图和流程图都是非常重要的工具&#xff0c;它们为开发人员提供了强大的手段来分析和设计系统。尽管两者在表面上看起来有些相似&#xff0c;但它们在功能、用途和表达方式上存在显著的区别。本文将详细探讨数据流图和流程图的区别&#xff0c;…

《计算机组成及汇编语言原理》阅读笔记:p48-p81

《计算机组成及汇编语言原理》学习第 4 天&#xff0c;p48-p81 总结&#xff0c;总计 34 页。 一、技术总结 1.CISC vs RISC p49&#xff0c; complex instruction set computing For example, a complex instruction set computing (CISC) chip may be able to move a lar…

GitLab的安装与卸载

目录 GitLab安装 GitLab使用 使用前可选操作 修改web端口 修改Prometheus端口 使用方法 GitLab的卸载 环境说明 系统版本 CentOS 7.2 x86_64 软件版本 gitlab-ce-10.8.4 GitLab安装 Gitlab的rpm包集成了它需要的软件&#xff0c;简化了安装步骤&#xff0c;所以直接…

LAUNCHXL_F28379D_Workspace_CCS124

/// 安装 controlSUITE C:\ti\controlSUITE\device_support\F2837xD\v210 /// /// /// /// /// 删除 /// /// /// >> Compilation failure source_common/subdir_rules.mk:9: recipe for target source_common/F2837xD_Adc.obj failed "C:/ti/controlSUITE/devic…

封装(2)

大家好&#xff0c;今天我们来介绍一下包的概念&#xff0c;知道包的作用可以更好的面对今后的开发&#xff0c;那么我们就来看看包是什么东西吧。 6.3封装扩展之包 6.3.1包的概念 在面向对象体系中,提出了一个软件包的概念,即:为了更好的管理类,把多个类收集在一起成为一组…

Python 写的 智慧记 进销存 辅助 程序 导入导出 excel 可打印

图样&#xff1a; 就可以导入了 上代码 import tkinter as tk from tkinter import ttk import sqlite3 from datetime import datetime from tkinter import messagebox, filedialog import pandas as pd import reclass OrderSystem:def __init__(self, root):self.root r…

C++---------随机库,standfor库

意外修改原始数据 问题描述 由于引用参数允许函数直接修改原始变量&#xff0c;这可能会导致意外的修改。如果函数的使用者没有意识到函数会修改传入的参数&#xff0c;就可能引发错误。例如&#xff0c;有一个函数看起来只是用于打印一个变量的值&#xff0c;但实际上却修改了…

维克日记:私密写作新选择,轻松记录生活点滴

作为一款专注于私密写作的数字日记本&#xff0c;维克日记以其独特的设计理念和全面的功能特性&#xff0c;正在重新定义现代人记录生活的方式。这款软件不仅提供了清新简约的界面设计&#xff0c;更重要的是它完全不需要繁琐的设置就能立即开始写作。对于热爱写作的用户来说&a…

0009.基于springboot+layui的ERP企业进销存管理系统

一、系统说明 基于springbootlayui的ERP企业进销存管理系统,系统功能齐全, 代码简洁易懂&#xff0c;适合小白学编程,课程设计&#xff0c;毕业设计。 二、系统架构 前端&#xff1a;html| layui 后端&#xff1a;springboot | mybatis| thymeleaf 环境&#xff1a;jdk1.8 |…

3.4 stm32系列:定时器(PWM、定时中断)

一、定时器概述 1.1 软件定时原理 使用纯软件&#xff08;CPU死等&#xff09;的方式实现定时&#xff08;延时&#xff09;功能&#xff1b; 不精准的延迟&#xff1a; /* 微秒级延迟函数* 不精准* stm32存在压出栈过程需要消耗时间* 存在流水线&#xff0c;执行时间不确定…

【XSSed】攻防实战全记录

最后救你一次&#xff0c;不要让欲望击溃你的意志 首先整体浏览网站 进入Level1 Basic XSS 首先整体浏览网站 对源码进行分析 漏洞产生于如下代码段&#xff1a; echo($_GET[‘q’]); 直接将用户输入插入了html页面&#xff0c;没有任何过滤。 构造普通payload&#xff1…

2.6 网络面试问题

tcp 与 udp的区别 1.tcp 是基于连接的 UDP是基于数据包 2.处理并发的方式不通 a.tcp用epoll进行监听的 b. udp是模拟tcp的连接过程&#xff0c;服务端开放一个IP端口&#xff0c;收到连接后&#xff0c;服务端用另一个IP和端口发包给客户端。 3.tcp根据协议MTU黏包及…