目录

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

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐