struts2 框架处理流程

时间:2021-12-13 11:10:39

struts2 框架处理流程

流程图如下:

struts2 框架处理流程

注意:StrutsPrepareAndExecuteFilter替代了2.1.3以前的FilterDispatcher过滤器,使得在执行Action之前可以添加过滤器了。

文档说明:Deprecated.Since Struts 2.1.3, use StrutsPrepareAndExecuteFilter instead or StrutsPrepareFilter and StrutsExecuteFilter if needing using the ActionContextCleanUp filter in addition to this one

下面对上面这个流程图进行详细解释:

首先,客户端通过HttpServletRequest,向servlet容器(tomcat)提交一个请求,这个请求会经过一系列的过滤器,像ActionContextCleanUp以及其它的过滤器等,经过这些过滤器以后,最终会被struts的核心控制器过滤到,也就是StrutsPrepareAndExecuteFilter。

被核心过滤器过滤到以后,核心控制器会访问ActionMapper,来决定是否要调用某一个action,也就是用户是否要请求某一个action。如果用户请求的是某一个jsp页面,或者是其它的资源,则不会访问我们的action。如果ActionMapper决定需要调用某一个action,这个时候,struts中的核心控制器会将控制权委派给ActionProxy,也就是action代理。然后,ActionProxy,Configuration Manager配置管理器来加载struts的核心配置文件,即struts.xml(action配置在struts.xml里).

如果在struts.xml中找到了要调用的action,ActionProxy(ActionProxy是Action的一个代理类,也就是说Action的调用是通过ActionProxy实现的,其实就是调用了ActionProxy.execute()方法,而该方法又调用了ActionInvocation.invoke()方法)会创建ActionInvocation的一个实例。Action Invocation里面包含了所创建的action的实例,同时它里面还有另外一个非常重要的部分,就是拦截器Interceptor。

(ActionInvocation 是Xworks 中Action 调度的核心。而对Interceptor 的调度,也正是由ActionInvocation负责。ActionInvocation 是一个接口, 而DefaultActionInvocation 则是Webwork 对ActionInvocation的默认实现。

Interceptor 的调度流程大致如下: 

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

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

在调用action之前,或者调用action之后,它还需要调用非常多的拦截器。在调用action之前,首先会依次调用所配置的拦截器,如果拦截器有多个,也会依次执行。比方说,它会首先执行第一个拦截器,那么紧接着执行第二个拦截器,再执行第三个拦截器等等。当把这些拦截器执行完了以后,它才会执行我们的action。那么执行action我们会非常熟悉,它会调用action里的业务处理方法,进行业务的处理,同时这个方法会返回一个结果(字符串),然后根据这个返回的字符串去调用视图去匹配result,一般来说会返回一个jsp页面,或者去调用另外的某一个action。

当返回这个视图以后,它真的去响应用户了吗。实际上并没有,它会将之前执行过的拦截器再倒过来执行一遍,也就是执行第三个拦截器,再是第二个,再是第一个。反向执行拦截器之后,才会进行最终的请求的响应。

友情链接:

ActionContextCleanUP

ActionContextCleanUP过滤器来完成清除属性,不让后续的filter(FilterDispatcher)清除,从而延长action中属性的生命周期,以便在jsp页面中进行访问。

StrutsPrepareAndExecuteFilter

StrutsPrepareAndExecuteFilter 与 FilterDispatcher的区别