1.JavaWeb三大组件都需要在web.xml中进行配置
2.过滤器
它会在一组资源(jsp、servlet、.css、.html等等)的前面执行!
它可以让请求得到目标资源,也可以不让请求达到!
*过滤器有拦截请求的能力!
过滤器如何编写
1.写一个类实现Filter接口
2.在web.xml中进行配置
Filter接口
void init(FilterConfig)
*创建之后马上执行;Filter会在服务器启动时就创建!
void destory()
*销毁之前执行!在服务器关闭的时候销毁
void doFilter(ServletRequest , ServletResponse, FilterChain)
*每次过滤时都会执行
Filter是单例的!
web.xml中配置:
xxx
com.xjs.web.filter.AFilter
xxx
/*
使用:
写一个过滤器AFilter:
packagecom.xjs.filter;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;public class AFilter implementsFilter{/*** 创建之后马上执行,用来做初始化!*/@Overridepublic void init(FilterConfig arg0) throwsServletException {
System.out.println("过滤器出生");
}/*** 每次过滤时都会执行*/@Overridepublic voiddoFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2)throwsIOException, ServletException {
System.out.println("开始拦截");
}/*** 销毁之前执行,用来做对非内存资源进行释放*/@Overridepublic voiddestroy() {
System.out.println("过滤器销毁");
}
}
然后在web.xml中配置Filter,指定过滤哪些路径(这里是AServlet)
xx
com.xjs.filter.AFilter
xx
/AServlet
AServlet:
packagecom.xjs;importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;public class AServlet extendsHttpServlet {public voiddoGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {
System.out.println("AServlet....");
}
}
当请求AServlet时被过滤器拦截。
FilterConfig--->与ServletConfig相似
* 获取初始化参数:getInitParameter()
* 获取过滤器名称:getFilterName()
* 获取application:getServletContext()
FilterChain
* doFilter(ServletRequest, ServletResponse):放行!
放行,就相当于调用了目标Servlet的service()方法。
多过滤器
FilterChain#doFilter()方法:
执行目标资源,或者执行下一个过滤器!
过滤器的四种拦截方式
REQUEST 默认的!
FORWARD
INCLUDE
ERROR
500
500.jsp
在<filter-mapping>中进行配置!
多个过滤器的执行顺序
的配置顺序决定了过滤器的执行顺序!
创建的FIlter
过滤器的应用场景
过滤器的应用场景:
*执行目标资源之前做预处理工作,例如设置编码,这种通常会放行,只是在目标资源执行之前做的一些准备工作;
几乎所有的Servlet中都需要写request.setCharacterEndoing()可以把它放到一个Filter中
*通过条件判断是否放行,例如校验当前用户是否已经登录,或者用户IP是否已经被禁用;
*在目标资源执行之后,做一些后续的特殊处理工作,例如把目标资源输出的数据进行处理;
回程拦截!
案例1:分ip统计网站次数
ip
count
192.168.1.111
5
192.168.1.112
62
统计工作需要在所有资源之前都执行,那么就可以放到Filter中了。
我们这个过滤器不打算做拦截操作!因为我们只是用来做统计的。
用什么东西来装载统计的数据。Map
整个网站只需要一个Map即可!
Map什么时候创建(使用ServletContextListener,在服务器启动时完成创建,并保存到ServletContext中),Map保存到哪里!(Map保存到ServletContext中!!!)
> Map需要在Filter中用来保存数据
> Map需要在页面使用,打印Map中的数据
1).网站统计每个IP地址访问本网站的次数。
使用的是注解(代替了在web.xml中的配置)
AListener监听器:
packagecom.xjs.web.listener;importjava.util.LinkedHashMap;importjava.util.Map;importjavax.servlet.ServletContext;importjavax.servlet.ServletContextEvent;importjavax.servlet.ServletContextLi