struts2的源代码分析及struts2的工作流程(二)
(4)调用被请求的Action的执行方法。
????????? execute.executeAction(request, response, mapping);
???????????? public void executeAction(HttpServletRequest request, HttpServletResponse response,
??????????????????????? ActionMapping mapping) throws ServletException {
?????????? ? ? ? ?? dispatcher.serviceAction(request, response, servletContext, mapping);//这个方法里具体的处
?????????????????????????????????????????????????????????????????????? //理Action调用,包括调用Action前后调用拦截器(Interceptor);
?????????????? }
??
?????? 以下是调用Dispatcher类中serviceAction()的源代码:
?
?
??? 需要要先说明 一下关于Configuration config = configurationManager.getConfiguration();
在容器启动时先加载Struts2的配置文件,如果没有人为配置,则默认加载struts-default.xml、struts-plugin.xml和struts.xml,并且将配置信息保存在形如com.opensymphony.xwork2.config.entities.XxxxConfig的类中。
类com.opensymphony.xwork2.config.providers.XmlConfigurationProvider负责配置文件的读取和解析, addAction()方法负责读取<action>标签,并将数据保存在ActionConfig中;
addResultTypes()方法负责将<result-type>标签转化为ResultTypeConfig对象;loadInterceptors()方法负责将<interceptor>标签转化为InterceptorConfi对象;
loadInterceptorStack()方法负责将<interceptor-ref>标签转化为InterceptorStackConfig对象;loadInterceptorStacks()方法负责将<interceptor-stack>标签转化成InterceptorStackConfig对象。
而上面的方法最终会被addPackage()方法调用,将所读取到的数据汇集到PackageConfig对象中,要清楚明白这是容器启动时这工作,现在说的是struts处理请求的情况了。
所以根据namespace, actionName去configuration中找到是否有对应的ActionConfig
getActionConfig(namespace, actionName);在前面说mapping中的namespace时已经分析过了,如不清楚可以回前面看看。
invocation.init(this);是调用了DefaultActionInvocation的方法,在这方法里根据前面的信息,创建了一个请求的Action处理o?
?
?
?
创建Action完成了,现再往下一步就是?? proxy.execute();真正地去调用action的方法了。跟进去祥细介绍如下:
??? 执行的是StrutsActionProxy类的execute()方法,调用invocation.invoke();?
?
?拦截器的调用活动图:
?
?
最后再说下有些朋友很关注struts2是在什么时候给action的各个属性setAttribute()的呢?其实这个过程是在调用ParametersInterceptor拦截器时
在执行doIntercept()中完成set值的。源码如下?
?呵呵,先分析到这里的,如果朋友有什么地方还不清楚的,可以指出,我会尽我最大努力为你解决。让我们共同学习共同进步。
?