Spring Boot:Web开发之三大组件的整合

Spring Boot

  • 前言
  • Spring Boot 整合 Servlet
  • Spring Boot 整合 Filter
  • Spring Boot 整合 Listener

在这里插入图片描述

前言

在 Web 开发中,Servlet 、Filter 和 Listener 是 Java Web 应用中的三大组件。Servlet 是 Java 代码,通过 Java 的 API 动态的向客户端输出内容。Filter 是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。Listener 是监听器,可以监听客户端的请求、服务端的操作等,通过监听器可以自动激发一些操作。

而 Spring Boot 为 Web 开发提供了强大的支持,整合了常用的 Web 框架(如 Spring MVC ),并默认支持 Web 开发中的一些通用功能。在 Spring Boot 项目中,可以通过注解等方式轻松实现 Servlet 、Filter 、Listener 等组件的整合,从而简化 Web 应用的开发过程。下面简单介绍 Spring Boot 整合 Java Web 应用中的三大组件。

Spring Boot 整合 Servlet

Spring Boot 为 Servlet API 提供了自动配置,整合过程相对简单。而将传统的 Servlet 组件集成到 Spring Boot 的应用中具体有两种方法。

简单示例:
第一种方法:
首先,在 Controller 包内创建 ServletDemo 类,使用 @WebServlet 注解配置 Servlet 映射

package cn.edu.SpringBootDemo.Controller;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

@WebServlet(urlPatterns = "/ServletDemo.html")
public class ServletDemo extends HttpServlet {
    // 覆盖 doGet() 方法
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("调用 ServletDemo 的 doGet 方法!!!");
    }
}

然后,在 Spring Boot 启动类 SpringBootDemoApplication 上添加 @ServletComponentScan 注解

package cn.edu.SpringBootDemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@SpringBootApplication
@ServletComponentScan // 用于启用对带有 @WebServlet、@WebFilter、@WebListener 等 Servlet 3.0 注解的类的自动扫描和注册
public class SpringBootDemoApplication {

    public static void main(String[] args) {

        SpringApplication.run(SpringBootDemoApplication.class, args);
    }
}

最后,启动 Spring Boot ,打开浏览器输入 http://localhost:8080/ServletDemo.html 并按下回车键进行测试
结果如图:
在这里插入图片描述

第二种方法:
第二种方法与第一种方法的区别是无需使用到 @WebServlet 和 @ServletComponentScan 两个注解,而是使用一个返回类型为 ServletRegistrationBean 的方法替代。

首先,在 ServletDemo 类上注释 @WebServlet 注解

package cn.edu.SpringBootDemo.Controller;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

//@WebServlet(urlPatterns = "/ServletDemo.html")
public class ServletDemo extends HttpServlet {
    // 覆盖 doGet() 方法
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("第二种方法:调用 ServletDemo 的 doGet 方法!!!");
    }
}

然后,在 Spring Boot 启动类 SpringBootDemoApplication 上也注释 @ServletComponentScan 注解,并添加一个返回类型为 ServletRegistrationBean 的方法
在这里插入图片描述

package cn.edu.SpringBootDemo;

import cn.edu.SpringBootDemo.Controller.ServletDemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
//@ServletComponentScan // 用于启用对带有 @WebServlet、@WebFilter、@WebListener 等 Servlet 3.0 注解的类的自动扫描和注册
public class SpringBootDemoApplication {

    public static void main(String[] args) {

        SpringApplication.run(SpringBootDemoApplication.class, args);
    }

    @Bean // 注入 Spring 容器当中
    public ServletRegistrationBean getBean(){
        // Servlet 注册到 Spring Boot 当中
        ServletRegistrationBean bean = new ServletRegistrationBean(new ServletDemo());
        // url 地址关联
        bean.addUrlMappings("/ServletDemo.html");
        return bean;
    }
}

最后,启动 Spring Boot ,打开浏览器输入 http://localhost:8080/ServletDemo.html 并按下回车键进行测试
结果如图:
在这里插入图片描述

Spring Boot 整合 Filter

在 Spring Boot 中,整合 Filter 通常涉及到创建 Filter 类,并通过配置将其注册到 Servlet 容器中,具体有两种方法,与整合 Servlet 类似。

简单示例:
第一种方法:
首先,在项目中创建 Web 包并在其包内创建一个 FilterDemo 类,使用 @WebFilter 注解配置 Filter 映射

package cn.edu.SpringBootDemo.Web;

import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;

import java.io.IOException;

@WebFilter(filterName = "FilterDemo",urlPatterns = {"/ServletDemo.html"})
public class FilterDemo implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println(" FilterDemo 拦截器拦截进行处理");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println(" FilterDemo 拦截器已经让其放行");
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

然后,在 Spring Boot 启动类 SpringBootDemoApplication 上添加 @ServletComponentScan 注解
在这里插入图片描述

最后,启动 Spring Boot ,打开浏览器输入 http://localhost:8080/ServletDemo.html 并按下回车键进行测试
结果如图:
在这里插入图片描述

第二种方法:
第二种方法与第一种方法的区别也是无需使用到 @WebFilter 和 @ServletComponentScan 两个注解,而是使用一个返回类型为 FilterRegistrationBean 的方法替代。

首先,在 FilterDemo 类上注释 @WebFilter 注解
在这里插入图片描述

然后,在 Spring Boot 启动类 SpringBootDemoApplication 上也注释 @ServletComponentScan 注解,并添加一个返回类型为 FilterRegistrationBean 的方法
在这里插入图片描述

@Bean
public FilterRegistrationBean getFilterBean(){
    FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new FilterDemo());
    filterRegistrationBean.addUrlPatterns("/ServletDemo.html");
    return filterRegistrationBean;
}

最后,启动 Spring Boot ,打开浏览器输入 http://localhost:8080/ServletDemo.html 并按下回车键进行测试
结果如图:
在这里插入图片描述

Spring Boot 整合 Listener

在 Spring Boot 中,整合 Listener 通常涉及到创建 Listener 类,并实现相应的 Servlet API 监听器接口,具体有两种方法,与整合 Servlet 类似。

Servlet API 监听接口

  • ServletContextListener:用于监听 Web 应用( ServletContext )的生命周期事件。当 Web 应用启动或关闭时,可以执行一些初始化和清理工作
  • HttpSessionListener:用于监听用户会话( HttpSession )的生命周期事件。当会话创建或销毁时,可以执行一些与用户会话相关的逻辑
  • ServletRequestListener:用于监听 HTTP 请求( ServletRequest )的生命周期事件。当请求开始和结束时,可以执行一些与请求相关的逻辑
  • 属性监听器:用于监听 Web 应用、会话或请求中的属性变化事件。当属性被添加、替换或移除时,可以执行相应的逻辑
    ServletContextAttributeListener:监听 ServletContext 属性的变化
    HttpSessionAttributeListener:监听 HttpSession 属性的变化
    ServletRequestAttributeListener:监听 ServletRequest 属性的变化

简单示例:
第一种方法:

首先,在 Web 包内创建一个 ListenerDemo 类,使用 @WebListener 注解配置 Listener 映射

package cn.edu.SpringBootDemo.Web;

import jakarta.servlet.ServletContextEvent;
import jakarta.servlet.ServletContextListener;
import jakarta.servlet.annotation.WebListener;

@WebListener
public class ListenerDemo implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("系统初始化!!!");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {

    }
}

然后,同样在 Spring Boot 启动类 SpringBootDemoApplication 上添加 @ServletComponentScan 注解
在这里插入图片描述

最后,启动 Spring Boot 进行测试
结果如图:
在这里插入图片描述

第二种方法:
同样地,第二种方法与第一种方法的区别也是无需使用到 @WebListener 和 @ServletComponentScan 两个注解,而是使用一个返回类型为 ServletListenerRegistrationBean 的方法替代。

首先,在 ListenerDemo 类上注释 @WebListener 注解
在这里插入图片描述

然后,在 Spring Boot 启动类 SpringBootDemoApplication 上也注释 @ServletComponentScan 注解,并添加一个返回类型为 ServletListenerRegistrationBean 的方法
在这里插入图片描述

@Bean
public ServletListenerRegistrationBean getListenerBean(){
    ServletListenerRegistrationBean servletListenerRegistrationBean = new ServletListenerRegistrationBean(new ListenerDemo());
    return servletListenerRegistrationBean;
}

最后,启动 Spring Boot 进行测试
结果如图:
在这里插入图片描述

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

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

相关文章

SpringMvc之映射器HandlerMapping

简介 在springmvc的处理流程中,第一步就是查询请求对应的映射器,然后组装成处理器链处理请求,本文意在梳理该过程 重要实现 HandlerMapping是一个接口,该接口用于通过HttpServletRequest寻找对应的处理器,接口介绍如下…

python学习15:python中的input语句

python中的input语句 我们前面学习过print语句,可以将内容输出到屏幕上;在python中,与之对应的还有一个input语句,用来获取键盘输入。 数据输出:print 数据输入:input 使用上也很简单: 使用inp…

31-3 文件包含漏洞 - 文件包含漏洞利用(CVE-2021-3019:Lanproxy 任意文件读取漏洞复现)

一、Lanproxy简介: lanproxy是一个将局域网个人电脑、服务器代理到公网的内网穿透工具,支持TCP流量转发,可支持任何TCP上层协议(访问内网网站、本地支付接口调试、SSH访问、远程桌面等)。 二、漏洞概述: Lanproxy1.0 版本存在目录遍历漏洞,可通过绕过路径限制(../)来…

量化交易入门(二十四)MTM指标买卖逻辑和回测

MTM指标可以用来指导买卖决策,其基本逻辑如下: 买入信号: 当MTM从负值上穿0线,并向上突破某个阈值(如20)时,表明上升动力充足,可以考虑买入。当MTM在0线上方并持续上升,创出新高时,表明上升趋势强劲,可以考虑加仓或持有。 卖出信号: 当MTM从正值下穿0线,并向下突破某个阈值(如-…

C++中stack的用法及其解析

一、stack的介绍 1.stack是一个容器适配器,它的名字叫做栈 专门用在后进先出的上下文环境中的,它的删除与插入操作只能从容器的一端进行。形象一点,就好像一个容器里放东西,先放进去的就在底部,要想拿出来,…

华为昇腾asend

昇腾Ascend C编程语言 Ascend C原生支持C/C编程规范,通过多层接口抽象、并行编程范式、孪生调试等技术,极大提高了算子的开发效率,帮助AI 参考文章 手把手教你在昇腾平台上搭建PyTorch训练环境 - 哔哩哔哩 (bilibili.com)https://www.bilibi…

PCL点云处理之重复随机采样一致性(RRANSAC法)平面拟合(二百三十七)

PCL点云处理之重复随机采样一致性(RRANSAC法)平面拟合(二百三十七) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 pcl::SAC_RRANSAC"是 PCL库中的一个方法,是 RANSAC 方法的改进版本,通过多次重复采样和模型拟合来提高鲁棒性。RRANSAC 的思想是在 RANSAC 的基…

双网卡环境概率出现DNS解析错误

测试环境 VMware Rocky Linux 9 虚拟机, 双网卡(eth0和eth1)配置如下: eth0 10.206.216.27/24 DNS 10.204.16.18 eth1 192.168.1.27/24 DNS 192.168.1.1问题描述 手动配置eth1的DNS后,网络不通,通过抓包发现是eth1的DNS server配置有误…

最新海外投资理财源码 amazon多语言投资理财系统源码 区块链理财项目平台源码 共享充电宝系统

一款新UI的海外多语言刷单系统,支持后台在线添加订单派单、预约派单、余额宝等功能 源码下载:https://download.csdn.net/download/m0_66047725/88949885 更多资源下载:关注我。

Vue使用el-statistic和el-card显示大屏中的统计数据

​ 一、页面内容&#xff1a; <el-row :gutter"20"><el-col :span"6"><el-card class"box-card"><div><el-statisticgroup-separator",":precision"2":value"value2":title"tit…

上位机图像处理和嵌入式模块部署(qmacvisual图像修复)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 qmacvisual提供了一个图像修复的功能。所谓的图像修复&#xff0c;就是对图像中缺省的部分进行修补&#xff0c;它的操作&#xff0c;其实分成两个…

深入理解SSL协议:从理论到实践(二)

前言 这是一篇关于SSL协议的技术文章&#xff0c;有理论知识&#xff0c;但又兼具一定的实战性&#xff0c;文章的主要内容分享了SSL协议的核心概念、工作原理、常见的应用场景&#xff0c;以及就https这种实际应用场景&#xff0c;又着重分享具体的工作原理以及如何实现https…

【性能优化】 【回溯】 【字符串】1307. 口算难题

作者推荐 视频算法专题 本文涉及知识点 数学 回溯 字符串 性能优化 LeetCode1307. 口算难题 给你一个方程&#xff0c;左边用 words 表示&#xff0c;右边用 result 表示。 你需要根据以下规则检查方程是否可解&#xff1a; 每个字符都会被解码成一位数字&#xff08;0 - …

R: 网状Meta分析进行模型构建及图形绘制

网状meta分析的制作步骤主要包括&#xff1a; 1. 绘制网状证据图 2. 普通Meta分析&#xff08;两两之间的直接比较&#xff09; 3. 网状Meta分析&#xff08;整合直接比较和间接比较的结果&#xff0c;绘制相关图形&#xff09; 4. 绘制累积概率排序图 5. 三个假设的检验…

【Linux】网络基础1

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 目录 &#x1f449;&#x1f3fb;一些常见网络设备&#x1f449;&#x1f3fb;网络协议(栈)&#x1f449;&#x1f3fb;协议分层OSI参考模型每个层…

CCF-CSP真题202206-2《寻宝!大冒险!》

题目背景 暑假要到了。可惜由于种种原因&#xff0c;小 P 原本的出游计划取消。失望的小 P 只能留在西西艾弗岛上度过一个略显单调的假期……直到…… 某天&#xff0c;小 P 获得了一张神秘的藏宝图。 问题描述 西西艾弗岛上种有 n 棵树&#xff0c;这些树的具体位置记录在…

【沐风老师】3DMAX顶点投影插件VertexProjection使用方法详解

3DMAX顶点投影插件VertexProjection使用教程 3DMAX顶点投影插件VertexProjection&#xff0c;将可编辑多边形顶点向下投影到网格对象表面。可以对可编辑多边形对象上的所有顶点或部分顶点进行投影。主要用于地形建模、道路交通等领域。 【适用版本】 3dMax 2010 - 2024&#x…

【前端】layui学习笔记

参考视频&#xff1a;LayUI 1.介绍 官网&#xff1a;http://layui.apixx.net/index.html 国人16年开发的框架,拿来即用,门槛低 … 2. LayUi的安装及使用 Layui 是一套开源的 Web UI 组件库&#xff0c;采用自身轻量级模块化规范&#xff0c;遵循原生态的 HTML/CSS/JavaScript…

解决VMWare Esxi 6.5.0 导出虚拟机时发生网络错误

解决办法&#xff1a;使用vmware ovftool工具导出。 1 先安装该工具到windows下面&#xff0c;有32位的和64位的 2 用管理员进入命令方式&#xff1a; 进入&#xff1a;c:\windows 进入工具命令当前文件夹&#xff08;具体看用户的安装路径&#xff09;&#xff1a; cd \p…

Docket常见的软件部署1

1 安装MySQL # 查看MySQL镜像 docker search mysql # 拉起镜像 docker pull mysql:5.7 # 创建MySQL数据映射卷&#xff0c;防止数据不丢失 mkdir -p /hmoe/tem/docker/mysql/data/ # 启动镜像 docker run -d --name mysql -e MYSQL_ROOT_PASSWORD123456 -p 3306:3306 -v /home…