1.首先我们要知道java web 有三大组件:
Servlet
Filter: 筛选器,在客户端的请求到达服务器之前进行拦截,对用户的请求进行预处理然后再传给服务器。服务器接收请求后响应产生的数据还要在此经过筛选器加工,最后到达客户端。可以用来控制权限,设置字符集等等。
Listener: 监听器,对正在运行的工程进行监听,可以检测多项数据。用来监听客户端的请求,服务器的操作,检测在线用户的数量等等。
2.具体的用法:
Filter和Listener 都是web工程的组件,不需要再引包。但是我们再web.xml里面需要进行相关的配置。
Filter:
用法和Servlet非常的相似,值得一提的是可以在配置中设置相关的变量。
<para-name>变量名</para-name><param-value>变量值</param-value>就像代码中那样。
<filter>
<filter-name>TestFilter</filter-name>
<filter-class>com.xt.lh.Filter.TestFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>"UTF-8"</param-value>
</init-param>
</filter>
Listener: 全局监听,把路径导入即可
<listener>
<listener-class>java.lang.Override</listener-class>
</listener>
3.代码示例:
Filter:这个例子中通过过滤器设置页面字符集
public class TestFilter implements Filter{
private Log log=LogFactory.getLog(TestFilter.class);
private String str="UTF-8";
@Override
public void init(FilterConfig filterConfig) throws ServletException {
String str=filterConfig.getInitParameter("encoding");
log.info("我的TestFilter开始初始化,变量encoding的值为"+str);
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
log.info("我的TestFilter开始执行");
if(str!=null&&"".equals(""))
request.setCharacterEncoding(str);
chain.doFilter(request, response);
}
@Override
public void destroy() {
System.out.println("我的TestFilter开已经销毁");
}
}
Listener:这个例子通过监听器监听session的创建和销毁过程
public class TestListerner implements HttpSessionListener{
@Override
public void sessionCreated(HttpSessionEvent se) {
Integer num=0;
Object o= se.getSession().getServletContext().getAttribute("num");
if(o!=null)
num=(Integer) o;
num ++;
se.getSession().getServletContext().setAttribute("num", num);
System.out.println("sessionId:" + se.getSession().getId() + "被创建了");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
Integer num=(Integer)se.getSession().getServletContext().getAttribute("num");
num--;
se.getSession().getServletContext().setAttribute("num", num);
System.out.println("sessionId:" + se.getSession().getId() + "被销毁了");
}
}
4.总结一下:我们可以看到,两者的区别在于,过滤器会干预访问的进程,只希望通过一些符合要求的东西;而监听器只想获得客户访问过程中的具体信息,而不去干预访问的进程。