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

news2024/11/18 2:23:07

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 进行测试
结果如图:
在这里插入图片描述

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

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

相关文章

7.3*3卷积核生成

1.卷积核 在数字图像处理中的各种边沿检测、滤波、腐蚀膨胀等操作都离不开卷积核的生成。下面介绍如何生成各种3X3的卷积核。为后面的数字图像操作打下基础。   由于图像经过卷积操作后会减少两行两列,因此在生成卷积核的时候一般会对图像进行填充,填充…

day 36 贪心算法 part05● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

一遍过。首先把区间按左端点排序,然后右端点有两种情况。 假设是a区间,b区间。。。这样排列的顺序,那么 假设a[1]>b[0],如果a[1]>b[1],就应该以b[1]为准,否则以a[1]为准。 class Solution { public:static bo…

一个基于.NET Core构建的简单、跨平台、模块化的商城系统

前言 今天大姚给大家分享一个基于.NET Core构建的简单、跨平台、模块化、完全开源免费(MIT License)的商城系统:Module Shop。 商城后台管理端功能 商品:分类、品牌、单位、选项(销售属性)、属性、属性模…

人脸68关键点与K210疲劳检测

目录 人脸68关键点检测 检测闭眼睁眼 双眼关键点检测 计算眼睛的闭合程度: 原理: 设置阈值进行判断 实时监测和更新 拓展:通过判断上下眼皮重合程度去判断是否闭眼 检测嘴巴是否闭合 提取嘴唇上下轮廓的关键点 计算嘴唇上下轮廓关键点之间的距…

LangChain入门:2.OpenAPI调用ChatGPT模型

快速入门 本篇文章正式进入LangChain的编码阶段,今天实现的功能是使用OpenAPI调用ChatGPT模型来进行文本问答。 1. 申请OpenAPI的访问令牌 这里介绍两种获取到OpenAPI访问令牌的方式,大家按照自己需求进行选择,之后的文章我会基于第二种选…

政安晨:【深度学习神经网络基础】(二)—— 神经元与层

政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 神经元是深度学习神经网络中的基本单元,模拟了…

淘宝详情数据采集(商品上货,数据分析,属性详情,价格监控),海量数据值得get

淘宝详情数据采集涉及多个环节,包括商品上货、数据分析、属性详情以及价格监控等。在采集这些数据时,尤其是面对海量数据时,需要采取有效的方法和技术来确保数据的准确性和完整性。以下是一些关于淘宝详情数据采集的建议: 请求示…

DevSecOps平台架构系列-互联网企业私有化DevSecOps平台典型架构

目录 一、概述 二、私有化DevSecOps平台建设思路 2.1 采用GitOps公有云建设 2.2 采用GitOps私有云建设 2.3 总结 三、GitOps及其生态组件 3.1 采用GitOps的好处 3.1.1 周边生态系统齐全 3.1.2 便于自动化的实现 3.1.3 开发人员属性GitOps 3.2 GitOps部分生态组件介绍…

红黑树的Java实现

红黑树的Java实现 文章目录 红黑树的Java实现一、概述二、添加元素三、删除元素四、完整代码总结 一、概述 红黑树也是一种二叉平衡搜索树,向比与AVL树,是一种弱平衡树。因为AVL树是通过平衡因子,左右树的高度相差不能大于1来保证平衡&#…

实测梳理一下kafka分区分组的作用

清空topickafka-topics.sh --bootstrap-server localhost:9092 --delete --topic second创建分区kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 3 --topic second发kafka-console-producer.sh --bootstrap-server localhos…

ospf实验

基础配置 如上图所示,按照上图所示的配置,俩个路由器之间按照12.12.12.X/30网段配置,左端的路由器和交换机之间按照192.168.1.X网段配置,右端的路由器和交换机之间按照192.168.2.X网段配置,下面的两个pc机按照所对应的…

Java 学习和实践笔记(48):怎样用二维数组来存储表格数据?

怎样用数组的方式,来存储下面这个表格的数据? 示例代码如下: import java.util.Arrays;public class Test001 {public static void main(String[] args) {/*object类对象是类层次结构的根。每个类都有Object作为超类。所有对象,包…

使用llamafile 构建本地大模型运用

安装 https://github.com/Mozilla-Ocho/llamafile 下载 大模型文件,选择列表中任意一个 wget https://huggingface.co/jartine/llava-v1.5-7B-GGUF/resolve/main/llava-v1.5-7b-q4.llamafile?downloadtrue https://github.com/Mozilla-Ocho/llamafile?tabre…

软件部署资源计算工具:精确评估资源需求

软件部署资源计算工具:精确评估资源需求 在当今快速发展的信息技术时代,软件部署已成为企业运营不可或缺的一部分。然而,一个常见的挑战是如何精确评估软件部署所需的资源。资源评估不仅关系到软件的性能和稳定性,还直接影响到成…

区块链食品溯源案例实现(二)

引言 随着前端界面的完成,我们接下来需要编写后端代码来与区块链网络进行交互。后端将负责处理前端发送的请求,调用智能合约的方法获取食品溯源信息,并将结果返回给前端。 通过前后端的整合,我们可以构建一个食品溯源系统&#xf…

【第三方登录】Twitter

创建应用 APPID 和 相关回调配置 重新设置api key 和 api secret 设置回调和网址 还有 APP的类型 拿到ClientID 和 Client Secret 源码实现 获取Twitter 的登录地址 public function twitterUrl() {global $db,$request,$comId;require "inc/twitter_client/twitte…

2018年亚马逊云科技推出基于Arm的定制芯片实例

2018年,亚马逊云技术推出了基于Arm的定制芯片。 据相关数据显示,基于Arm的性价比比基于x86的同类实例高出40%。 这打破了对 x86 的依赖,开创了架构的新时代,现在能够支持多种配置的密集计算任务。 这些举措为亚马逊云技术的其他创…

《数据结构学习笔记---第三篇》---单链表具体实现

目录 1.链表 1.1 链表的概念及结构 2.不带头单链表的实现 2.1创建头文件“SList.h” 2.2 创建具体接口实现文件SList.c 2.2.1打印 2.2.2申请链表结点 2.2.3创建一个长度为n的链表 2.2.4尾插尾删 2.2.5头插头删 2.2.6寻找x元素,返回pos 2.2.7插入和删除pos…

基于模糊控制算法的倒立摆控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 对倒立摆模型进行模糊控制器simulink建模,利用倒立摆的摆角角度与小车的位置来控制小车的推力,控制了倒立摆的摆角问题,使得小车最终停在稳…

【Linux】Ubuntu20.04解决网卡、显卡驱动不正确的问题

文章目录 1、概述2、问题描述2.1、快捷栏无无线设置2.2、设置中无Wifi设置专栏2.3、接入外接屏幕无作用 3、网卡驱动解决方案3.1、在18.04的旧方法3.1.1、安装源更换3.1.1.1、备份原始安装源3.1.1.2、修改安装源地址3.1.1.3、更新源地址 3.1.2、安装依赖3.1.3、安装编译器3.1.3…