Spring Boot 注册 Servlet 的三种方法,真是太有用了!

简介: Spring Boot 注册 Servlet 的三种方法,真是太有用了!

image.png本文栈长教你如何在 Spring Boot 注册 Servlet、Filter、Listener。


你所需具备的基础

什么是 Spring Boot?


Spring Boot 核心配置文件详解


Spring Boot 开启的 2 种方式


Spring Boot 自动配置原理、实战


Spring Boot 2.x 启动全过程源码分析


更多请在Java技术栈微信公众号后台回复关键字:boot。


一、Spring Boot 注册

Spring Boot 提供了 ServletRegistrationBean, FilterRegistrationBean, ServletListenerRegistrationBean 三个类分别用来注册 Servlet, Filter, Listener,下面是 Servlet 的示例代码。

import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;/** * @author Java技术栈 */public class RegisterServlet extends HttpServlet {    @Override    protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {        String name = getServletConfig().getInitParameter("name");        String sex = getServletConfig().getInitParameter("sex");        resp.getOutputStream().println("name is " + name);        resp.getOutputStream().println("sex is " + sex);    }}@Beanpublic ServletRegistrationBean registerServlet() {    ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(            new RegisterServlet(), "/registerServlet");    servletRegistrationBean.addInitParameter("name", "javastack");    servletRegistrationBean.addInitParameter("sex", "man");    return servletRegistrationBean;}


二、组件扫描注册

Servlet 3.0 之前,Servlet、Filter、Listener 这些组件都需要在 web.xml 中进行配置,3.0 之后开始不再需要 web.xml 这个配置文件了,所有的组件都可以通过代码配置或者注解来达到目的。

如下图所示,截图自 Servlet 3.1。

image.png


Servlet 3.0 开始提供了这 3 个注解来代替。


@WebServlet => 代替 servlet 配置


@WebFilter => 代替 filter 配置


@WebListener => 代替 listener 配置


配置 Servlet 示例

import javax.servlet.annotation.WebInitParam;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;/** * @author Java技术栈 */@WebServlet(name = "javaServlet", urlPatterns = "/javastack.cn", asyncSupported = true,        initParams = {        @WebInitParam(name = "name", value = "javastack"),        @WebInitParam(name = "sex", value = "man") })public class JavaServlet extends HttpServlet {    @Override    protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {        String name = getServletConfig().getInitParameter("name");        String sex = getServletConfig().getInitParameter("sex");        resp.getOutputStream().println("name is " + name);        resp.getOutputStream().println("sex is " + sex);    }}

配置 Filter 示例

/** * @author Java技术栈 */@WebFilter(filterName = "javaFilter", urlPatterns = "/*", initParams = {        @WebInitParam(name = "name", value = "javastack"),        @WebInitParam(name = "code", value = "123456") })public class JavaFilter implements Filter {    @Override    public void init(FilterConfig filterConfig) throws ServletException {        System.out.println("java filter init.");        String name = filterConfig.getInitParameter("name");        String code = filterConfig.getInitParameter("code");        System.out.println("name is " + name);        System.out.println("code is " + code);    }    @Override    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)            throws IOException, ServletException {        System.out.println("java filter processing.");        chain.doFilter(request, response);    }    @Override    public void destroy() {        System.out.println("java filter destroy.");    }}

Listener 配置方式类似,上面的示例代码一看就懂,这里不再详述。


需要注意的是,为了安全考虑,内嵌服务器不会直接执行 Servlet 3.0 里面的 javax.servlet.ServletContainerInitializer 接口,或者 Spring 中的 org.springframework.web.WebApplicationInitializer 接口,否则会导致终止 Spring Boot 应用。


所以,如果使用的是 Spring Boot 内嵌服务器,需要在配置类上面添加额外的 @ServletComponentScan 注解来开启 Servlet 组件扫描功能,如果使用的是独立的服务器,则不需要添加,会使用服务器内部的自动发现机制。


三、动态注册

如果你想在 Spring Boot 中完成 Servlet、Filter、Listener 的初始化操作,你需要在 Spring 中实现下面这个接口,并注册为一个 bean。


org.springframework.boot.web.servlet.ServletContextInitializer


ServletContext 提供了几个动态注册的方法,如下所示。

image.png


以下为动态添加 Servlet 示例代码。

import javax.servlet.annotation.WebInitParam;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;/** * @author Java技术栈 */@WebServlet(name = "javaServlet", urlPatterns = "/javastack.cn", asyncSupported = true,        initParams = {        @WebInitParam(name = "name", value = "javastack"),        @WebInitParam(name = "sex", value = "man") })public class JavaServlet extends HttpServlet {    @Override    protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {        String name = getServletConfig().getInitParameter("name");        String sex = getServletConfig().getInitParameter("sex");        resp.getOutputStream().println("name is " + name);        resp.getOutputStream().println("sex is " + sex);    }}import cn.javastack.springbootbestpractice.servlet.InitServlet;import org.springframework.boot.web.servlet.ServletContextInitializer;import org.springframework.stereotype.Component;import javax.servlet.ServletContext;import javax.servlet.ServletRegistration;/** * @author Java技术栈 */@Componentpublic class ServletConfig implements ServletContextInitializer {    @Override    public void onStartup(ServletContext servletContext) {        ServletRegistration initServlet = servletContext                .addServlet("initServlet", InitServlet.class);        initServlet.addMapping("/initServlet");        initServlet.setInitParameter("name", "javastack");        initServlet.setInitParameter("sex", "man");    }}

总结

本文介绍了在 Spring Boot 下的 3 种注册 Servlet、Filter、Listener 的方式,大家灵活运用。


目录
打赏
0
0
0
0
310
分享
相关文章
SpringBoot实现网页消息推送的5种方法
本文详细介绍了在SpringBoot中实现网页消息推送的几种主流方案,包括短轮询、长轮询、SSE(Server-Sent Events)、WebSocket以及STOMP。每种方案各有优缺点,适用于不同的场景需求。短轮询简单易实现但效率低;长轮询提升了实时性但仍有限制;SSE适合单向通信且轻量高效;WebSocket支持全双工通信,适合高实时性要求的场景;STOMP基于WebSocket,提供更高级的消息传递功能。通过对比分析,开发者可根据业务需求、性能要求及浏览器兼容性选择最适合的技术方案,同时可结合多种技术实现优雅降级,优化用户体验。
300 57
深入解析HTTP请求方法:Spring Boot实战与最佳实践
这篇博客结合了HTTP规范、Spring Boot实现和实际工程经验,通过代码示例、对比表格和架构图等方式,系统性地讲解了不同HTTP方法的应用场景和最佳实践。
266 5
两种Spring Boot 项目启动自动执行方法的实现方式
在Spring Boot项目启动后执行特定代码的实际应用场景中,可通过实现`ApplicationRunner`或`CommandLineRunner`接口完成初始化操作,如系统常量或配置加载。两者均支持通过`@Order`注解控制执行顺序,值越小优先级越高。区别在于参数接收方式:`CommandLineRunner`使用字符串数组,而`ApplicationRunner`采用`ApplicationArguments`对象。注意,`@Order`仅影响Bean执行顺序,不影响加载顺序。
143 2
Spring 集成 DeepSeek 的 3大方法(史上最全)
DeepSeek 的 API 接口和 OpenAI 是兼容的。我们可以自定义 http client,按照 OpenAI 的rest 接口格式,去访问 DeepSeek。自定义 Client 集成DeepSeek ,可以通过以下步骤实现。步骤 1:准备工作访问 DeepSeek 的开发者平台,注册并获取 API 密钥。DeepSeek 提供了与 OpenAI 兼容的 API 端点(例如),确保你已获取正确的 API 地址。
Spring 集成 DeepSeek 的 3大方法(史上最全)
【Spring】方法注解@Bean,配置类扫描路径
@Bean方法注解,如何在同一个类下面定义多个Bean对象,配置扫描路径
256 73
springcloud/springboot集成NACOS 做注册和配置中心以及nacos源码分析
通过本文,我们详细介绍了如何在 Spring Cloud 和 Spring Boot 中集成 Nacos 进行服务注册和配置管理,并对 Nacos 的源码进行了初步分析。Nacos 作为一个强大的服务注册和配置管理平台,为微服务架构提供
1295 14
Spring Boot 两种部署到服务器的方式
本文介绍了Spring Boot项目的两种部署方式:jar包和war包。Jar包方式使用内置Tomcat,只需配置JDK 1.8及以上环境,通过`nohup java -jar`命令后台运行,并开放服务器端口即可访问。War包则需将项目打包后放入外部Tomcat的webapps目录,修改启动类继承`SpringBootServletInitializer`并调整pom.xml中的打包类型为war,最后启动Tomcat访问应用。两者各有优劣,jar包更简单便捷,而war包适合传统部署场景。需要注意的是,war包部署时,内置Tomcat的端口配置不会生效。
1740 17
Spring Boot 两种部署到服务器的方式
|
6月前
|
springboot怎么使用rides缓存方法的返回值 完整例子
通过上述步骤,我们成功地在 Spring Boot 项目中集成了 Redis 缓存,并通过注解的方式实现了方法返回值的缓存。这种方式不仅提高了系统的性能,还简化了缓存管理的复杂度。使用 Spring Boot 的缓存注解和 Redis,可以轻松地实现高效、可靠的缓存机制。
139 23
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——指定项目配置文件
在实际项目中,开发环境和生产环境的配置往往不同。为简化配置切换,可通过创建 `application-dev.yml` 和 `application-pro.yml` 分别管理开发与生产环境配置,如设置不同端口(8001/8002)。在 `application.yml` 中使用 `spring.profiles.active` 指定加载的配置文件,实现环境快速切换。本节还介绍了通过配置类读取参数的方法,适用于微服务场景,提升代码可维护性。课程源码可从 [Gitee](https://gitee.com/eson15/springboot_study) 下载。
113 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等