总结:
1、在struts2的配置文件中
两大类型的配置
一种类型 独立于包外的
bean
constant
include
一种类型 package
action,interceptor,result等都是在package中的,可以利用extend机制继承
2、在执行过滤器的过程中
1、创建ActionContext(prepare.createActionContext(request, response))
1、创建actionContext
2、创建值栈
3、把actionContext加入到当前线程中
2、创建actionProxy(ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(
namespace, name, method, extraContext, true, false))
执行DefaultActionInvocation的init方法
1、创建action
2、把action放入到栈顶
3、创建所有的拦截器,并且产生拦截器的迭代器
3、执行Proxy的execute方法(proxy.execute())
proxy.execute()---->invocaction.invoke方法
1、执行所有的拦截器
2、执行当前请求的action
3、执行PreResultListener
4、执行结果集
4、清除数据(prepare.cleanupRequest(request)) 在finally中,这样即便出错,也能清除
大致流程如下(伪码)
1.当服务器启动的时候,会去执行org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter过滤器里的init方法
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter过滤器的init方法里主要发生两件事:
//把servlet容器与struts2核心过滤器做了一个整合
FilterHostConfig config = new FilterHostConfig(filterConfig);
//初始化所有的资源文件 default.properties,struts-default.xml,struts-plugin.xml,struts.xml
dispatcher = init.initDispatcher(config);
2.当发出请求的时候会进行如下操作:
(一)createActionContext(创建ActionContext)做了如下操作
(1).创建ActionContext对象
(2).创建ValueStack
(3).把整个ActionContext对象放到了ThreadLoacl中
(二)execute.executeAction 做了如下操作:
上图中右下图也是Dispather类中的。
⑴.创建actionProxy
执行DefaultActionInvocation的init方法
1、创建action
2、把action放入到栈顶
3、创建所有的拦截器,并且产生拦截器的迭代器
⑵执行Proxy的execute方法
proxy.execute()---->invocaction.invoke方法
1、执行所有的拦截器
2、执行当前请求的action
3、执行PreResultListener,将模型驱动至于栈顶
4、执行结果集