***第一份手记***
下午时间观看老师讲的视频,自己动手实践练习得出的结论,讲其分享出来给大家,不喜勿喷,有那里说的不对讲得不好还请大家一一指出,谢谢!
过滤器链的执行顺序是服务器按照web.xml文件的配置先后顺序执行的,
而过滤器的加载是从后往前的顺序加载的。
先创建一个过滤器类FilterTest:
public class FilterTest implements Filter{
static{
System.out.println("------------static------------");
}
public FilterTest() {
System.out.println("***********FilterTest()******");
}
@Override
public void destroy() {
System.out.println("FilterTestDestroy()");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("FilterTestStart---doFilter***");
chain.doFilter(request,response);
System.out.println("FilterTestEnd---doFilter***");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("FilterTestInit()");
}
}
在创建第二个过滤器类FilterDemo:
public class FilterDemo implements Filter{
static{
System.out.println("------------FilterDemoStatic------------");
}
public FilterDemo() {
System.out.println("***********FilterDemo()******");
}
@Override
public void destroy() {
System.out.println("FilterDestroy()-------");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("FilterStart------doFilter()------");
chain.doFilter(request, response);
System.out.println("FilterEnd--------doFilter()-------");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("FilterInit()");
}
}
在这两个类中定义的静态方法块,构造方法和生命周期的方法。
在web.xml文件中配置过滤器(对同一个URL进行过滤)
<filter>
<filter-name>FilterTest</filter-name>
<filter-class>com.web.filter.FilterTest</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterTest</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
<filter>
<filter-name>FilterDemo</filter-name>
<filter-class>com.web.filter.FilterDemo</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
最后在index.jsp文件中加入一段输出信息,用于判断请求执行的过程:
System.out.println("index.jsp***");
当tomcat服务器启动的时候:
------------FilterDemoStatic------------
***********FilterDemo()******
FilterInit()
------------static------------
***********FilterTest()******
FilterTestInit()
是先加载了FilterDemo的静态块然后是构造方法,接着是Filter的初始化方法,最后才加载FilterTest的静态块跟构造方法,初始化方法。
当jsp页面发送请求时:
FilterTestStart---doFilter***
FilterStart------doFilter()------
index.jsp***
FilterEnd--------doFilter()-------
FilterTestEnd---doFilter***
执行的顺序就是FilterTest的doFilter()的start接着是FilterDemo的doFilter()的start,然后在请求,请求加载完整个页面之后才是FilterDemo的End,最后才是FilterStart的End。
这里的jsp页面只输出了一句index.jsp***,而不是两句的原因是因为jsp是同一个URL已经加载完成了,所以只输出了一句。
当tomcat服务器停止的时候:
FilterDestroy()-------
FilterTestDestroy()
首先被销毁的是FilterDemo过滤器,然后在是FilterTest过滤器。
最后我们可以得出结论就是:过滤器的转载顺序是服务器按照we.xml文件中定义的顺序从后往先的顺序转载的,而过滤的顺序就是按照先后顺序过滤的,而销毁也是从后往先销毁的。