Sturts2【四】 StrutsPrepareAndExecuteFilter源码分析<二>

本文供个人学习,复习使用,不适合他人阅读

接上文讲到ActionProxy了,还不知道这个类的作用,名字是action的代理类,实际上作用还得看看。

ExecuteOperations类

execute.executeAction调用了调度器处理action请求,看下文具体讲serviceAciton方法

Dispatcher类

532-546、都在做一件事,创建出了一个contextmap副本,也就是前文说过的ActionContext中里的数据Map,然后获取/创建ValueStack(老熟人),并存入该map副本

547-549 看不懂,可能也不是关键

549-555 关键来了,构造了ActionProxy对象,用了ActionMapping类的信息和刚刚构造的map,用一个工厂产生的,继续进入看看工厂做了什么

564、proxy.execute()内调用了invocation.invoke()开始执行拦截器链,进入拦截器链我就先不写了。

DefaultActionProxyFactory类

56、老熟人ActionInvocation(过滤器传递的对象)持有了这个map副本,然后容器注入了这个类,注入这里不懂没事,继续往下看

在这里生成了代理类,也注入了这个类,进入70行看代理类调用的prepare方法

ActionProxy类

179、config是一个ActionConfig对象,也就是struts.xml里的action配置的对象,里面还包含了拦截器,很关键

我直接说这里getActionConfig做的事,用namesoace和actionName去匹配struts.xml里的配置(用一下面的集合保存了),如果为空,就抛出异常。

取得ActionConfig的代码就这三行

 private Map<String, Map<String, ActionConfig>> namespaceActionConfigs;

 Map<String, ActionConfig> actions = namespaceActionConfigs.get(namespace);

actions.get(actionName);//但其实这里用了占位符应该取不到,要用其他,!访问应该也是取不到,要用更下面的

188、有了ActionConfig,自然知道你调用的方法了,填充到本类的method变量中

194、init做了不少事

Map<String, Object> contextMap = createContextMap();//给ActionInvocation生成ContextMap(又是这个map)

createAction(contextMap);//生成action对象,就是你访问的action对象,这里我用的spring管理action对象,所以被spring生成了,不用的话好像就是反射生成

List<InterceptorMapping> interceptorList = new ArrayList<InterceptorMapping>(proxy.getConfig().getInterceptors());
interceptors = interceptorList.iterator();//获取过滤器链的迭代器

总结

本节主要分析了ExecuteOperations调用Dispatcher.serviceAction()处理action中所作的操作,出现了总览图中的ActionProxy 类,对应了下图这一步骤

关键代码:

ActionProxy proxy = getContainer().getInstance(ActionProxyFactory.class).createActionProxy(
namespace, name, method, extraContext, true, false);

这一个操作生成了ActionProxy 、ActionInvocation

proxy.prepare()匹配到ActionConfig对象

invocation.init(proxy)生成了Action对象,并获取了拦截器链

原文地址:https://www.cnblogs.com/haon/p/10846155.html