内置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方法

浙公网安备 33010602011771号