本文供个人学习,复习使用,不适合他人阅读
接上文讲到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