1 Filter过滤器
Filter过滤器是JavaWeb三大组件之一,三大组件分别为:Servlet、Filter以及Listener,过滤器是向web应用程序的请求和响应处理添加功能的Web服务组件。
过滤器可以简单理解为在浏览器和web资源之间的一道过滤网,在访问资源之前可以通过一系列的过滤器对请求进行修改、判断以及拦截等,也可以对响应进行修改、判断以及拦截。
使用Filter过滤器方式:
-
自定义类实现Filter接口并重写doFilter方法
public class LoginFilter implents Filter{ public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain){ chain.doFilter(request,response); } }
-
在web.xml文件中配置过滤器
<filter> <filter-name>LoginFilter</filter-name> <filter-class>com.bjx.LoginFilter</filter-class> <filter-mapping> <filter-name>LoginFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </filter>
2 Filter接口
Filter接口主要用于描述过滤器对象,可以对资源的请求和资源的响应操作进行筛选操作。常用方法如下:
方法声明 | 功能介绍 |
---|---|
void init(FilterConfig config) | 实现过滤器的初始化 |
void doFilter(ServletRequest request,ServletResponse response,FilterChainn chain) | 执行过滤操作 |
void destroy() | 视线对过滤器的销毁 |
FilterConfig接口主要用于描述过滤器的配置相关信息,常用方法如下:
方法声明 | 功能介绍 |
---|---|
String getFilterName() | 获取过滤器的名字 |
String getInitParmeter(String name) | 获取指定的初始化参数信息 |
Enumeration getInitParameterNames() | 获取所有的初始化操作名称 |
ServletContext getServletContext() | 获取ServletContext对象 |
当项目中配置多个过滤器时,是怎样执行的,具体顺序如下:
过滤器优点:
- 实现代码的可插拔性,既增加或减少某功能模块,不会影响程序的正常执行
- 可以将多个相同处理逻辑的模块集中写在过滤器里面,实现代码重复利用,方便代码的维护。
3 Listener监听器
Listener监听器用来监听Servlet容器产生的事件并进行相应的处理。
容器产生的事件分类如下:
- 生命周期相关事件
- 属性状态相关事件
- 存值状态相关事件
监听器的底层原理是采用接口回调的方式实现
监听器基本分类:
方法声明 | 功能介绍 |
---|---|
ServletRequestListener | 监听request作用域的创建和销毁 |
ServletRequestAttributeListener | 监听request作用域的属性状态变化 |
HttpSessionListener | 监听session作用域的创建和销毁 |
HttpSessionAttributeListener | 监听session作用域的属性状态变化 |
ServletContextListener | 监听application作用域的创建和销毁 |
ServletContextAttributeListener | 监听application作用域的属性状态变化 |
HttpSessionBindingListener | 监听对象与session的绑定和解除 |
HttpSessionActivationListener | 监听session数值的钝化和活化 |
3.1 ServletRequestListener
在ServletRequestListener创建和关闭时都会通知ServletRequestListener监听器,常用方法如下:
方法声明 | 功能介绍 |
---|---|
void requestInitialized(ServletRequestEvent are) | 实现ServletRequest对象的初始化 |
void requestDestoryed(ServletRequestEvent are) | 实现ServletRequest对象的销毁 |
3.2 ServletRequestAttributeListener
向ServletRequest添加、删除或者替换一个属性的时候,将会通知ServletRequestAttributeListener监听器,常用方法如下:
方法声明 | 功能介绍 |
---|---|
void attributeAdded(ServletRequestAttributeEvent sra) | 增加属性时触发 |
void attributeReplaced(ServletRequestAttributeEvent sra) | 修改属性时触发 |
void attributeRemoved(ServletRequestAttributeEvent sra) | 删除属性时触发 |
3.3 HttpSessionListener
当一个HttpSession刚被创建或者失效的时候,将会通知HttpSessionListener监听器,常用方法如下:
方法声明 | 功能介绍 |
---|---|
void sessionCreated(HttpSessionEvent se) | 当一个HttpSession对象被创建时会调用这个方法 |
void sessionDestoryed(HttpSessionEvent se) | 当一个HttpSession超时或者调用HrrpSession的invalidate()方法让它销毁时,调用这个方法 |
3.4 HttpSessionAttributeListener
HttpSession中添加、删除或者替换一个属性的时候,将会通知HttpSessionAttributeListener监听器,常用方法如下:
方法声明 | 功能介绍 |
---|---|
void attributeAdded(HttpSessionBinndinngEvent se) | 当往会话中添加属性时调用 |
void attributeRemoved(HttpSessionBinndinngEvent se) | 从会话中删除属性时调用 |
void attributeReplaced(HttpSessionBinndinngEvent se) | 改变会话中的属性就会调用 |
3.5 ServletContextListener
ServletContext创建和关闭都回通知ServletContextListener监听器,常用方法如下:
方法声明 | 功能介绍 |
---|---|
void contextInnitialized(ServletContextEvent sce) | 当ServletContextEvent 创建的时候,将会调用这个方法 |
void contextDestoryed(ServletContextEvent see) | 当ServletContextEvent销毁的时候,将会调用这个方法 |
3.6 ServletContextAttributeListener
向ServletContext中添加、删除或者替换一个属性的时候,将会通知ServletContextAttributeListener监听器,常用方法如下:
方法声明 | 功能介绍 |
---|---|
void attributeAdded(ServletContextAttributeEvent se) | 往ServletContext中添加一个属性时触发 |
void attributeRemoved(ServletContextAttributeEvent se) | 往ServletContext中删除一个属性时触发 |
void attributeReplaced(ServletContextAttributeEvent se) | 改变ServletContext中的一个属性时触发 |
3.7 HttpSessionBindingListener
HttpSession中绑定和解除绑定时,将会通知HttpSessionBindingListener监听器,常用方法如下:
方法声明 | 功能介绍 |
---|---|
void valueBound(HttpSessionBindingEvent ev) | 有对象绑定时调用该方法 |
void valueUnbound(HttpSessionBindingEvent ev) | 对象解绑时调用该方法 |
3.8 HttpSessionActivationListener
当有session数值的钝化和活化操作时,将会通知HttpSessionActivationListener监听器,常用方法如下:
方法声明 | 功能介绍 |
---|---|
void sessionWillPassivate(HttpSessionnEVent se) | 有钝化操作时调用 |
void SesionDidActivate(HttpsSessionEvent se) | 有活化操作时调用 |
4 监听器案例
自定义类实现监听器接口并重写相关方法
public class OnlineUser implements HttpSessionListener,ServletContextListener{
ServletContext ct=null;
public void contextInitialized(ServletContextEvent e){
ctx=e.getServletContext();
}
public void ContextDestoryed(ServletContextEvent e){
ctx=null;
}
public sessionCreated(HttpSessionEvent hse){
Object count=servletContext.getAttribute("count");
if(null==count){
servletContext.setAttribute("count",1);
}
else{
Integer i=(Integer)count;
i++;
servletContext.setAttirbute("count",i);
}
}
public void sessionDestoryed(HttpSessionEvent hte){
System.out.println("用户已下线");
}
}
在web.xml中配置监听器
<listener>
<listeber-class>com.bjx.OnlineUser</listeber-class>
</listener>