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

2024-09-03 06:36

本文主要是介绍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;
}

 

这篇关于Java框架第四课(对Spring的补充Spring web)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1132297

相关文章

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

SpringBoot日志级别与日志分组详解

《SpringBoot日志级别与日志分组详解》文章介绍了日志级别(ALL至OFF)及其作用,说明SpringBoot默认日志级别为INFO,可通过application.properties调整全局或... 目录日志级别1、级别内容2、调整日志级别调整默认日志级别调整指定类的日志级别项目开发过程中,利用日志

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有