关于Servlet和Filter的运行机制的原理可以通过网络来获取一些资源进行了解,本文主要通过实验的方式来展示Servlet和Filter之间的运行机制。
1.准备工作
创建两个Filter和一个Servlet,并配置好执行的信息。
EncodingFilter:
说明:类EncodingFilter是一个Filter接口的实现类,其FilterName为EncodingFilter,对请求/TestServlet进行过滤。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<code>@WebFilter</code><code>(filterName = </code><code>"EncodingFilter"</code><code>, urlPatterns = { </code><code>"/TestServlet"</code> <code>})</code>
<code>public</code> <code>class</code> <code>EncodingFilter </code><code>implements</code> <code>Filter {</code>
<code> </code><code>@Override</code>
<code> </code><code>public</code> <code>void</code> <code>init(FilterConfig filterConfig) </code><code>throws</code> <code>ServletException {</code>
<code> </code><code>}</code>
<code> </code><code>public</code> <code>void</code> <code>doFilter(ServletRequest request, ServletResponse response,</code>
<code> </code><code>FilterChain chain) </code><code>throws</code> <code>IOException, ServletException {</code>
<code> </code><code>System.out.println(</code><code>"1进入EncodingFilter"</code><code>);</code>
<code> </code><code>response.setContentType(</code><code>"text/plain;charset=utf-8"</code><code>);</code>
<code> </code><code>response.setCharacterEncoding(</code><code>"UTF-8"</code><code>);</code>
<code> </code><code>response.getWriter().println(</code>
<code> </code><code>new</code> <code>SimpleDateFormat(</code><code>"yyyy-MM-dd HH:mm:ss"</code><code>).format(</code><code>new</code> <code>Date())</code>
<code> </code><code>+ </code><code>" EncodingFilter output doFilter Before "</code><code>);</code>
<code> </code><code>chain.doFilter(request, response);</code>
<code> </code><code>+ </code><code>" EncodingFilter output doFilter After "</code><code>);</code>
<code> </code><code>System.out.println(</code><code>"6退出EncodingFilter"</code><code>);</code>
<code> </code><code>public</code> <code>void</code> <code>destroy() {</code>
<code>}</code>
RequestFilter:
说明:类RequestFilter是一个Filter接口的实现类,其FilterName为RequestFilter,对请求/TestServlet进行过滤。
<code>@WebFilter</code><code>(filterName = </code><code>"RequestFilter"</code><code>, urlPatterns = { </code><code>"/TestServlet"</code> <code>})</code>
<code>public</code> <code>class</code> <code>RequestFilter </code><code>implements</code> <code>Filter {</code>
<code> </code><code>System.out.println(</code><code>"2进入RequestFilter"</code><code>);</code>
<code> </code><code>+ </code><code>" RequestFilter output doFilter Before "</code><code>);</code>
<code> </code><code>+ </code><code>" RequestFilter output doFilter After "</code><code>);</code>
<code> </code><code>System.out.println(</code><code>"5退出RequestFilter"</code><code>);</code>
TestServlet:
说明:类TestServlet是一HttpServlet的子类类,其ServletName为TestServlet,请求URL为/TestServlet。
<code>@WebServlet</code><code>(name=</code><code>"TestServlet"</code><code>,urlPatterns={</code><code>"/TestServlet"</code><code>})</code>
<code>public</code> <code>class</code> <code>TestServlet </code><code>extends</code> <code>HttpServlet {</code>
<code> </code><code>private</code> <code>static</code> <code>final</code> <code>long</code> <code>serialVersionUID = -1920658493279782543L;</code>
<code> </code><code>protected</code> <code>void</code> <code>service(HttpServletRequest req, HttpServletResponse resp)</code>
<code> </code><code>throws</code> <code>ServletException, IOException {</code>
<code> </code><code>System.out.println(</code><code>"3进入TestServlet"</code><code>);</code>
<code> </code><code>resp.getWriter().println(</code>
<code> </code><code>+ </code><code>" TestServlet output "</code><code>);</code>
<code> </code><code>System.out.println(</code><code>"4退出TestServlet"</code><code>);</code>
2.部署,执行
在Servlet2.x中我们需要把Servlet和Filter都配置到web.xml,而Servlet3.x中已经不需要这么做了,可参见上面的代码,可以看出通过注解的方式即可实现配置。
部署环境是Apache Tomcat v7.0。
按照1中代码内容所示,期望的执行顺序是:
EncodingFilter-->RequestFilter-->TestServlet-->RequestFilter->EncodingFilter.
请求:localhost:8080/TestFilter/TestServlet 后如下面图所示即可看出运行结果:
<a href="http://s3.51cto.com/wyfs02/M00/4D/99/wKiom1RUfYLxKmFUAADQoqYJDKM072.jpg" target="_blank"></a>
图a-1
<a href="http://s3.51cto.com/wyfs02/M01/4D/99/wKiom1RUfhTxkfNMAAGRWcQJrSU319.jpg" target="_blank"></a>
图a-2
注意到图a-1的输出内容和图a-2的地址栏请求和页面内容可以看到,程序运行的结果完全按照我们的期望来执行的。
3.问题
a.上述注解中并没有指定Filter的顺序,那么两个Filter是如何排列顺序的呢?注解中并没有可以指定该顺序的属性,我们知道在Servlet2.x中通过在web.xml配置Filter的顺序来实现的。
b.从上述程序中的EncodingFilter和RequestFilter都执行了chain.doFilter(request,response)方面,如果有Filter没有执行到chain.doFilter(request,response)的话,输出内容又该是怎样的呢?
本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/1570689,如需转载请自行联系原作者