2019独角兽企业重金招聘Python工程师标准>>>

本文栈长教你如何在 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 {@Overrideprotected 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);}}@Bean
public 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。

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 {@Overrideprotected 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 {@Overridepublic 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);}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {System.out.println("java filter processing.");chain.doFilter(request, response);}@Overridepublic 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 提供了几个动态注册的方法,如下所示。

以下为动态添加 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 {@Overrideprotected 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技术栈*/
@Component
public class ServletConfig implements ServletContextInitializer {@Overridepublic 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 的方式,大家灵活运用。

看完有收获,点赞转发一下吧!

好了,今天的分享就到这里,更多 Spring Boot 文章正在撰写中,关注Java技术栈微信公众号获取第一时间推送。在公众号后台回复:boot,还能获取栈长整理的往期 Spring Boot 教程,都是实战干货,以下仅为部分预览。

  • Spring Boot 读取配置的几种方式
  • Spring Boot 如何做参数校验?
  • Spring Boot 最核心的 25 个注解!
  • Spring Boot 2.x 启动全过程源码分析
  • Spring Boot 2.x 新特性总结及迁移指南
  • ……

本文原创首发于微信公众号:Java技术栈(id:javastack),关注公众号在后台回复 "boot" 可获取更多 Spring Boot 教程,转载请原样保留本信息。

转载于:https://my.oschina.net/javaroad/blog/3046159

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

  1. Spring Boot 注册 Servlet 的3种方式

    一.Spring Boot 注册 Spring Boot 提供了 ServletRegistrationBean, FilterRegistrationBean, ServletListenerReg ...

  2. 详解易语言调用大漠插件注册vip的三种方法

    详解易语言调用大漠插件注册vip的三种方法 1.将大漠插件所有命令封装成易语言类模块.(类模块调用法) 2.将大漠插件所有命令封装成Ec模块(EC模块调用法) 3.将大漠插件所有命令封装成易语言支持库 ...

  3. Spring Boot注册Servlet三大组件(Servlet, Filter, Listener)

    Spring Boot默认使用的Tomcat的Servlet容器,这个容器我们可以自己替换,比如替换成支持JSP的Servlet容器,这个容器已经帮我们注册好了一个Servlet(Dispatcher ...

  4. Spring Boot项目(Maven\Gradle)三种启动方式及后台运行详解

    Spring Boot项目三种启动方式及后台运行详解 1 Spring Boot项目三种启动方法 运行Application.java类中的Main方法 项目管理工具启动 Maven项目:mvn sp ...

  5. Spring通过工厂创建对象的三种方法详解(工厂设计模式)

    1.场景描述 在创建对象的过程中,常常创建出的对象并不能直接使用,它可能需要若干步复杂的步骤,处理完成后才能正常使用.比如有一个网络连接的类NetConn,类中有加载配置文件的方法load(),测试网 ...

  6. spring boot输出hello world几种方法

    1.手动配置,三个文件 打开创建maven,创建这三个文件从上到下依次复制即可 配置文件(重要)(否则后面会报错) pom.xml <project xmlns="http://mav ...

  7. Spring Boot注册Servlet三大组建(Servlet、Filter、Listener)

    目录 理论 演示及代码 理论 在Spring Boot中使用下面3个函数可以注册Servlet.Filter.Listener ServletRegistrationBean FilterRegist ...

  8. spring boot 开启定时任务的三种方式

    序言 使用SpringBoot创建定时任务非常简单,目前主要有以下三种创建方式: 一.基于注解(@Scheduled) 二.基于接口(SchedulingConfigurer) 前者相信大家都很熟悉, ...

  9. 后端技术:Spring Boot 项目打包 + Shell 脚本部署实践,太有用了!

    本篇和大家分享的是 Spring Boot 打包并结合 Shell 脚本命令部署,重点在分享一个shell 程序启动工具,希望能便利工作: profiles指定不同环境的配置 maven-assemb ...

最新文章

  1. UNICODE_STRING 总结
  2. 使用VNC远程连接阿里云ECS实例的Ubuntu系统
  3. 使用intellij的svn时提示出错: Can't use Subversion command
  4. SAP智能机器人流程自动化解决方案
  5. 利用canvas来绘制一个会动的图画
  6. RabbitMQ TTL、死信队列在订单支付场景的应用
  7. oracle存储过程没有返回值,Java调用Oracle存储过程(无返回值)
  8. (转载)【即时通讯】今天的鼻子一酸的即时通讯
  9. jQuery——入门(三)JQuery DOM操作(核心处理和文档处理)
  10. CEFSharp崩溃分析及解决办法
  11. input和output实例
  12. RTX 3090 Ti和RX 6950 XT参数对比
  13. UE4-(雾效)大气雾
  14. airpodspro窃听模式_AirPodsPro怎么切换模式
  15. 如何向虚拟服务器传送文件,如何往虚拟机内传文件的3种方法
  16. word选中段尾不选回车符
  17. 预防防御鸡呼吸道疾病 鸡吃啥药防治呼吸道感染
  18. 九月刚入职字节跳动的测试开发面试题,附答案
  19. Linux 性能分析工具汇总
  20. 有赞 mysql go agent_有赞数据库服务实践

热门文章

  1. 分享Silverlight新鲜事(11月15日-21日) - PDC 10 Downloader
  2. KS004 基于SSH通讯录系统设计与实现
  3. linux判断目录,文件存在等
  4. jupyter Nodebook如何查看函数帮助
  5. linux进程自动关闭与dmesg的使用
  6. C-二维数组,多维数组
  7. 小问题(可能持续更新)
  8. Struts+2权威指南--基于WebWork核心的MVC开发源码下载
  9. 英语阅读推荐:使用AJAX+WF+LINQ制作Google IG式首页
  10. 《LeetCode力扣练习》第46题 全排列 Java