给初学者的建议
- 过滤器 Filter 及监听器 Listener 在 JavaWeb 开发中很少直接使用,但经常使用在 java 框架中仿照两者的设计思想而创造出来的其他技术,比如 Struts2 中的拦截器,另外在其他框架中也用到了两者并且充当十分重要的角色,比如在 Struts2 框架中采用过滤器作为核心来加载配置文件,拦截请求资源等等。在 Spring 中利用监听器来加载 Spring 核心配置文件。因此初学者还是很有必要对这两个技术核心内容熟悉并掌握的。
监听器 Listener
概念
所谓的监听器是指对整个 WEB 环境的监听,当被监视的对象发生改变时,立即调用相应的方法进行处理。
作用
每个监听器的具体作用不再一一列举,此处只对监听接口做一个列举汇总,若对于某个监听器有疑惑或者感兴趣,自己可以写个例子做下测试。
- 监听域对象创建与销毁
- ServletContextListener
- HttpSessionListener
- ServletRequestListener
- 需要在 web.xml 中配置对应标签
- 监听域对象属性变更(添加,替换,删除)
- ServletContextAttributeListener
- HttpSessionAttributeListener
- ServletRequestAttributeListener
- 需要在 web.xml 中配置对应标签
- 实现指定接口 JavaBean,从 session 作用域存放或异常监听
- HttpSessionBindingListener
- 该监听器需配置到对应的 JavaBean 上
- 监听特殊 JavaBean 在 session 作用域的活化与钝化
- HttpSessionActivationListener
- 该监听器需配置到对应的 JavaBean 上
过滤器 Filter
过滤器的配置
- 定义一个实现 Filter 接口的实现类
- 实现对应的
init(),doFilter(),destory()
** 方法** - 在 web.xml 中配置
<filter>
** 标签及对应的**<filter-mapping>
** 标签**
Filter 生命周期
过滤器从创建到销毁的过程
- 服务器启动的时候,服务器就会创建过滤器的对象,每次访问被拦截目标资源,过滤器中的 doFilter 的方法就会执行。当服务器关闭的时候,服务器就会销毁 Filter 对象。
- 服务器在启动时执行初始化方法,init。
- 访问资源被拦截时执行拦截方法,doFiter。放行:chain.doFilter(request,response)
- 服务器关闭时执行销毁方法,destory
注意:FilterChain 过滤器链中的过滤器的执行的顺序跟 <filter-mapping> 的配置顺序有关,顺序在前先执行,顺序在后,后执行
- 过滤器的配置
- url-pattern 的配置与 servlet 中的配置一样:
- 完全路径匹配:以
/
开始/aaa
,/aaa/bbb
- 目录匹配:以
/
** 开始,/*
,**/aaa/*
- 扩展名匹配:不能以
/
** 开始,*.do
,*.jsp
,*.action
**
- 完全路径匹配:以
- url-pattern 的配置与 servlet 中的配置一样:
有关 Filter 中对 doFilter 方法的理解
public class DemoFilter implements javax.servlet.Filter {
public void destroy() {
}
public void doFilter(javax.servlet.ServletRequest req, javax.servlet.ServletResponse resp, javax.servlet.FilterChain chain) throws javax.servlet.ServletException, IOException {
HttpServletRequest httpServletRequest = (HttpServletRequest) req;
System.out.println(httpServletRequest.getRequestURI()+"走进来了~~~~");
chain.doFilter(req, resp);
//程序代码...
}
public void init(javax.servlet.FilterConfig config) throws javax.servlet.ServletException {
}
}
- 思考:上述代码中,若是在该 Filter 中在执行
chain.doFilter(req,resp)
** 之后再加一下程序代码,那么这些程序代码的执行时机是什么时候呢?**- 可以这么理解:该 web 应用中所有的过滤器会形成一条按照在 web.xml 中配置 <filter-mapping> 的前后顺序组成的链,每执行到一个
chain.doFilter(req,resp)
** 的时候就会去执行下一个过滤器程序,当下一个过滤程序执行完毕后会返回到本程序接着走下面的**程序代码
** ,所以说过滤器链是一个有去有回的过程。**
- 可以这么理解:该 web 应用中所有的过滤器会形成一条按照在 web.xml 中配置 <filter-mapping> 的前后顺序组成的链,每执行到一个
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于