FilterDispatcher:过滤器

控制器(StrutsPrepareAndExecuteFilterFilterDispatcher

 

==========================================================================

Struts2体系结构图以及详解》 

http://blog.csdn.net/tender001/article/details/7582146 

FilterDispatcher是控制器的核心,就是mvcc控制层的核心。 
下面粗略的分析下我理解的FilterDispatcher工作流程和原理:FilterDispatcher进行初始化并启用核心doFilter

 

du.serviceAction(request, response, servletContext, mapping);  

//这个方法询问ActionMapper是否需要调用某个Action来处理这个(request)请求,如果ActionMapper决定需要调用某个ActionFilterDispatcher把请求的处理交给ActionProxy  

 

ActionProxy通过Configuration Managerstruts.xml)询问框架的配置文件,找到需要调用的Action.  

 

ActionProxy创建一个ActionInvocation的实例,同时ActionInvocation通过代理模式调用Action

ActionProxyAction的一个代理类,也就是说Action的调用是通过ActionProxy实现的,其实就是调用了ActionProxy.execute()方法,而该方法又调用了ActionInvocation.invoke()方法。归根到底,最后调用的是DefaultActionInvocation.invokeAction()方法。

但在调用之前ActionInvocation会根据配置加载Action相关的所有Interceptor

 

ActionInvocation Xworks Action 调度的核心。而对Interceptor 的调度,也正是由ActionInvocation负责。

ActionInvocation 是一个接口,而DefaultActionInvocation 则是Webwork ActionInvocation的默认实现。  

 

Interceptor 的调度流程大致如下:  

1. ActionInvocation初始化时,根据配置,加载Action相关的所有Interceptor  

2. 通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor  

 

Interceptor将很多功能从我们的Action中独立出来,大量减少了我们Action的代码,独立出来的行为具有很好的重用性。XWorkWebWork的许多功能都是有Interceptor实现,可以在配置文件中组装Action用到的Interceptor,它会按照你指定的顺序,在Action执行前后运行。  

 

那么什么是拦截器。  

拦截器就是AOPAspect-Oriented Programming)的一种实现。(AOP是指用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。)  

拦截器的例子这里就不展开了。  

 

一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。如上文中将结构返回“add.jsp”,但大部分时候都是返回另外一个action,那么流程又得走一遍。

==========================================================================

==========================================================================

过滤器:

filter功能:用户可以改变一个request和修改一个response

Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开servlet时处理response.换种说法,filter其实是一个”servlet chaining”(servlet ).

 

一个filter 包括:

1. servlet被调用之前截获;

2. servlet被调用之前检查servlet request;

3. 根据需要修改request头和request数据;

4. 根据需要修改response头和response数据;

5. servlet被调用之后截获.

 

通常我们所访问的资源是一个servletjsp页面,而jsp其实是一个被封装了的servlet(每个jsp执行前都会被转化为一个标准的servlet,这点若还有不明白的请自己到网上查一下吧),于是我们就可以统一地认为我们每次访问的都是一个Servlet,而每当我们访问一个servlet时,web容器都会调用该Servletservice方法去处理请求。而在service方法又会根据请求方式的不同(Get/Post)去调用相应的doGet()doPost()方法,实际处理请求的就是这个doGetdoPost方法。写过servlet的朋友都应该知道,我们在doGet(或doPost)方法中是通过response.getWriter()得到客户端的输出流对象,然后用此对象对客户进行响应。

 

       到这里我们就应该理解了过滤器的执行流程了:执行第一个过滤器的chain.doFilter()之前的代码——>第二个过滤器的chain.doFilter()之前的代码——>……——>n个过滤器的chain.doFilter()之前的代码——>所请求servletservice()方法中的代码——>所请求servletdoGet()doPost()方法中的代码——>n个过滤器的chain.doFilter()之后的代码——>……——>第二个过滤器的chain.doFilter()之后的代码——>第一个过滤器的chain.doFilter()之后的代码。

==========================================================================

 

《过滤器与拦截器》

1、拦截器是基于java反射机制的,而过滤器是基于函数回调的。  

2、过滤器依赖与servlet容器,而拦截器不依赖与servlet容器。  

3、拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。  

4、拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。  

5、在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。

 

posted @ 2015-09-26 23:02  Uncle_Nucky  阅读(2071)  评论(0编辑  收藏  举报