Java框架第四课(对Spring的补充Spring web)

目录

一.Spring web的认识

(1)Spring Web概念

(2)Spring web的特点

(3)Springweb运行的流程

 (4)Springweb运行的流程图

二.搭建Spring web

三.自定义处理器类搭建

 (1)处理器类配置

 (2)处理器类接受请求

 (3)获得请求数据

 四.拦截器

(1)关于拦截器:

(2)拦截器的实现


一.Spring web的认识

(1)Spring Web概念

SpringWeb 是 spring 框架中的一个模块,基于 Servlet API 构建的 web 框架. springWeb 是 Spring 为 web 层开发提供的一整套完备的解决方案。 在 web 层框架历经 Strust1,WebWork,Strust2 等诸多产品的历代更选之后, 目前业界普遍选择了 springWeb 作为 Java EE 项目 web 层开发的首选方案。(与原生的servlet相比,不需要我们在创建多个servlet程序,Spring web只有一个Servlet)

(2)Spring web的特点

(1)SpringWEB 是 spring 家族原生产品,与 IOC 容器等基础设施无缝对接.
(2) 基于原生的 Servlet,提供了一个前端控制器 DispatcherServlet ,开发者
(3)无须额外开发控制器对象.
(4)可以自动绑定用户输入,并正确地转换数据类型.
(5)代码清新简洁,大幅度提升开发效率.
(6)内部组件化程度高,可插拔式组件即插即用.
(7)性能卓著,尤其适合现代大型、超大型互联网项目要求.

(3)Springweb运行的流程

(1)用户发送出请求到前端控制器 DispatcherServlet。
(2)DispatcherServlet 收到请求调用 HandlerMapping(处理器映射器)。
(3)HandlerMapping 找到具体的处理器(可查找 xml 配置或注解配置),生成处理器对象及处理器拦截器(如果有),再一起返回给 DispatcherServlet。
(4) DispatcherServlet 调用 HandlerAdapter(处理器适配器)。
(5)HandlerAdapter 经过适配调用具体的处理器(Handler/Controller)。
(6)Controller 执行完成向前端响应结果。

 (4)Springweb运行的流程图

 注意Springweb只有一个servlet,每次启动服务器时都会自动创建一个servlet对象,并且我们需要写的只有一个自定义处理器和拦截器,其他的都由Spring 框架帮我们实现。

二.搭建Spring web

第一步:导包,在pom.xml中导入Spring web相关的包。

第二步:在web.xml文件中配置DispatcherServlet。

第三步:开启 springweb 注解。

Spring web相关的jar包

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

 在 web.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 >
</ servlet-mapping >
开启 springweb 注解
< mvc :annotation-driven ></ mvc :annotation-driven >

三.自定义处理器类搭建

 (1)处理器类配置

@RestController 用于标记在一个类上,使用它标记的类就是一个 SpringWEB 控制器类(也就是我们原先在原始的servlet中写的servlet类).

  Spring 配置中指定了自动扫描的 basepackage 后,Spring 会扫描这些包以及子包中的使用了@RestController 标识的类,然后将类加入到 Spring IOC 容器 中,注入依赖。 @RequestMapping 注解是一个用来处理请求地址映射的注解,可用于类或方法上。(用于为该类定义类的地址和该类方法的地址,通过这两个地址就能直接找到方法,不用再用原生的servlet使用mark进行判断)

如图:

 (2)处理器类接受请求

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

 (3)获得请求数据

Spring WEB 支持对多种类型的请求参数进行封装。
1.使用原生的servlet进行请求
//前端和后端交互第一种方式:原生的Httpservlet方式@PostMapping(path = "/login")public String  login(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse){System.out.println(httpServletRequest.getParameter("account"));System.out.println(httpServletRequest.getParameter("password"));System.out.println(httpServletRequest.getRemoteAddr());System.out.println("登录");return "success";}

2.使用参数进行请求

//前端和后端交互第二种方式:通过参数发送//@RequestParam("account")是用来给方法的参数进行起名,防止方法中的参数与客户端的参数名不一致@PostMapping(path = "/login")public String  login(@RequestParam("account") String account1,@RequestParam("password") String password1){System.out.println("登录");return "success";}
Spring 会自定进行数据封装,这里要注意的是,处理器接收参数的形参名称必须 和表单的 name 属性保持一致,否则会接收失败!
当请求参数名与形参名不一致时,可以使用@RequestParam("")进行参数绑 定.
表单的 name 和控制器的形参并不一致,但是@RequestParam 注解的 value 值必须和表单的 name 保持一致

3.使用对象接受请求

    @PostMapping(path = "/login")
//*
//@RequestBody说明前端传过来的对象是Jsong格式的对象public Result login(@RequestBody Admin admin){Admin admin1=  loginservice.login(admin);Result result=new Result(200,"登陆成功",admin1);System.out.println("登录");return result;}

4.需要添加 json 转换组件

当请求过来的数据是json格式的数据时需要进行数据的转换,原生的servlet需要自己进行数据格式的转化,但是Spring web不需要。

原生的servlet数据格式转换:

response.getWriter().write(new ObjectMapper().writeValueAsString(result));
<!--jackson-->
< dependency >
< groupId >com.fasterxml.jackson.core</ groupId >
< artifactId >jackson-databind</ artifactId >
< version >2.13.3</ version >
</ dependency >
5.日期类型转换
属性类型为 Date 类型需要指定转换格式
例如:
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;

 6.返回 JSON

只需要方法中返回对象即可,框架可以自动将对象转为 json 响应
@RequestMapping(path = "/login",method = RequestMethod.POST)
public Result login(@RequestBody Admin admin){
Result result = new Result(200,"登录成功",admin1);
return result;
}

 四.拦截器
(1)关于拦截器:
Spring WEB 中的拦截器(Interceptor)类似于 Servlet 中的过滤器(Filter),
它主要用于拦截用户请求并作相应的处理。
Spring 中的拦截器与过滤器有着本质的区别,过滤器是 servlet 规范中定义并实 现的,在进入到 servlet 之前截获请求.而拦截器是 spring 中定义的一种拦截机制, 是对进入到处理器的请求进行拦截。(servlet过滤器的范围比Springweb的范围大得多)
SpringWEB 定义了拦截器接口 HandlerInterceptor
调用这个三个方法的时候,其参数的值也是从框架内部传递进来的。
boolean preHandle
预处理方法,实现处理器方法的预处理,就是在处理器方法执行之前这个方法会 被执行,相当于拦截了处理器方法,框架会传递请求和响应对象给该方法,第三 个参数为被拦截的处理器。如果 preHandle 方法返回 true 表示继续流程(如调 用下一个拦截器或处理器方法),返回 false 表示流程中断,不会继续调用其他 的拦截器或处理器方法,此时我们需要通过 response 来产生响应;

拦截器实例如下:

package com.ffyc.ssm.interceptor;import com.fasterxml.jackson.databind.ObjectMapper;
import com.ffyc.ssm.model.Result;
import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//拦截器处理方法:
/*
请求到达处理器之前进入到拦截器
返回true离开拦截器到达处理器
* */
public class AdminTokeninterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String adminToken=request.getHeader("adminToken");//获得请求头中的adminToken身份令牌System.out.println(adminToken);if(adminToken.equals("123456"))//判断客户端传来的adminToken身份令牌有没有问题,正确就放行,通过拦截器到达自定义处理器{return true;}else {Result result = new Result(400, "Token验证失败", null);response.getWriter().write(new ObjectMapper().writeValueAsString(result));}return false;}
}
(2)拦截器的实现

(1)添加 servlet api 依赖

(2)编写一个类,继承 HandlerInterceptorAdapter

(3)在xml文件中注册拦截器

<!--servlet依赖-->
< dependency >
< groupId >javax.servlet</ groupId >
< artifactId >javax.servlet-api</ artifactId >
< version >4.0.1</ version >
< scope >provided</ scope >
</ dependency >
编写一个类,继承 HandlerInterceptorAdapter
public class DemoInterceptor implements HandlerInterceptor{
/* 当请求到达控制器之前被执行
true--继续向下执行,到达下一个拦截器,或控制器
false--不会继续向下执行
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse
response, Object handler)throws Exception {
System.out.println("之前执行");
return false;
}

 

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

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

相关文章

13、Flink SQL 的 时间属性 介绍

时间属性 a)概述 Flink 可以基于几种不同的 时间 概念来处理数据。 处理时间 指的是执行具体操作时的机器时间(例如 Java的 System.currentTimeMillis()) )事件时间 指的是数据本身携带的时间,这个时间是在事件产生时的时间。摄入时间 指的是数据进入 Flink 的时间;在系…

Axure中继器动态数据图表制作

在Axure RP中&#xff0c;中继器&#xff08;Repeater&#xff09;是一个非常强大的工具&#xff0c;它允许设计者动态地展示和交互数据&#xff0c;进而创建各种复杂的数据可视化图表&#xff0c;如柱状图、条形图、堆叠图、散点图和对比图。以下将详细介绍如何使用中继器来设…

【TS高频面试题】interface与type的区别

参考文章 一、基本概念 1. type&#xff08;类型别名&#xff09; 用来给一个类型起新名字&#xff0c;使用 type 创建类型别名。 2. interface&#xff08;接口&#xff09; 专门用于定义对象的结构&#xff08;比如属性和方法&#xff09; 二、相同点 &#xff08;1&a…

持续集成与持续部署(CI/CD)的深入探讨

在现代软件开发中&#xff0c;持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;已成为不可或缺的实践。这些方法旨在加快软件交付的速度&#xff0c;同时提高软件的质量和稳定性。通过CI/CD&#xff0c;开发团队可以频繁地将代码更改集成到主分支&…

调用火山云的语音生成TTS和语音识别STT

首先需要去火山云的控制台开通TTS和STT服务语音技术 (volcengine.com) 火山这里都提供了免费的额度可以使用 我这里是使用了java来调用API 目前我还了解到阿里的开源项目SenseVoice&#xff08;STT&#xff09;和CosyVoice(TTS)非常的不错&#xff0c;但是都是使用Python开发…

prometheus删除指定metrics下收集的值

Prometheus 删除指定 Metric 官方文档&#xff1a; ​ - https://prometheus.io/docs/prometheus/latest/querying/api/#tsdb-admin-apis Prometheus 的管理 API 接口&#xff0c;官方到现在一共提供了三个接口&#xff0c;对应的分别是快照功能、数据删除功能、数据清理功能…

js 创建 React 项目

起因(目的): js 很久没写了。 react js 之前粗略看过, 最近又需要用到, 继续学习&#xff0c; 记录 积累。 1. 新建 React 项目 的几种方法。 官方建议使用 next 来创建 React 项目&#xff0c; 但是我觉得太复杂了。以后再看看. npx create-next-applatest # !!! 不建议使…

算法练习题14——leetcode84柱形图中最大的矩形(单调栈)

题目描述&#xff1a; 解题思路&#xff1a; 要解决这个问题&#xff0c;我们需要找到每个柱子可以扩展的最大左右边界&#xff0c;然后计算以每个柱子为高度的最大矩形面积。 具体步骤如下&#xff1a; 计算每个柱子左侧最近的比当前柱子矮的位置&#xff1a; 使用一个单调…

java后端保存的本地图片通过ip+端口直接访问

直接上代码吧 package com.ydx.emms.datapro.controller;import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.…

Qt中Q_PROPERTY的作用,以及必要性和使用场景

作为一个跨平台框架&#xff0c;Qt没有依赖那些非标准的编译器特性&#xff0c;比如&#xff1a;__property或者[property]。Qt的解决方案适用于Qt支持平台下的任何标准C编译器。它基于元对象系统&#xff08;Meta Object Sytstem&#xff09;&#xff0c;该系统还提供了信号槽…

linux curl命令介绍以及使用

文章目录 curl 简介curl 的安装基本用法发送GET请求将响应内容保存到文件显示请求的头部信息发送POST请求上传文件携带请求头处理重定向通过代理发送请求下载文件指定请求的超时时间 高级用法模拟浏览器行为保持会话&#xff08;Cookie&#xff09;验证HTTPS请求总结 在Linux中…

函数式接口实现策略模式

函数式接口实现策略模式 1.案例背景 我们在日常开发中&#xff0c;大多会写if、else if、else 这样的代码&#xff0c;但条件太多时&#xff0c;往往嵌套无数层if else,阅读性很差&#xff0c;比如如下案例&#xff0c;统计学生的数学课程的成绩&#xff1a; 90-100分&#…

idea添加本地环境执行模版

用Flink的环境执行时&#xff0c;因为最后会打包放服务器&#xff0c;所以有些jar包将不会打包上传&#xff0c;这些jar包用<scope>provided</scope>标记 所以这些jar包在本地运行时也会不提供&#xff0c;为了程序在本地能跑&#xff0c;我们每次执行是需手动添加…

使用matlab的热门问题

MATLAB广泛应用于科学计算、数据分析、信号处理、图像处理、机器学习等多个领域&#xff0c;因此热门问题也涵盖了这些方面。以下是一些可能被认为当前最热门的MATLAB问题&#xff1a; 深度学习与神经网络&#xff1a; 如何使用MATLAB的深度学习工具箱&#xff08;Deep Learni…

vue3 el-menu 菜单Maximum recursive updates exceeded 报错

vue3 用el-menu实现管理后台左侧菜单&#xff0c;报Uncaught (in promise) Maximum recursive updates exceeded in component <ElMenu>. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possib…

Monorepo学习笔记

Monorepo学习笔记 使用 pnpm 配置 monorepo 1、创建项目 mkdir stars-ui && cd stars-ui && pnpm init mkdir packages docs2、.gitignore # Logs logs *.log npm-debug.log* yarn-debug.log* yarn-error.log* pnpm-debug.log* lerna-debug.log*node_modules…

自然语言处理系列五十》文本分类算法》SVM支持向量机算法原理

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》&#xff08;人工智能科学与技术丛书&#xff09;【陈敬雷编著】【清华大学出版社】 文章目录 自然语言处理系列五十SVM支持向量机》算法原理SVM支持向量机》代…

javascript利用for循环输出0-100的数

for循环语句是 for(起始数值&#xff1b;循环条件;自增符&#xff09;&#xff5b; 循环体 &#xff5d; 利用for循环输出1-100的数 代码如下 <script> for(var i1;i<100;i) {document.write(这是第${i}个数<br>) } </script> 这段代码。首先在fo…

JAVA-接口(一万四千字讲解)

目录 一、接口的概念 二、语法规则 三、接口使用 四、接口特性 五、实现多个接口 六、接口间的继承 七、接口使用实例 1.Comparable 2.写一个自己的sort 3.Comparator 八、类的克隆Clonable 1.Clonable接口 2.浅拷贝 3.深拷贝 九、抽象类和接口的区别 十、 Obje…

芯片时钟树评估的关键性能参数

前面有很多文章都介绍了PI性能的影响&#xff0c;也介绍了PSIJ对信号或时钟性能的影响&#xff0c;对于SOC设计&#xff0c;为了更好的理解电源完整性在芯片设计中的重要作用&#xff0c;对芯片的时钟树设计需要足够理解才能更好的明白电源完整性的影响。 时钟分布网络设计一直…