Filter & Listener
JavaWeb 三大组件
1. Servlet
2. Filter
3. Listener
Filter 过滤器 *
请求的过滤. 面向切面思想设计的程序 ( AOP )
我们常用过滤器 进行权限设置, 编码设置 等等.
使用步骤
1. 编写一个类, 实现Filter接口
2. 编写Filter接口中的三个抽象方法的实现
- init : 过滤器初始化
- doFilter: 正在过滤 , 可以放行或拦截.
- destroy : 即将销毁
3. 通过注解, 或 web.xml 配置过滤的地址.
案例:
@WebFilter("*.do")
public class CharSetFilter implements Filter {
/**
* 项目关闭或被卸载时执行
*/
@Override
public void destroy() {
System.out.println("即将销毁");
}
/**
* 参数1. 请求对象.
* 参数2. 响应对象
* 参数3. 过滤器链对象. 具备了放行的方法:doFilter
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("正在过滤");
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
chain.doFilter(request, response);
}
/**
* 项目启动时 初始化
*/
@Override
public void init(FilterConfig arg0) throws ServletException {
System.out.println("正在初始化");
}
}
web.xml配置
<filter>
<filter-name>userfilter</filter-name>
<filter-class>cn.xdl.demo2.UserFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>userfilter</filter-name>
<url-pattern>/home.jsp</url-pattern>
</filter-mapping>
过滤器链 ***
当多个过滤器 过滤同一个请求时, 就形成了过滤器链.
只有过滤器链中的所有过滤器 都选择放行时, 用户才能请求到服务器中的具体资源.
在过滤器链中, 多个过滤器的执行顺序是:
注解方式: 按照类全名自然排序 , 例如: 过滤器类cn.xdl.demo1.AFilter 就执行在过滤器cn.xdl.demo2.AFilter之前.
web.xml: 按照web.xml中配置的顺序执行.
web.xml的方式 优先于 注解方式执行.
Listener 监听器 了解
监听服务器中的一些状态事件 , 当事件发生时, 监听器执行.
服务器共分为两类事件:
1. 服务器中组件的生命周期事件.
2. 部分域对象数据变化的事件
案例:
ServletContextListener
@WebListener
public class MyServletContextListener implements ServletContextListener {
/**
* 监听Servlet上下文即将销毁
*/
public void contextDestroyed(ServletContextEvent event) {
System.out.println("servlet上下文即将销毁");
}
/**
* 监听Servlet上下文初始化完毕
*/
public void contextInitialized(ServletContextEvent event) {
System.out.println("servlet上下文正在初始化");
}
}
ServletContextAttributeListener
@WebListener
public class MyServletContextAttributeListener implements ServletContextAttributeListener {
/**
* 当属性添加时, 执行的方法
* 添加的是 一个键值对
*/
public void attributeAdded(ServletContextAttributeEvent event) {
System.out.println("监听到属性增加:");
System.out.println("键:"+event.getName());
System.out.println("值:"+event.getValue());
}
/**
* 当属性移除时 执行的方法
*/
public void attributeRemoved(ServletContextAttributeEvent event) {
// TODO Auto-generated method stub
System.out.println("监听到属性移除:");
System.out.println("键:"+event.getName());
System.out.println("值:"+event.getValue());
}
/**
* 当属性被替换时, 执行的方法
*/
public void attributeReplaced(ServletContextAttributeEvent event) {
// TODO Auto-generated method stub
System.out.println("监听到属性替换:");
System.out.println("键:"+event.getName());
System.out.println("旧值:"+event.getValue());
Object newValue = event.getServletContext().getAttribute(event.getName());
System.out.println("新值:"+newValue);
}
}
HttpSessionListener
@WebListener
public class MyHttpSessionListener implements HttpSessionListener {
/**
* 当session创建时
*/
public void sessionCreated(HttpSessionEvent arg0) {
System.out.println("session创建了");
CountUtil.change(1);
}
/**
* 当session销毁时
*/
public void sessionDestroyed(HttpSessionEvent arg0) {
System.out.println("session即将销毁了");
CountUtil.change(-1);
}
}
HttpSessionAttributeListener
@WebListener
public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener {
/**
* @see HttpSessionAttributeListener#attributeAdded(HttpSessionBindingEvent)
*/
public void attributeAdded(HttpSessionBindingEvent event) {
String name = event.getName();
Object value = event.getValue();
System.out.println("监听到session中存储数据:");
System.out.println("键:"+name);
System.out.println("值:"+value);
}
/**
* @see HttpSessionAttributeListener#attributeRemoved(HttpSessionBindingEvent)
*/
public void attributeRemoved(HttpSessionBindingEvent event) {
String name = event.getName();
Object value = event.getValue();
System.out.println("监听到session中移除数据:");
System.out.println("键:"+name);
System.out.println("值:"+value);
}
/**
* @see HttpSessionAttributeListener#attributeReplaced(HttpSessionBindingEvent)
*/
public void attributeReplaced(HttpSessionBindingEvent event) {
String name = event.getName();
Object oldValue = event.getValue();
Object newValue = event.getSession().getAttribute(name);
System.out.println("监听到session中替换数据:");
System.out.println("键:"+name);
System.out.println("旧值:"+oldValue);
System.out.println("新值:"+newValue);
}
}