Spring Boot 2.x 注册 Servlet 三大组件 Servlet、Filter、Listener
目录
ServletRegistrationBean 注册 Servlet
FilterRegistrationBean 注册 Filter
ServletListenerRegistrationBean 注册 Listener
Spring Boot 由于默认以 Jar 包方式启动嵌入式的 Servlet 容器来启动 Spring Boot 的 web 应用,默认没有 web.xml 文件,所以无法再像以前一样通过在 web.xml 配置来使用 Servlet 、Filter、Listener,但是 Spring Boot 提供了其它更简洁的方式。
本文就是其中一种方式,还有一种方式是:Spring Boot @ServletComponentScan 注解扫描 @WebServlet、@WebFilter、@WebListener
ServletRegistrationBean 注册 Servlet
1、自定义类继承 javax.servlet.http.HttpServlet,然后重写其 doGet 与 doPost 方法,在方法中编写控制代码;
2、第二步将 ServletRegistrationBean 组件添加到 Spring 容器中
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*** Created by Administrator on 2018/8/11 0011.* 标准的 Servlet 实现 HttpServlet;重写其 doGet 、doPost 方法*/
public class BookServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println(":com.lct.servlet.BookServlet:" + req.getRequestURL());/**讲求转发到后台的 user/users 请求去,即会进入*/req.getRequestDispatcher("user/users").forward(req, resp);}
}
3、上面 Serlvet 转发到下面的 UserControllr 控制器中:
4、@Configuration 配置类相当于以前的 beans.xml 中的配置,将 ServletRegistrationBean 也添加到 Spring 容器中来
import com.lct.component.MyLocaleResolve;
import com.lct.servlet.BookServlet;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
/*** Created by Administrator on 2018/7/28 0028.* 自定义配置类*/
@Configuration
public class MyMvcConfig {/*** 注册 Servlet 三大组件 之 Servlet* 添加 ServletRegistrationBean ,就相当于以前在 web.xml 中配置的 <servlet></servlet>标签*/@Beanpublic ServletRegistrationBean myServlet() {/**第二个参数是个不定参数组,可以配置映射多个请求* 相当于以前在 web.xml中配置的 <servlet-mapptin></servlet-mapptin>*/ServletRegistrationBean registrationBean = new ServletRegistrationBean(newBookServlet(), "/bookServlet");return registrationBean;}
}
5、运行测试:
FilterRegistrationBean 注册 Filter
1、Filter(过滤器) 是 Servlet 技术中最实用的技术之一
2、Web 开发人员通过 Filter 技术,对 web 服务器管理的所有 web 资源(如动态的 Jsp、 Servlet,以及静态的 image、 html、CSS、JS 文件等) 进行过滤拦截,从而实现一些特殊的功能(如实现 URL 级别的权限访问控制、过滤敏感词汇、压缩响应信息等)
3、Filter 主要用于对用户请求进行预处理,也可以对 HttpServletResponse 进行后期处理(如编码设置,返回时禁用浏览器缓存等)
4、Filter 使用完整流程:Filter 对用户请求进行预处理,接着将请求交给 Servlet 进行处理并生成响应,最后 Filter 再对服务器响应进行后处理。
5、Servlet 的 Filter 经常会拿来与 Spring MVC 的 Interceptor 做对比
1)拦截器是基于 Java 的反射机制的,而过滤器是基于函数回调
2)拦截器不依赖与 servle t容器,过滤器依赖与 servlet 容器
3)拦截器可以访问 action 上下文、值栈里的对象,而过滤器不能访问
4)在 action 的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
5)拦截器可以获取 IOC 容器中的各个 bean,而过滤器就不行,这点很重要,在拦截器里注入一个 service,可以调用业务逻辑
6)SpringMVC 有自己的拦截器
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/*** Created by Administrator on 2018/8/11 0011.* 标准 Servlet 过滤器,实现 javax.servlet.Filter 接口* 并重写它的 三个方法*/
public class SystemFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("javax.servlet.Filter::服务器启动....");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {/*** 转为 HttpServletRequest 输出请求路径 容易查看 请求地址*/HttpServletRequest request = (HttpServletRequest) servletRequest;System.out.println("javax.servlet.Filter::过滤器放行前...." + request.getRequestURL());filterChain.doFilter(servletRequest, servletResponse);System.out.println("javax.servlet.Filter::过滤器返回后...." + request.getRequestURL());}@Overridepublic void destroy() {System.out.println("javax.servlet.Filter::服务器关闭....");}
}
6、使用 FilterRegistrationBean 添加 FIlter :
import com.lct.component.MyLocaleResolve;
import com.lct.filter.SystemFilter;
import com.lct.servlet.BookServlet;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import javax.servlet.DispatcherType;
import java.util.Arrays;
/*** Created by Administrator on 2018/7/28 0028.* 自定义配置类*/
@Configuration
public class MyMvcConfig {/*** 注册 Servlet 三大组件 之 Filter (过滤器)* 添加 FilterRegistrationBean ,就相当于以前在 web.xml 中配置的 <filter></filter> 标签*/@Beanpublic FilterRegistrationBean myFilter() {FilterRegistrationBean registrationBean = new FilterRegistrationBean();/**同样添加自定义的 Filter*/registrationBean.setFilter(new SystemFilter());/**然后设置过滤的路径,参数是个集合 ,相当于 web.xml中配置的 <filter-mapptin></filter-mapptin>* "/*": 表示过滤所有 get 与 post 请求*/registrationBean.setUrlPatterns(Arrays.asList("/*"));/*** setDispatcherTypes 相当于 web.xml 配置中 <filter-mapptin> 下的 <dispatcher> 标签* 用于过滤非常规的 get 、post 请求* REQUEST:默认方式,写了之后会过滤所有静态资源的请求* FORWARD:过滤所有的转发请求,无论是 jsp 中的 <jsp:forward</>、<%@ page errorPage= %>、还是后台的转发* INCLUDE:过滤 jsp 中的动态包含<jsp:include 请求* ERROR:过滤在 web.xml 配置的全局错误页面* 了解即可,实际中也很少这么做*/registrationBean.setDispatcherTypes(DispatcherType.REQUEST);return registrationBean;}
}
ServletListenerRegistrationBean 注册 Listener
1、自定义监听器:
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/*** Created by Administrator on 2018/8/11 0011.* 标准 Servlet 监听器,实现 javax.servlet.ServletContextListener 接口* 然后实现方法* ServletContextListener:属于 Servlet 应用启动关闭监听器,监听容器初始化与销毁*/
public class SystemListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {System.out.println("com.lct.listener.SystemListener::服务器启动.....");}@Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {System.out.println("com.lct.listener.SystemListener::服务器关闭.....");}
}
2、注册 ServletListenerRegistrationBean:
import com.lct.component.MyLocaleResolve;
import com.lct.filter.SystemFilter;
import com.lct.listener.SystemListener;
import com.lct.servlet.BookServlet;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import java.util.Arrays;
/*** Created by Administrator on 2018/7/28 0028.* 自定义配置类*/
@Configuration
public class MyMvcConfig {/*** 注册 Servlet 三大组件 之 Listner* 添加 ServletListenerRegistrationBean ,就相当于以前在 web.xml 中配置的 <listener></listener>标签*/@Beanpublic ServletListenerRegistrationBean myListener() {/**ServletListenerRegistrationBean<T extends EventListener> 属于的是泛型,可以注册常见的任意监听器* 将自己的监听器注册进来*/ServletListenerRegistrationBean registrationBean = new ServletListenerRegistrationBean(new SystemListener());return registrationBean;}
}
Spring Boot 2.x 注册 Servlet 三大组件 Servlet、Filter、Listener相关推荐
- Spring Boot注册Servlet三大组件(Servlet, Filter, Listener)
Spring Boot默认使用的Tomcat的Servlet容器,这个容器我们可以自己替换,比如替换成支持JSP的Servlet容器,这个容器已经帮我们注册好了一个Servlet(Dispatcher ...
- Spring Boot怎么样注册Servlet三大组件[Servlet、Filter、Listener]
前言 由于SpringBoot默认是以jar包的方式启动嵌入式的Servlet容器来启动SpringBoot的web应用,没有web.xml文件. 注册三大组件用以下方式 一.ServletRegis ...
- Spring Boot基础学习笔记12:组件注册整合Servlet三大组件
文章目录 零.学习目标 一.整合Servlet三大组件概述 (一)组件注册整合Servlet三大组件 (二)路径扫描整合Servlet三大组件 二.创建Spring Boot项目 - Integrat ...
- Spring Boot基础学习笔记13:路径扫描整合Servlet三大组件
文章目录 零.学习目标 一.创建Spring Boot项目 - IntegrateThreeComponents02 二.使用路径扫描方式整合Servlet三大组件 (一)创建MyServlet类 ( ...
- SpringBoot定义三大组件Servlet,过滤器Filter,监听器Listener
SpringBoot定义三大组件Servlet,过滤器Filter,监听器Listener 1.定义组件的配置类: com.example.mybatis2018.config.MyServletCo ...
- JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下)
JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下) Reference 转载于:https://www.cnblogs.com/Jeremy2001 ...
- 将Spring Boot应用程序注册成为系统服务
文章目录 前期准备 打包成可执行jar包 注册成为liunx服务 System V Init Systemd Upstart 在Windows中安装 Windows Service Wrapper J ...
- Spring Boot之注册servlet三大组件
由于Spring Boot默认是以jar包的形式启动嵌入式的Servlet容器来启动Spring Boot的web应用是,没有web.xml配置文件 注册三大组件用以下方式 ServletRegist ...
- SpringBoot中注册Servlet三大组件
SpringBoot中默认内置了Servlet容器,Tomcat.SpringBoot默认是以jar包的方式启动内置的Servlet容器,没有web.xml文件.所以只能通过自定义servlet配置. ...
- 【源码阅读】看Spring Boot如何自动装配ActiveMQ收发组件
源于好奇,我研究了一下Spring Boot中ActiveMQ相关组件是如何自动装配的.记录如下. 源码路径 本文以Spring Boot 1.5.10.RELEASE版本为例. 在spring-bo ...
最新文章
- [flutter专题]详解AppBar小部件
- VS2017调试闪退之Chrome
- php中页面平滑回到顶部代码,原生JS实现平滑回到顶部组件
- 开机出现“CPU fan error
- C#解leetcode 53.Maximum Subarray
- OpenShift 4 - DevSecOps Workshop (10) - 向Stage环境部署应用镜像
- 帝国理工:如何用 AI 解决 80% 专科医生担忧的心律装置移植手术难题
- 20060516: 实现圆角div效果
- .NET设计模式(10):装饰模式(Decorator Pattern)
- HDU 1102 Constructing Roads
- javascript中的options.add() options.remove() options(index)或options.item(index)
- 邢台市初中计算机考试,2019年邢台中考总分多少分,邢台中考各个科目多少分
- mysql生成百万条数据_mysql 快速生成百万条测试数据
- 【软件教程】Spring Tool Suite(STS)
- weblogic部署war
- 怎么缩小照片的kb大小?
- 怎么在电脑上进行音频以及视频的素材合并
- rk1808交叉编译opencv_ubuntu16.04交叉编译opencv 移植到rk1808上
- OpenCV使用findContours()查找轮廓
- Python 之 小白爬虫
热门文章
- ARG MIN的含义是什么?
- 孙鑫VC学习笔记:第十七讲 (二) 用匿名管道实现进程间的通信
- java 操作linux_java程序里调用linux命令
- 腾讯云 python接口_python调用腾讯云短信接口
- centos7 docker安装_Docker安装运行并连接Centos7容器
- 拓端tecdat|R语言时间序列GARCH模型分析股市波动率
- 拓端tecdat|R语言分位数回归预测筛选有上升潜力的股票
- 2018 【第九届蓝桥杯省赛】 C/C++ B组
- fuzzy仿真 MATLAB,基于Matlab的Fuzzy-PID控制器的设计与仿真
- linux配置jupyterlab