内置tomcat注册监听器和过滤器

        内置tomcat对于web组件的注册,和外置tomcat有很大的区别。比如,在外置tomcat中注册servlet,是使用web.xml文件中的<servlet>标签和<servlet-mapping>标签,或者用@WebServlet注解进行注册。而内置tomcat则采用 Tomcat.addServlet()方法来进行。 对于比较常用的两个web组件:监听器和过滤器,内置tomcat和外置tomcat的注册也有很大的区别。

         对于监听器,外置tomcat采用在web.xml文件中的<listener>标签,或者@WebListener注解来注册,那么内置tomcat如何来注册呢?我们以上下文生命周期监听器为例,来看一下内置tomcat对监听器的注册。

         首先,编写监听器类,实现ServletContextListener接口:

public class ContextPress implements ServletContextListener {
    //创建上下文对象时触发
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        //得到上下文对象
        ServletContext context = sce.getServletContext();
System.out.println("上下文创建");
……
    }
    //销毁上下文对象时触发
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        ……
    }
}

        在启动类中,通过web上下文对象的addApplicationListener方法,注册监听器。

Context context = tomcat.addContext("", null);
//注册监听器,参数为监听器类的全路径
context.addApplicationListener("com.project.listener.ContextPress");

       这样,轻松的完成了监听器类的注册。在内置tomcat启动时,就可以看到"上下文创建"打印出来。

 

        对于过滤器,外置tomcat采用在web.xml文件中的<filter>标签和<filter-mapping>标签,或者@WebFilter注解来注册,那么内置tomcat如何来注册呢?我们以字符编码过滤器为例,来看一下内置tomcat对过滤器的注册。

        首先,编写过滤器类,实现Filter接口:

public class CharFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //设置请求信息编码集
        servletRequest.setCharacterEncoding("utf-8");
        //设置响应信息编码集
        servletResponse.setContentType("text/html;charset=utf-8");
        //将请求继续向目标资源发送
        filterChain.doFilter( servletRequest, servletResponse);
    }
}

   在启动类中,通过web上下文对象的addFilterDef和addFilterMap方法,注册过滤器。

Context context = tomcat.addContext("", null);

FilterDef filterDef = new FilterDef();
filterDef.setFilter(new CharFilter()); //设置过滤器对象
filterDef.setFilterName("charFilter");//设置过滤器名称

FilterMap filterMap = new FilterMap();
filterMap.addURLPatternDecoded("/*");//设置过滤范围,可多次添加
filterMap.setFilterName("charFilter"); //该过滤范围应用的过滤器
//注册
context.addFilterDef(filterDef);
context.addFilterMap(filterMap);

        从这里可以看得出来,注册过滤器的步骤还是比较繁琐的。当需要注册多个过滤器时,会有很多冗余的代码。而且有些过滤器的过滤范围可能需要多次添加。为了重用代码,我们可以写个方法,完成过滤器的注册。

   /**
     * 注册过滤器
     * @param context 上下文对象
     * @param filterObj 过滤器对象
     * @param filterPaths 过滤范围数组
     */
    public void addFilter(Context context, Filter filterObj,String... filterPaths){
        FilterDef filterDef = new FilterDef();
        filterDef.setFilter(filterObj); //设置过滤器对象
        //设置过滤器名称,以过滤器类名做为过滤器名称
        filterDef.setFilterName(filterObj.getClass().getSimpleName());

        FilterMap filterMap = new FilterMap();
        //设置过滤范围,可多次添加
        for(String path : filterPaths){
            filterMap.addURLPatternDecoded(path);
        }

        //该过滤范围应用的过滤器
        filterMap.setFilterName(filterObj.getClass().getSimpleName()); 
        //注册
        context.addFilterDef(filterDef);
        context.addFilterMap(filterMap);
    }

          在启动类中,调用addFilter方法完成注册。

 

Context context = tomcat.addContext("", null);

//注册过滤器
this.addFilter(context, new CharFilter(), "/*");

         好了,这样注册过滤器就简洁多了。

 

总结:

      1、内置tomcat对监听器和过滤器的注册,和外置tomcat区别很大。

      2、内置tomcat注册监听器,通过web上下文对象的addApplicationListener方法完成。

      3、内置tomcat注册过滤器,通过web上下文对象的addFilterDef和addFilterMap方法

posted @ 2021-01-09 10:49  朗沃张成峰  阅读(614)  评论(0)    收藏  举报