目录
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 容器中
/**
* Created by Administrator on 2018/8/11 0011.
* 标准的 Servlet 实现 HttpServlet;重写其 doGet 、doPost 方法
*/
public class BookServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected 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);
}
}
src/main/java/org/example/servlet/BookServlet.java · 汪少棠/java-se - Gitee.com
4、@Configuration 配置类相当于以前的 beans.xml 中的配置,将 ServletRegistrationBean 也添加到 Spring 容器中来
@Configuration
public class MyMvcConfig {
/**
* 注册 Servlet 三大组件 之 Servlet
* 添加 ServletRegistrationBean ,就相当于以前在 web.xml 中配置的 <servlet></servlet>标签
*/
@Bean
public ServletRegistrationBean myServlet() {
/**第二个参数是个不定参数组,可以配置映射多个请求
* 相当于以前在 web.xml中配置的 <servlet-mapptin></servlet-mapptin>*/
ServletRegistrationBean registrationBean = new ServletRegistrationBean(new
BookServlet(), "/bookServlet");
return registrationBean;
}
}
src/main/java/org/example/servlet/MyMvcConfig.java · 汪少棠/java-se - Gitee.com
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 有自己的拦截器
/**
* 标准 Servlet 过滤器,实现 javax.servlet.Filter 接口
* 并重写它的 三个方法
*/
public class SystemFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("javax.servlet.Filter::服务器启动....");
}
@Override
public 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());
}
@Override
public void destroy() {
System.out.println("javax.servlet.Filter::服务器关闭....");
}
}
src/main/java/org/example/servlet/SystemFilter.java · 汪少棠/java-se - Gitee.com
6、使用 FilterRegistrationBean 添加 FIlter :
/**
* 注册 Servlet 三大组件 之 Filter (过滤器)
* 添加 FilterRegistrationBean ,就相当于以前在 web.xml 中配置的 <filter></filter> 标签
*/
@Bean
public 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;
}
src/main/java/org/example/servlet/MyMvcConfig.java · 汪少棠/java-se - Gitee.com
ServletListenerRegistrationBean 注册 Listener
ServletContextListener:Servlet 应用启动关闭监听器,监听容器初始化与销毁。
ServletRequestListener:HttpServletRequest 对象的创建和销毁监听器
HttpSessionListener:HttpSession 数据对象创建和销毁监听器
HttpSessionAttributeListener 监听HttpSession中属性变化
ServletRequestAttributeListener 监听ServletRequest中属性变化
1、自定义监听器:
/**
* Created by Administrator on 2018/8/11 0011.
* 标准 Servlet 监听器,实现 javax.servlet.ServletContextListener 接口
* 然后实现方法
* ServletContextListener:属于 Servlet 应用启动关闭监听器,监听容器初始化与销毁
*/
public class SystemListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("com.lct.listener.SystemListener::服务器启动.....");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("com.lct.listener.SystemListener::服务器关闭.....");
}
}
src/main/java/org/example/servlet/SystemListener.java · 汪少棠/java-se - Gitee.com
2、注册 ServletListenerRegistrationBean:
/**
* 注册 Servlet 三大组件 之 Listner
* 添加 ServletListenerRegistrationBean ,就相当于以前在 web.xml 中配置的 <listener></listener>标签
*/
@Bean
public ServletListenerRegistrationBean myListener() {
/**ServletListenerRegistrationBean<T extends EventListener> 属于的是泛型,可以注册常见的任意监听器
* 将自己的监听器注册进来*/
ServletListenerRegistrationBean registrationBean = new ServletListenerRegistrationBean(new SystemListener());
return registrationBean;
}
src/main/java/org/example/servlet/MyMvcConfig.java · 汪少棠/java-se - Gitee.com