===================================
第零步: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执行过程