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

时间: 2024-10-16 00:05:52

Sturts2【四】 StrutsPrepareAndExecuteFilter源码分析<二>的相关文章

Tomcat源码分析二:先看看Tomcat的整体架构

Tomcat源码分析二:先看看Tomcat的整体架构 Tomcat架构图 我们先来看一张比较经典的Tomcat架构图: 从这张图中,我们可以看出Tomcat中含有Server.Service.Connector.Container等组件,接下来我们一起去大致的看看这些组件的作用和他们之间的相互联系.在这之前,我们先补充一个知识点,也就是Tomcat它实现的功能点是什么呢?通过查找一些资料,这里参考下极客时间<深入拆解Tomcat_Jetty>中的总结,即Tomcat 要实现 2 个核心功能:

netty 源码分析二

以服务端启动,接收客户端连接整个过程为例分析, 简略分为 五个过程: 1.NioServerSocketChannel 管道生成, 2.NioServerSocketChannel 管道完成初始化, 3.NioServerSocketChannel注册至Selector选择器, 4.NioServerSocketChannel管道绑定到指定端口,启动服务 5.NioServerSocketChannel接受客户端的连接,进行相应IO操作 Ps:netty内部过程远比这复杂,简略记录下方便以后回忆

[Android]Volley源码分析(二)Cache

Cache作为Volley最为核心的一部分,Volley花了重彩来实现它.本章我们顺着Volley的源码思路往下,来看下Volley对Cache的处理逻辑. 我们回想一下昨天的简单代码,我们的入口是从构造一个Request队列开始的,而我们并不直接调用new来构造,而是将控制权反转给Volley这个静态工厂来构造. com.android.volley.toolbox.Volley: public static RequestQueue newRequestQueue(Context conte

哇!板球 源码分析二

游戏主页面布局 创建屏下Score标签 pLabel = CCLabelTTF::create("Score", "Arial", TITLE_FONT_SIZE); //分数标签 //设置标签字体的颜色 pLabel->setColor (ccc3(0, 0, 0)); //设置文本标签的位置 pLabel->setPosition ( ccp ( SCORE_X, //X坐标 SCORE_Y //Y坐标 ) ); //将文本标签添加到布景中 this

EasyUI学习总结(四)——parser源码分析

EasyUI学习总结(四)--parser源码分析 parser模块是easyloader第一个加载的模块,它的主要作用,就是扫描页面上easyui开头的class标签,然后初始化成easyui控件. 1 /** 2 * parser模块主要是解析页面中easyui的控件 3 */ 4 $.parser = { 5 // 是否自动解析 6 auto: true, 7 8 // 可以被解析的控件 9 plugins:['linkbutton','menu','menubutton','splitb

baksmali和smali源码分析(二)

这一节,主要介绍一下 baksmali代码的框架. 我们经常在反编译android apk包的时候使用apktool这个工具,其实本身这个工具里面对于dex文件解析和重新生成就是使用的baksmali 和smali这两个jar包其中 baksmali是将 dex文件转换成便于阅读的smali文件的,具体使用命令如下:java -jar baksmali.jar classes.dex -o myout其中myout是输出的文件夹 而smali是将smali文件重新生成回 dex文件的具体使用的命

【梦幻连连连】源码分析(二)

转载请注明出处:http://blog.csdn.net/oyangyufu/article/details/24736711 GameLayer场景界面效果: 源码分析: GameLayer场景初始化,主要是初始化加载界面及背景音乐 bool GameLayer::init() { float dt=0.0f; if ( !CCLayerColor::initWithColor(ccc4(255, 255, 255, 255))) { return false; } this->initLoa

[Android]Fragment源码分析(二) 状态

我们上一讲,抛出来一个问题,就是当Activity的onCreateView的时候,是如何构造Fragment中的View参数.要回答这个问题我们先要了解Fragment的状态,这是Fragment管理中非常重要的一环.我们先来看一下FragmentActivity提供的一些核心回调: @Override protected void onCreate(Bundle savedInstanceState) { mFragments.attachActivity(this, mContainer,

JAVA Collection 源码分析(二)之SubList

昨天我们分析了ArrayList的源码,我们可以看到,在其中还有一个类,名为SubList,其继承了AbstractList. // AbstractList类型的引用,所有继承了AbstractList都可以传进来 private final AbstractList<E> parent; // 这个是其实就是parent的偏移量,从parent中的第几个元素开始的 private final int parentOffset; private final int offset; int s