天天看点

实战-JavaWweb的Servlet和Filter运行关系(一)

  关于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--&gt;RequestFilter--&gt;TestServlet--&gt;RequestFilter-&gt;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,如需转载请自行联系原作者