实战-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
@WebFilter (filterName =  "EncodingFilter" , urlPatterns = {  "/TestServlet"  })
public  class  EncodingFilter  implements  Filter {
 
     @Override
     public  void  init(FilterConfig filterConfig)  throws  ServletException {
 
     }
 
     @Override
     public  void  doFilter(ServletRequest request, ServletResponse response,
             FilterChain chain)  throws  IOException, ServletException {
         System.out.println( "1进入EncodingFilter" );
         response.setContentType( "text/plain;charset=utf-8" );
         response.setCharacterEncoding( "UTF-8" );
         response.getWriter().println(
                 new  SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ).format( new  Date())
                         " EncodingFilter output doFilter Before " );
         chain.doFilter(request, response);
         response.getWriter().println(
                 new  SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ).format( new  Date())
                         " EncodingFilter output doFilter After " );
         System.out.println( "6退出EncodingFilter" );
     }
 
     @Override
     public  void  destroy() {
     }
}


  RequestFilter:

  说明:类RequestFilter是一个Filter接口的实现类,其FilterName为RequestFilter,对请求/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
@WebFilter (filterName =  "RequestFilter" , urlPatterns = {  "/TestServlet"  })
public  class  RequestFilter  implements  Filter {
 
     @Override
     public  void  init(FilterConfig filterConfig)  throws  ServletException {
     }
 
     @Override
     public  void  doFilter(ServletRequest request, ServletResponse response,
             FilterChain chain)  throws  IOException, ServletException {
         System.out.println( "2进入RequestFilter" );
         response.getWriter().println(
                 new  SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ).format( new  Date())
                         " RequestFilter output doFilter Before " );
         response.getWriter().println(
                 new  SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ).format( new  Date())
                         " RequestFilter output doFilter After " );
         System.out.println( "5退出RequestFilter" );
     }
 
     @Override
     public  void  destroy() {
     }
}


 TestServlet:

 说明:类TestServlet是一HttpServlet的子类类,其ServletName为TestServlet,请求URL为/TestServlet。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@WebServlet (name= "TestServlet" ,urlPatterns={ "/TestServlet" })
public  class  TestServlet  extends  HttpServlet {
     private  static  final  long  serialVersionUID = -1920658493279782543L;
 
     @Override
     protected  void  service(HttpServletRequest req, HttpServletResponse resp)
             throws  ServletException, IOException {
         System.out.println( "3进入TestServlet" );
         resp.getWriter().println(
                 new  SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ).format( new  Date())
                         " TestServlet output " );
         System.out.println( "4退出TestServlet" );
     }
}


2.部署,执行

  在Servlet2.x中我们需要把Servlet和Filter都配置到web.xml,而Servlet3.x中已经不需要这么做了,可参见上面的代码,可以看出通过注解的方式即可实现配置。


  部署环境是Apache Tomcat v7.0。

  

  按照1中代码内容所示,期望的执行顺序是:

  EncodingFilter-->RequestFilter-->TestServlet-->RequestFilter->EncodingFilter.

 

  请求:localhost:8080/TestFilter/TestServlet 后如下面图所示即可看出运行结果:

 

wKiom1RUfYLxKmFUAADQoqYJDKM072.jpg

图a-1

wKiom1RUfhTxkfNMAAGRWcQJrSU319.jpg

图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,如需转载请自行联系原作者

相关文章
|
前端开发 JavaScript Java
Web.xml - Servlet与Filter的url-pattern
Web.xml - Servlet与Filter的url-pattern
119 8
|
3月前
|
JavaScript Java 容器
servlet过滤器Filter简要回顾-过滤请求字符编码,/和/*和/**的区别
本文简要回顾了Servlet过滤器Filter的概念和使用,通过实例演示了如何创建过滤器以过滤请求字符编码,并解释了在web.xml中配置过滤器时使用`/`、`/*`和`/**`的区别。
servlet过滤器Filter简要回顾-过滤请求字符编码,/和/*和/**的区别
|
6月前
|
NoSQL Java Redis
深入理解Servlet Filter及其限流实践
深入理解Servlet Filter及其限流实践
175 44
|
6月前
|
前端开发 安全 Java
Java服务器端开发实战:利用Servlet和JSP构建动态网站
【6月更文挑战第23天】**Servlet和JSP在Java Web开发中扮演关键角色。Servlet处理业务逻辑,管理会话,JSP则结合HTML生成动态页面。两者协同工作,形成动态网站的核心。通过Servlet的doGet()方法响应请求,JSP利用嵌入式Java代码创建动态内容。实战中,Servlet处理数据后转发给JSP展示,共同构建高效、稳定的网站。虽然新技术涌现,Servlet与JSP仍为Java Web开发的基石,提供灵活且成熟的解决方案。**
85 8
|
7月前
|
Java
springboot项目出现Exception in thread “main“ java.lang.NoClassDefFoundError: javax/servlet/Filter
springboot项目出现Exception in thread “main“ java.lang.NoClassDefFoundError: javax/servlet/Filter
266 0
|
7月前
Servlet3.0+环境下使用注解注册Servlet、Filter和Listener组件
Servlet3.0+环境下使用注解注册Servlet、Filter和Listener组件
77 2
|
7月前
|
前端开发 Java 容器
SpringBoot中注册Servlet、Filter和Listener(代码和注解两种方式)
SpringBoot中注册Servlet、Filter和Listener(代码和注解两种方式)
138 0
|
7月前
|
缓存 Java Spring
servlet/filter/listener/interceptor区别与联系
servlet/filter/listener/interceptor区别与联系
74 0
|
XML 监控 Java
Java Web 项目入门指南(http、Servlet、Request、Response、ServletContext、会话技术[cookie、session]、Filter、Listener)4
Java Web 项目入门指南(http、Servlet、Request、Response、ServletContext、会话技术[cookie、session]、Filter、Listener)4
|
存储 安全 Java
Java Web 项目入门指南(http、Servlet、Request、Response、ServletContext、会话技术[cookie、session]、Filter、Listener)3
Java Web 项目入门指南(http、Servlet、Request、Response、ServletContext、会话技术[cookie、session]、Filter、Listener)3