SpringBoot中使用Servlet,Filter,Listener
项目最近在替换之前陈旧的框架,改用SpringBoot进行重构,初接触,暂时还没有用到Servlet,Filter,Listener的地方,但在之前回顾Servlet的生命周期时,https://www.cnblogs.com/qq931399960/p/10283952.html,想到SpringBoot如何使用原生Servlet,故简单调查了下。
目前SpringBoot官网GA版本为2.1.2,在官方文档中有对Servlet,Filter,Listener的具体描述

可以通过将Servlet, Filter,Listener注册为Spring Bean或者使用@ServletComponentScan注解扫描Servlet组件
一、注册Spring Bean方式使用Servlet,Filter,Listener
自定义Servlet
package com.demo.webtest.servlet; import java.io.IOException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class MyServlet extends HttpServlet { @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("do service");
} @Override
public void destroy() {
System.out.println("destory servlet");
} @Override
public void init() throws ServletException {
System.out.println("init servlet");
} }
自定义Filter
package com.demo.webtest.servlet; import java.io.IOException; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; public class MyFilter implements Filter { @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException { System.out.println("do filter");
// 使请求继续执行
chain.doFilter(request, response);
} }
自定义Listener(以ServletRequestListener为例)
package com.demo.webtest.servlet; import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener; public class MyRequestListener implements ServletRequestListener { @Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("destory request");
} @Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("init request");
} }
将自定义Servlet,Filter,Listener注册为Spring Bean
package com.demo.webtest.servletbean; import javax.servlet.Filter;
import javax.servlet.Servlet;
import javax.servlet.ServletRequestListener; import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component; import com.demo.webtest.servlet.MyFilter;
import com.demo.webtest.servlet.MyRequestListener;
import com.demo.webtest.servlet.MyServlet; @Component
public class ServletBean { @Bean
public ServletRegistrationBean<Servlet> registerServlet() {
ServletRegistrationBean<Servlet> servletRegistrationBean = new ServletRegistrationBean<Servlet>(new MyServlet(),
"/myservlet");
// 设置服务启动时初始化该servlet
servletRegistrationBean.setLoadOnStartup(1);
return servletRegistrationBean;
} @Bean
public FilterRegistrationBean<Filter> registerFilter() {
FilterRegistrationBean<Filter> filter = new FilterRegistrationBean<>();
filter.setFilter(new MyFilter());
filter.addUrlPatterns("/*");
return filter;
} @Bean
public ServletListenerRegistrationBean<ServletRequestListener> registerRequestListener() {
ServletListenerRegistrationBean<ServletRequestListener> servletListenerRegistrationBean = new ServletListenerRegistrationBean<>();
servletListenerRegistrationBean.setListener(new MyRequestListener());
return servletListenerRegistrationBean;
} }
启动服务
MyServlet设置了loadOnStartup,且其值大于等于0,故服务启动初始化MyServlet,调用了其init方法,页面访问http://localhost:8080/myservlet
上面日志省略。。。
2019-01-20 09:29:02.308 WARN 12592 --- [ main] ion$DefaultTemplateResolverConfiguration : Cannot find template location: classpath:/templates/ (please add some templates or check your Thymeleaf configuration)
init servlet
2019-01-20 09:29:02.710 INFO 12592 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2019-01-20 09:29:02.712 INFO 12592 --- [ main] com.demo.webtest.WebtestApplication : Started WebtestApplication in 3.032 seconds (JVM running for 3.47)
init request
do filter
do service
destory request
1、程序启动,初始化Servlet
2、页面访问Servlet,初始化request
3、过滤器过滤请求
4、执行Servlet业务
5、销毁request
清空日志,再次访问http://localhost:8080/myservlet
init request
do filter
do service
destory request
1、初始化request
2、过滤器过滤请求
3、执行Servlet业务
4、销毁request
以上测试时使用的为ServletRequestListener ,LIstener还有其他多种形式,比如HttpSessionListener,HttpSessionBindingListener等,但比较重要的有一个ServletContextListener,在springmvc官网的配置文件中,配置了一个ContextLoaderListener,该Listener实现了ServletContextListener接口,并重写了contextInitialized和contextDestroyed方法,在contextInitialized中初始化了WebApplicationContext,服务器启动后,无论servlet是否配置有loadStartup,也不论该值是什么,contextInitialized始终都在servlet的初始化方法之前执行。每个应用只有一个ServletContext
二、使用注解扫描Servlet组件
删除或注释掉ServletBean类
修改自定义Servlet,Filter,Listener,添加Servlet相关组件注解
自定义Servlet,为与上面区分,将url将映射到/my
package com.demo.webtest.servlet; import java.io.IOException; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; @WebServlet(urlPatterns = "/my", loadOnStartup = 0)
public class MyServlet extends HttpServlet {
...
}
自定义Filter
package com.demo.webtest.servlet; import java.io.IOException; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter; @WebFilter(urlPatterns="/*")
public class MyFilter implements Filter {
...
}
自定义Listener
package com.demo.webtest.servlet; import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener; @WebListener(value="/*")
public class MyRequestListener implements ServletRequestListener {
...
}
启动类添加Servlet组件扫描
package com.demo.webtest; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan; @SpringBootApplication
@ServletComponentScan
public class WebtestApplication { public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(WebtestApplication.class);
springApplication.run(args);
}
}
服务启动,也会先进行servlet初始化,页面访问http://localhost:8080/my,日志输出与上述注册Spring Bean方式一致
SpringBoot中使用Servlet,Filter,Listener的更多相关文章
- SpringBoot学习笔记(6)----SpringBoot中使用Servlet,Filter,Listener的三种方式
在一般的运用开发中Controller已经大部分都能够实现了,但是也不排除需要自己实现Servlet,Filter,Listener的方式,SpringBoot提供了三种实现方式. 1. 使用Bean ...
- ServletContextInitializer添加 servlet filter listener
ServletContextInitializer添加 servlet filter listener https://www.cnblogs.com/pomer-huang/p/9639322.ht ...
- Spring boot中使用servlet filter
Spring boot中使用servlet filter liuyuhang原创,未经允许请勿转载! 在web项目中经常需要一些场景,如参数过滤防止sql注入,防止页面攻击,空参数矫正等, 也可以做成 ...
- SpringBoot---注册Servlet,Filter,Listener
1.概述 1.1.当使用 内嵌的Servlet容器(Tomcat.Jetty等)时,将Servlet,Filter,Listener 注册到Servlet容器的方法: 1.1.1.直接注册Bean ...
- servlet filter listener interceptor 知识点
这篇文章主要介绍 servlet filter listener interceptor 之 知识点.博文主要从 概念,生命周期,使命介绍其区别.详情如下: 概念 生命周期 使命 servlet ...
- JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下)
JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下) Reference
- SpringBoot整合WEB开发--(九)整合Servlet,Filter,Listener
简介: 如果需要整合第三方框架时,可能还是不得不使用Servlet,Filter,Listener,Springboot中也有提供支持. @WebServlet("/my") pu ...
- spring boot中使用servlet、listener和filter
spring boot中支持使用java Web三大组件(servlet.listener和filter),但是坑比较多,主要是spring boot内嵌tomcat和独立tomcat服务器有一些细节 ...
- [转]web.xml中servlet ,filter ,listener ,interceptor的作用与区别
原文链接:https://blog.csdn.net/netdevgirl/article/details/51483273 一.概念: 1.servlet:servlet是一种运行服务器端的java ...
随机推荐
- Jvm垃圾回收器(算法篇)
在<Jvm垃圾回收器(基础篇)>中我们主要学习了判断对象是否存活还是死亡?两种基础的垃圾回收算法:引用计数法.可达性分析算法.以及Java引用的4种分类:强引用.软引用.弱引用.虚引用.和 ...
- 【C#加深理解系列】(二)序列化
什么是序列化 序列化,它又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制.序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候把这个文件再转化成原来的对象使用. ...
- 【c#】RabbitMQ学习文档(四)Routing(路由)
(使用Net客户端) 在上一个教程中,我们构建了一个简单的日志系统,我们能够向许多消息接受者广播发送日志消息. 在本教程中,我们将为其添加一项功能 ,这个功能是我们将只订阅消息的一个子集成为可能. 例 ...
- leetcode — convert-sorted-array-to-binary-search-tree
import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * * Source : https:/ ...
- Disconf源码分析之启动过程分析下(2)
接上文,下面是第二次扫描的XML配置. <bean id="disconfMgrBean2" class="com.baidu.disconf.client.Dis ...
- Alibaba Cluster Data 开放下载:270GB 数据揭秘你不知道的阿里巴巴数据中心
打开一篇篇 IT 技术文章,你总能够看到“大规模”.“海量请求”这些字眼.如今,这些功能强大的互联网应用,都运行在大规模数据中心上,然而,对于大规模数据中心,你又了解多少呢?实际上,除了阅读一些科技文 ...
- 基于React-Native0.55.4的语音识别项目全栈方案
移动端的API能力验证方案与PC端不一样!不一样!!不一样!!! 即使需要使用的API都存在,也不一定能用,这一点和PC端是有很大区别的,国内的手机系统虽然都是基于Android,但几乎都会经过各大厂 ...
- C#_asp.net mvc 验证码功能的具体实现
@using (Html.BeginForm("Login", "HomePage",FormMethod.Post)) { <h2>登录</ ...
- mysql删除重复记录,只保留最大ID的记录(非重复也保留)
目前网上搜索的删除重复记录,大部分都是where子查询,本人感觉看上去不美观,故亲自手写了一个,如下: delete from mst_sku using mst_sku,( select dist ...
- 通过多线程处理提高Redis性能
Redis通常被称为单进程单线程模型. 这不是真的! Redis还运行多个后端线程来执行后端清理工作,例如清理脏数据和关闭文件描述符.在Redis中,主线程负责主要任务,包括但不限于:接收来自客户端的 ...