SpringBoot的WebServlet的兼容

news/2025/3/16 19:11:56/文章来源:https://www.cnblogs.com/5ran2yl/p/18775441

一.使用SpringBean注册JavaWeb的三大组件

在 Spring Boot 中,使用 @Bean 注册的 Servlet、Filter 和 Listener 组件会被加载到 Servlet 容器 中管理,而不是直接由 Spring 容器管理。然而,Spring Boot 提供了一些机制来确保这些组件能够与 Spring 容器无缝集成。

  • Servlet 容器:负责处理 HTTP 请求和响应,如 Tomcat、Jetty 或 Undertow。
  • Spring 容器:负责管理 Spring 应用程序中的 Bean 生命周期和依赖注入。

注册 Servlet、Filter 和 Listener

  • 当你在 Spring Boot 配置类中使用 @Bean 注册 Servlet、Filter 和 Listener 时,Spring Boot 会将这些组件注册到嵌入式的 Servlet 容器中。
  • 这些组件仍然可以通过 Spring 的依赖注入机制获得其他 Spring 管理的 Bean,但它们的实际生命周期和调用是由 Servlet 容器管理的。

 使用JavaWeb中的组件需要导入相关的依赖,但是如果springBoot导入的springWeb的依赖就不需要这么麻烦了,因为SpringWeb内置了JavaWeb中的组件,即向下兼容

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

 

 Servlet组件

 在 Java Web 开发中,Servlet 是一个核心组件,用于处理客户端(通常是浏览器)发送的 HTTP 请求,并生成相应的响应。Servlet 是 Java 平台上的服务器端程序,运行在支持 Java 的应用服务器或 Servlet 容器

  • Servlet 是 Java Web 应用程序的核心组件,负责处理 HTTP 请求并生成响应。
  • Servlet 的生命周期包括初始化、服务和销毁阶段,由 Servlet 容器管理。
  • 可以通过注解(如 @WebServlet)或 web.xml 文件来配置 Servlet。
  • Servlet 可以与 Spring 容器集成,利用 Spring 的依赖注入和其他功能

 使用示例:

Servlet1

//继承HttpServlet
public class servlet1 extends HttpServlet {// 重写doGet方法
    @Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 输出hello,Servlet1System.out.println("hello,Servlet1");// 将hello,Servlet1写入响应resp.getWriter().write("hello,Servlet1");}
}

 

Servlet2

//继承HttpServlet类
public class Servlet2 extends HttpServlet {//重写doGet方法
    @Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("hello,servlet2");resp.getWriter().write("hello,servlet2");}
}

 

使用config类注入Bean

@Configuration
public class CreateBean {@Beanpublic servlet1 creates1(){return new servlet1();}@Beanpublic Servlet2 creates2(){return new Servlet2();}
}

 

结果1:

 结果2:

 注意点:

 如果出现访问不了的情况可以去看我的另外一篇博客:SpringBoot集成WebServlet出现自定义单servlet请求失败的问题

 Filter组件

在 Java Web 开发中,Filter(过滤器) 是一个重要的组件,用于拦截和处理 HTTP 请求和响应。过滤器可以在请求到达目标 Servlet 之前或响应返回给客户端之前执行一些预处理或后处理操作。这使得过滤器成为实现横切关注点

  • Filter 是 Java Web 应用程序中的一个重要组件,用于拦截和处理 HTTP 请求和响应。
  • 过滤器可以在请求到达目标 Servlet 之前或响应返回给客户端之前执行预处理或后处理操作。
  • 过滤器的生命周期包括初始化和销毁阶段,由 Servlet 容器管理。
  • 可以通过注解(如 @WebFilter)或 web.xml 文件来配置过滤器。
  • 过滤器适用于实现横切关注点,如日志记录、认证、压缩等。

使用示例:

创建Filter类:

//实现Filter接口
public class MyFilter implements Filter {// 实现Filter接口,重写doFilter方法
    @Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {// 打印进入filter的提示信息System.out.println("进入filter!");// 调用FilterChain的doFilter方法,继续执行下一个过滤器或目标资源
        filterChain.doFilter(servletRequest,servletResponse);// 打印出filter的提示信息System.out.println("出filter!");}
}

 

注册Bean:

   @Beanpublic MyFilter createFilter(){return new MyFilter();}

 

发起一个请求之后的控制台输出:

 Listener组件

在 Java Web 开发中,Listener(监听器) 是一种用于监听和响应特定事件的组件。这些事件通常与 Servlet 上下文(ServletContext)、HTTP 会话(HttpSession)或请求(ServletRequest)的生命周期相关。监听器允许你在这些事件发生时执行自定义逻辑

监听 Servlet 上下文事件

  • Context Initialization: 当 Web 应用程序启动时触发。
  • Context Destruction: 当 Web 应用程序停止时触发。
  • Attribute Changes: 监听 ServletContext 属性的变化(添加、删除、替换)。

使用示例

Java代码:

//实现ServletContextListener接口
public class MyListener implements ServletContextListener {// 实现ServletContextListener接口,用于监听Web应用的初始化和销毁事件
    @Overridepublic void contextInitialized(ServletContextEvent sce) {// 当Web应用初始化完成时,执行该方法System.out.println("---Web应用初始化完成---");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {// 当Web应用销毁前,执行该方法System.out.println("---Web应用销毁前---");}
}

 

使用config类注入:

  @Beanpublic MyListener createListener(){return new MyListener();}

 

结果:

springBoot服务启动时

 springBoot服务关闭时

 二.其它注入JavaWeb组件的方式

RegistrationBean注入

在前面的配置都不变的情况下,清空config文件中的注入Bean的方式,修改为

@Configuration
@SuppressWarnings("all")
public class CreateBean {// 创建一个名为s1的ServletRegistrationBean,映射路径为"/s1"
    @Beanpublic ServletRegistrationBean s1(){return new ServletRegistrationBean(new servlet1(),"/s1");}// 创建一个名为s2的ServletRegistrationBean,映射路径为"/s2"
    @Beanpublic ServletRegistrationBean s2(){return new ServletRegistrationBean(new Servlet2(),"/s2");}// 创建一个名为f1的FilterRegistrationBean,映射路径为"/s1"
    @Beanpublic FilterRegistrationBean f1(){FilterRegistrationBean bean = new FilterRegistrationBean(new MyFilter());bean.setUrlPatterns(Arrays.asList("/s1"));return bean;}// 创建一个名为l1的ServletListenerRegistrationBean
    @Beanpublic ServletListenerRegistrationBean l1(){return new ServletListenerRegistrationBean(new MyListener());}
}

 

测试结果(三个组件一起):

 注解声明式注入

这里可以将config配置类整个都删掉,我们将使用新的方式来完成注入

@WebServlet @WebFilter @WebListener

servlet1:

@WebServlet("/s1")
//继承HttpServlet
public class servlet1 extends HttpServlet {// 重写doGet方法
    @Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 输出hello,Servlet1System.out.println("hello,Servlet1");// 将hello,Servlet1写入响应resp.getWriter().write("hello,Servlet1");}
}

 

servlet2:

@WebServlet("/s2")
//继承HttpServlet类
public class Servlet2 extends HttpServlet {//重写doGet方法
    @Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("hello,servlet2");resp.getWriter().write("hello,servlet2");}
}

 

Filter:

@WebFilter
//实现Filter接口
public class MyFilter implements Filter {// 实现Filter接口,重写doFilter方法
    @Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {// 打印进入filter的提示信息System.out.println("进入filter!");// 调用FilterChain的doFilter方法,继续执行下一个过滤器或目标资源
        filterChain.doFilter(servletRequest,servletResponse);// 打印出filter的提示信息System.out.println("出filter!");}
}

 

Listener:

@WebListener
//实现ServletContextListener接口
public class MyListener implements ServletContextListener {// 实现ServletContextListener接口,用于监听Web应用的初始化和销毁事件
    @Overridepublic void contextInitialized(ServletContextEvent sce) {// 当Web应用初始化完成时,执行该方法System.out.println("---Web应用初始化完成---");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {// 当Web应用销毁前,执行该方法System.out.println("---Web应用销毁前---");}
}

 

最后记得在启动器上追加上@ServletComponetScan注解,加上之后才会在spring容器启动后进行自动扫描

@SpringBootApplication
@ServletComponentScan
public class SpringBoot01Application {public static void main(String[] args) {SpringApplication.run(SpringBoot01Application.class, args);}}

 

结果(三个组件一起):

 

 

----END----

 

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

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

相关文章

第二章课上练习

TempConvert.py TempStr = input("请输入带有符号的温度值:") if TempStr[-1] in [F,f]: C = (eval(TempStr[0:-1]) - 32)/1.8 print("转换后的温度是{:.2f}C".format(C)) elif TempStr[-1] in [C,c]: F = 1.8*eval(TempStr[0:-1])+32 print("转换后…

叠加等边三角形

import turtle 设置画布和画笔 screen = turtle.Screen() screen.bgcolor("white") # 设置背景颜色 pen = turtle.Turtle() pen.shape("turtle") # 设置画笔形状为小乌龟 pen.color("blue") # 设置画笔颜色 pen.pensize(2) # 设置画笔…

Citia Composer2024软件下载与安装教程

CATIA是法国达索公司的产品开发旗舰解决方案。作为PLM协同解决方案的一个重要组成部分,CATIA软件具有以下主要功能和应用领域:‌设计‌:提供从概念设计到最终产品形成的完整设计能力,支持2D、3D、参数化混合建模及数据管理‌3。 ‌分析‌:进行产品分析和仿真,确保设计的可…

Peach-Printer2.0 Web 打印服务解决方案

Peach-Printer1.0在沉寂许久后迎来了一个使用客户,非常感谢客户的支持和理解。 通过客户的使用反馈本人尝试对1.0版本进行完善修改,但始终打印效果未能实现预期。思索许久后决心更改打印控件的底层框架,重新设计打印组件。通过一段时间的摸索与研究终于在3月11日推出了第一个…

老八股谈事务处理,到底在谈什么?

hello, 我是马甲哥, 这是我的第184篇原创技术文章, 也是周志明的软件架构课的读书笔记。 1. 事务处理的目标:数据状态的一致性 当我们谈事务处理,就是在谈确保数据状态的一致性Consistency。 一致性: 确保数据是正确的,不同数据间不会产生矛盾 (这里的一致性与分布式共…

信息论基础(持续更新)

熵、相对熵与互信息 熵 定义:一个离散型随机变量 \(X\) 的熵 \(H(X)\) 定义为: \[H(X)=-\sum_{x \in X}p(x) \log p(x) \]注释:\(X\) 的熵又可以理解为随机变量 \(\log \frac{1}{p(X)}\) 的期望值 引理\(H(X) \geq 0\) \(H_b(X)=(\log_ba)H_a(X)\)二元熵: \[H(X)= -p\log p…

数分笔记2

目录数项级数敛散性定义敛散性例:等比级数(几何级数)定理(级数 \(\sum a_n\) 的 Cauchy 收敛准测)例:\(p\)-级数(\(p>0\),实常数)命题“线性性”定义余项正项级数定义正项级数定理正项数列收敛的充要条件定理(比较原则)DAlembert(达朗贝尔判别法)(比式(比值)…

3.15总结

P1305 新二叉树 首先介绍一下何为先序遍历: 在二叉树中,对于每一对父亲与左右儿子,都按照{父亲,左儿子,右儿子}的顺序来遍历 例如有这样一棵树: 先序遍历的顺序:遍历1,输出“1” 遍历1的左儿子3,输出“3”遍历3的左儿子5,输出“5” 5没有左右儿子,返回3 遍历3的右儿…

SpringBoot配置文件的使用

一.全局文件配置 Spring Boot 使用全局配置文件来允许开发者自定义应用程序的配置。这些配置文件可以用来修改自动配置的设置,或者添加新的配置项。 配置文件的位置和命名:application.properties 或 application.yml:默认情况下,Spring Boot 会在以下位置查找配置文件,并…

SpringBoot配置

一.全局文件配置 Spring Boot 使用全局配置文件来允许开发者自定义应用程序的配置。这些配置文件可以用来修改自动配置的设置,或者添加新的配置项。 配置文件的位置和命名:application.properties 或 application.yml:默认情况下,Spring Boot 会在以下位置查找配置文件,并…

[vue]实现一个天气预报页面

Vue学习笔记之用Vue3+ element plus + axios实现一个天气预报页面前言 使用vue3 + element plus + axios。效果:步骤创建项目并安装依赖npm create vue@latestcd vue3-demo1 npm install npm run devnpm install --save axios vue-axios npm install element-plus --savemain.…