SpringBoot基础之注册Servlet三大组件

news2024/11/16 0:05:26

文章目录

  • 前言
  • 一、介绍
  • 二、注入Bean
    • 2.1.ServletRegistrationBean
    • 2.2.FilterRegistrationBean
    • 2.3.ServletListenerRegistrationBean
  • 三.演示结果
  • 总结


前言

本文章将介绍SpringBoot注册Servlet的三大组件


一、介绍

由于SpringBoot默认是以jar包的方式运行嵌入式Servlet容器来启动应用,没有web.xml文件,
所以Spring提供以下Bean来注册三大组件。

  • ServletRegistrationBean 注册自定义Servlet
  • FilterRegistrationBean 注册自定义Filter
  • ServletListenerRegistrationBean 注册自定义Listener

二、注入Bean

2.1.ServletRegistrationBean

首先我们需要一个类继承至HttpServlet

public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("get请求进入servlet");
        resp.getWriter().println("<h1>get:hello world</h1>");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("post请求进入servlet");
        resp.getWriter().println("<h1>post:hello world</h1>");
    }
}

然后在配置类中注入ServletRegistrationBean

@Configuration
public class SpringBootConfig {
@Bean
    public ServletRegistrationBean doRegiste(){
        ServletRegistrationBean bean = new ServletRegistrationBean();
        //将自己创建的继承至HttpServlet的类添加进ServletRegistrationBean 
        bean.setServlet(new MyServlet());
        //设置请求路径
        bean.setUrlMappings(Arrays.asList("/myServlet"));
        //设置优先级
        bean.setLoadOnStartup(1);
        return bean;
    }
}

2.2.FilterRegistrationBean

首先我们需要一个类实现Filter接口,重写它的doFilter方法

public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("============请求过滤");

        request.setCharacterEncoding("utf-8");

        //分水岭
        chain.doFilter(request, response);


        response.setCharacterEncoding("utf-8");

        System.out.println("============响应过滤");
    }
}

在配置类中将FilterRegistrationBean注入

@Configuration
public class SpringBootConfig {
    //注册Servlet
    //替换:@WebServlet(urlPatterns = "/myServlet")
    @Bean
    public ServletRegistrationBean doRegiste(){
        ServletRegistrationBean bean = new ServletRegistrationBean();
        bean.setServlet(new MyServlet());
        bean.setUrlMappings(Arrays.asList("/myServlet"));
        bean.setLoadOnStartup(1);
        return bean;
    }

    //注册Filter
    //替换//@WebFilter(urlPatterns = {"/*"})
    @Bean
    public FilterRegistrationBean doFilter(){
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new MyFilter());
        bean.addUrlPatterns("/*");
        return bean;
    }
}

2.3.ServletListenerRegistrationBean

首先需要一个类实现ServletContextListener接口,重现它的contextInitialized和contextDestroyed方法监听程序初始化和销毁

public class MyListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContextListener.super.contextInitialized(sce);
        System.out.println("-------------MyListener inited !");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        ServletContextListener.super.contextDestroyed(sce);
        System.out.println("----------------MyListener Destroy !");
    }
}

在配置类中注入ServletListenerRegistrationBean

@Configuration
public class SpringBootConfig {
    //注册Servlet
    //替换:@WebServlet(urlPatterns = "/myServlet")
    @Bean
    public ServletRegistrationBean doRegiste(){
        ServletRegistrationBean bean = new ServletRegistrationBean();
        bean.setServlet(new MyServlet());
        bean.setUrlMappings(Arrays.asList("/myServlet"));
        bean.setLoadOnStartup(1);
        return bean;
    }

    //注册Filter
    //替换//@WebFilter(urlPatterns = {"/*"})
    @Bean
    public FilterRegistrationBean doFilter(){
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new MyFilter());
        bean.addUrlPatterns("/*");
        return bean;
    }

    //注册Listener
    //替换//@WebListener
    @Bean
    public ServletListenerRegistrationBean doListener(){
        ServletListenerRegistrationBean bean = new ServletListenerRegistrationBean();
        bean.setListener(new MyListener());
        return bean;
    }
}

三.演示结果

1.监听器初始化
在这里插入图片描述
>2.使用postman响应
在这里插入图片描述
3.请求过滤
4.请求servlet
5.响应过滤
在这里插入图片描述
6.销毁(不能点右上角红色方块键,应该点左侧的退出按钮)
在这里插入图片描述


总结

除了以上的方法也可以使用传统的@WebFilter…实现注册,但是这样只能注册声明自己创建的类,在将来我们会用到很多框架提供的类,就无法使用传统的注解注册,所以推荐使用以上配置类的方式注册Servlet。

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

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

相关文章

【LangChain学习】基于PDF文档构建问答知识库(二)创建项目

这里我们使用到 fastapi 作为项目的web框架&#xff0c;它是一个快速&#xff08;高性能&#xff09;的 web 框架&#xff0c;上手简单。 一.创建 FastAPI 项目 我们在IDE中&#xff0c;左侧选择 FastAPI &#xff0c;右侧选择创建一个新的虚拟环境。 创建成功&#xff0c;会有…

UNIQUE VISION Programming Contest 2023 Summer(AtCoder Beginner Contest 312)D题题解

文章目录 [Count Bracket Sequences](https://atcoder.jp/contests/abc312/tasks/abc312_d)问题建模问题分析1.分析合法括号字符串的特点2.从集合角度分析字符串每个字符的作用代码 Count Bracket Sequences 问题建模 给定一个字符串&#xff0c;字符串内仅有3种字符&#xff…

期权定价模型系列【1】—BSM通用式模型

这是期权定价模型专栏的第一篇文章&#xff0c;此专栏旨在分享一些期权定价模型&#xff0c;将会从最基础的BSM模型开始写起&#xff0c;逐步扩散到蒙特卡洛模拟、二叉树等数值法模型&#xff0c;以及跳跃扩散模型、随机波动率模型&#xff0c;神经网络模型等等。 如果你觉得有…

[OnWork.Tools]系列 05-系统工具

简介 系统工具主要是将Window常用工具的快捷启动的集合 双击快速启动 计算器,记事本,截图,画图工具 控制面板,服务管理,关闭显示器,关机 启动文件夹,我的电脑,管理工具 右键菜单 添加快捷方式到桌面

外卖点餐小程序开源源码——支持扫码点餐

一套支持店内扫码点餐、外卖点餐配送于一体的餐饮系统&#xff0c;支持商家创建优惠券&#xff0c;支持商家自定义打印机功能&#xff0c;支持商家财务管理&#xff0c;支持商户菜品管理&#xff0c;支持菜品自定义分类&#xff0c;支持商家招募骑手入驻功能。系统基于thinkphp…

类与对象【下】

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析2 目录 &#x1f449;&#x1f3fb;初始化列表初始化列表注意点 &#x1f449;&#x1f…

LinearAlgebraMIT_7_Ax=0

上节课讲了向量子空间中的列空间和零空间&#xff0c;这节课来讲零空间的(Special solutions)特解&#xff0c;也就是Ax0的特解。在求解特解的核心便是使用消元法求得(row echelon form)阶梯矩阵或者(reduced row echelon form/RREF)最简矩阵。 我们接下来举一个例子&#xff…

Android使用kotlin+协程+room数据库的简单应用

前言&#xff1a;一般主线程&#xff08;UI线程&#xff09;中是不能执行创建数据这些操作的&#xff0c;因为等待时间长。所以协程就是为了解决这个问题出现。 第一步&#xff1a;在模块级的build.gradle中引入 id com.android.application// roomid kotlin-androidid kotlin…

亚马逊第三方卖家服务收入已达自营81%

据MarketplacePulse最新报道&#xff0c;亚马逊在第三方卖家服务上的收入&#xff0c;已经达到相当于其自营业务81%的规模。 佣金、物流费用以及广告构成了亚马逊整个第三方卖家服务。亚马逊最新发布的第二季度财报显示&#xff0c;亚马逊在包括销售佣金、物流费用的第三方卖…

2023河南萌新联赛第(五)场:郑州轻工业大学 --Kruskal

题目描述 给定一张nnn个点的无向完全图&#xff0c;其中两点之间的路径边权为两点编号的按位与&#xff08;编号为 (1,2,...,n)(1,2,...,n)(1,2,...,n)&#xff09;&#xff0c;即w(u,v)u&v(1≤u,v≤n)w\left(u, v \right )u\&v \left( 1 \le u, v \le n \right)w(u,v…

使用Flask框架mock server实战(三)

1、demo1&#xff1a;登录接口 1.1 Flask代码 from flask import request, Flask, jsonify# 创建1个实例 app Flask(__name__)# 解决接收中文报文乱码问题 app.config[JSON_AS_ASCII] False# 登录接口 # 指定路由和请求方法。strict_slashesFalse 对URL最后的/符合是否严格…

natapp内网穿透使用教程

官网 https://natapp.cn/1.首先在本站注册账号 2.登录后,点击左边 购买隧道,免费就行 3.我的隧道 进行一些配置 5.根据您的本机下载对应的客户端,比如我的本机是win10,64位,则下载Windows 64位的客户端 6.下载之后,解压至任意目录,得到natapp.exe (linux下无需解压,直接 wg…

logback日志框架学习(1)介绍logback

首先说下对日志框架的感受&#xff0c;很多人slf4j-api slf4j-simple logback-core logbak-classic log4j logj42很多的日志框架&#xff0c;控制台各种输出的时候日志框架warn error&#xff0c;有时候还不能输出日志。究其原因&#xff0c;大家都觉得日志框架不太重要&#x…

硬件系统工程师宝典(36)-----盘点常用的总线和常见的逻辑电平

各位同学大家好&#xff0c;欢迎继续做客电子工程学习圈&#xff0c;今天我们继续来讲这本书&#xff0c;硬件系统工程师宝典。 上篇我们了解了SDRAM的存储技术以及SDRAM的发展历程&#xff0c;技术的进步推动着产品的升级&#xff0c;也加速了整个电子行业的发展。今天我们来…

[信号与系统系列] 正弦振幅调制之差拍信号

当将具有不同频率的两个正弦曲线相乘时&#xff0c;可以创建一个有趣的音频效果&#xff0c;称为差拍音符。这种现象听起来像颤音&#xff0c;最好通过选择一个频率非常小的信号与和另一个频率大约1KHz的信号&#xff0c;把二者混合从而听到。一些乐器能够自然产生差拍音符。使…

SAP MIGO 移动原因维护

在OMJJ中维护 在OMJJ中&#xff0c;选择你要维护的移动类型&#xff0c;在“对话结构”中选择“移动原因”&#xff0c;可以修改和添加了。

【JUC】复习指南

JUC复习指南&#xff1a; JUC有哪些知识点&#xff1f; 什么是Juc Lock接口 线程间通信 集合的线程安全问题 多线程锁 Callable接口 JUC三大辅助类 CountDownLatch CyclicBarrier Semaphore 读写锁 ReetrantReadWriteLOck 阻塞队列 ThreadPool线程池 Fork/join Com…

【Docker】Docker容器化技术基础(一篇可以让你学到docker使用的文章)

Docker容器化技术 Docker&#xff08;软件跨环境迁移&#xff09;Docker概念&#xff1a;安装Dockerdocker架构配置Docker镜像加速器 一、Docker命令服务daemon相关的命令镜像相关命令Docker容器相关命令 二、Docker容器的数据卷数据卷概念配置数据卷配置数据卷容器 三、Docker…

关于简单C++函数在内存中的存储问题

举例 int main(){... }int data(){... }int add(){... } 在分段式存储管理时&#xff0c;根据人们的需求&#xff0c;人为分段存储 如图&#xff1a;