struts2 Action创建过程分析

//源头:org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
===================================
第零步:Struts Filter初始化
===================================
关键概念:
InitOperations
PrepareOperations
ExecuteOperations
FilterHostConfig
Dispatcher

===================================
第一步:ActionMapping创建
===================================
URL:http://localhost:8080/basic/My.do
对于浏览器发出的每个新的request,都会创建一个ActionMapping对象,
这里的request、response、servletContext等servlet基本元素,都是经过应用服务器(如Tomcat)包装过的实现
ActionMapping mapping = prepare.findActionMapping(request, response);


===================================
第二步:创建Action并执行(一)
===================================
execute.executeAction(request, response, mapping);


struts2的所有细节都包含在Dispatcher的serviceAction方法中
在详细分析之前,先介绍一个很重要的类:ActionContext,该类利用ThreadLocal持有一个action执行过程中要用到的所有对象,如session,application,valueStack...

回到Dispatcher.serviceAction(...):
(1)创建ValueStack,ValueStack可以看作是呈现层的数据源(有待研究...)
(2)创建ActionProxy

//src:com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy
        DefaultActionProxy proxy = new DefaultActionProxy(inv, namespace, actionName, methodName, executeResult, cleanupContext);
        container.inject(proxy);
        proxy.prepare();

===================================
第二步:创建Action并执行(二)
DefaultActionProxy.prepare();
===================================
//src:com.opensymphony.xwork2.DefaultActionProxy.prepare()
//读取action配置信息
config = configuration.getRuntimeConfiguration().getActionConfig(namespace, actionName);
//确定调用的方法(默认:execute)
resolveMethod();
//(1)objectFactory(spring)真正创建Action对象
//(2)获取该action的interceptors
invocation.init(this);

init方法:
createAction() {
//...
     action = objectFactory.buildAction(proxy.getActionName(),     proxy.getNamespace(), proxy.getConfig(), contextMap);
//...
}
        List<InterceptorMapping> interceptorList = new ArrayList<InterceptorMapping>(proxy.getConfig().getInterceptors());
        interceptors = interceptorList.iterator();

===================================
action创建过程大致分析完毕。
待补充的内容
(1)objectFactory.buildAction的执行过程(struts2 & spring)
(2)action执行过程

猜你喜欢

转载自sleepyy.iteye.com/blog/1315687
今日推荐