Spring Boot 注册 Servlet 的三种方法,真是太有用了!
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 的三种方法,真是太有用了!相关推荐
- Spring Boot 注册 Servlet 的3种方式
一.Spring Boot 注册 Spring Boot 提供了 ServletRegistrationBean, FilterRegistrationBean, ServletListenerReg ...
- 详解易语言调用大漠插件注册vip的三种方法
详解易语言调用大漠插件注册vip的三种方法 1.将大漠插件所有命令封装成易语言类模块.(类模块调用法) 2.将大漠插件所有命令封装成Ec模块(EC模块调用法) 3.将大漠插件所有命令封装成易语言支持库 ...
- Spring Boot注册Servlet三大组件(Servlet, Filter, Listener)
Spring Boot默认使用的Tomcat的Servlet容器,这个容器我们可以自己替换,比如替换成支持JSP的Servlet容器,这个容器已经帮我们注册好了一个Servlet(Dispatcher ...
- Spring Boot项目(Maven\Gradle)三种启动方式及后台运行详解
Spring Boot项目三种启动方式及后台运行详解 1 Spring Boot项目三种启动方法 运行Application.java类中的Main方法 项目管理工具启动 Maven项目:mvn sp ...
- Spring通过工厂创建对象的三种方法详解(工厂设计模式)
1.场景描述 在创建对象的过程中,常常创建出的对象并不能直接使用,它可能需要若干步复杂的步骤,处理完成后才能正常使用.比如有一个网络连接的类NetConn,类中有加载配置文件的方法load(),测试网 ...
- spring boot输出hello world几种方法
1.手动配置,三个文件 打开创建maven,创建这三个文件从上到下依次复制即可 配置文件(重要)(否则后面会报错) pom.xml <project xmlns="http://mav ...
- Spring Boot注册Servlet三大组建(Servlet、Filter、Listener)
目录 理论 演示及代码 理论 在Spring Boot中使用下面3个函数可以注册Servlet.Filter.Listener ServletRegistrationBean FilterRegist ...
- spring boot 开启定时任务的三种方式
序言 使用SpringBoot创建定时任务非常简单,目前主要有以下三种创建方式: 一.基于注解(@Scheduled) 二.基于接口(SchedulingConfigurer) 前者相信大家都很熟悉, ...
- 后端技术:Spring Boot 项目打包 + Shell 脚本部署实践,太有用了!
本篇和大家分享的是 Spring Boot 打包并结合 Shell 脚本命令部署,重点在分享一个shell 程序启动工具,希望能便利工作: profiles指定不同环境的配置 maven-assemb ...
最新文章
- UNICODE_STRING 总结
- 使用VNC远程连接阿里云ECS实例的Ubuntu系统
- 使用intellij的svn时提示出错: Can't use Subversion command
- SAP智能机器人流程自动化解决方案
- 利用canvas来绘制一个会动的图画
- RabbitMQ TTL、死信队列在订单支付场景的应用
- oracle存储过程没有返回值,Java调用Oracle存储过程(无返回值)
- (转载)【即时通讯】今天的鼻子一酸的即时通讯
- jQuery——入门(三)JQuery DOM操作(核心处理和文档处理)
- CEFSharp崩溃分析及解决办法
- input和output实例
- RTX 3090 Ti和RX 6950 XT参数对比
- UE4-(雾效)大气雾
- airpodspro窃听模式_AirPodsPro怎么切换模式
- 如何向虚拟服务器传送文件,如何往虚拟机内传文件的3种方法
- word选中段尾不选回车符
- 预防防御鸡呼吸道疾病 鸡吃啥药防治呼吸道感染
- 九月刚入职字节跳动的测试开发面试题,附答案
- Linux 性能分析工具汇总
- 有赞 mysql go agent_有赞数据库服务实践