• 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对象,并获取了拦截器链

  • 相关阅读:
    正则表达式
    CSS常用格式
    数据库原理第十章考试形式
    汇编语言(王爽第三版) 实验5编写、调试具体多个段的程序
    7-10 多项式A除以B (25分)(多项式除法)
    C. Air Conditioner(区间交集)
    X的因子链(分解质因数,)
    AtCoder Beginner Contest 155 E.Payment
    cf584DDima and Lisa(素数性质,三素数,哥德巴赫猜想)
    CF1207C Gas Pipeline(DP)
  • 原文地址:https://www.cnblogs.com/haon/p/10846155.html
Copyright © 2020-2023  润新知