• 深入struts2.0(五)--Dispatcher类


    1.1.1       serviceAction方法

      在上个Filter方法中我们会看到例如以下代码:

    this.execute.executeAction(request, response, mapping);


    图3.2.1  Filter方法中跳转到action图

    而在ExecuteOperations类中(excute是一个实例)有例如以下代码:

        public void executeAction(HttpServletRequest request, HttpServletResponse response, ActionMapping mapping)throws ServletException {

            dispatcher.serviceAction(request, response,servletContext, mapping);

        }






    图3.2.2  ExecuteOperations中运行action图

     通过上面能够看到,最后进入到Dispatcher类中。在源代码中对于给该类的凝视例如以下,笔者略作翻译,有不当之处,敬请吐槽。

    真正的dispatcher(暂译为转发器)会托付它大多数任务给这个工具类。基本转发器的每一个实例都包括一个全部请求所共享的这个转发器实例。

    ServiceAction方法主要功能就是通过action配置文件里载入对应的action类,而且运行适当的action中方法。或者直接跳转到Result。

    在该类中要注意:

    Action的运行是通过反射机实现的。有例如以下代码:

     UtilTimerStack.push(timerKey);

                String namespace = mapping.getNamespace();

                String name = mapping.getName();

                String method = mapping.getMethod();

                Configuration config = configurationManager.getConfiguration();

                ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(

                        namespace, name, method, extraContext, true,false);


    图3.2.3  Dispatcher中反射运行action图


           图3.2.4  dispatcher类中serviceAction方法时序图

    1.1.2       载入struts.xml配置文件

    在该类中有init()方法,凝视例如以下:

        /**

         * Loadconfigurations,includingbothXMLandzero-configurationstrategies,andupdateoptionalsettings,includingwhethertoreloadconfigurationsandresourcefiles.

         */

    翻译大概意思是;载入配置文件,包含xml文件以及自己主动配置策略,改动可选择设置,包含是否又一次载入配置和资源文件。

                 init_FileManager();

                init_DefaultProperties(); // [1]

                init_TraditionalXmlConfigurations(); // [2]

                init_LegacyStrutsProperties(); // [3]

                init_CustomConfigurationProviders(); // [5]

                init_FilterInitParameters() ; // [6]

                init_AliasStandardObjects() ; // [7]


                Container container = init_PreloadConfiguration();

                container.inject(this);

                init_CheckWebLogicWorkaround(container);

     

    图3.2.5  dispatcher类中Init方法主要内容

    这些方法就是初始化一些參数,通过名称就能够看到,第一是初始化文件管理,第二个是载入默认的default.properties文件等等。init_TraditionalXmlConfigurations就是初始化xml配置文件。

      private void init_TraditionalXmlConfigurations() {

            String configPaths = initParams.get("config");

            if (configPaths ==null) {

                configPaths = DEFAULT_CONFIGURATION_PATHS;

            }

            String[] files = configPaths.split("\s*[,]\s*");

            for (String file : files) {

                if (file.endsWith(".xml")) {

                    if ("xwork.xml".equals(file)) {   configurationManager.addContainerProvider(createXmlConfigurationProvider(file,false));

                    } else {

    configurationManager.addContainerProvider(createStrutsXmlConfigurationProvider(file,false,servletContext));

                    }

                } else {

                    throw new IllegalArgumentException("Invalid configuration file name");

                }

            }

        }

     

    图3.2.6  dispatcher类中init_TraditionalXmlConfigurations方法主要内容

    当中

    DEFAULT_CONFIGURATION_PATHS = "struts-default.xml,struts-plugin.xml,struts.xml";

  • 相关阅读:
    文件上传---form表单,ajax,jquery,以及iframe无刷新上传 (processData,contentType讲解)
    原生ajax中get和post请求
    iframe伪造ajax
    python---xss(Cross Site Scripting)跨站脚本攻击和csrf(xsrf)跨站点请求伪造(Cross—Site Request Forgery)攻击
    python---session(最终版)__setitem__和__getitem__方法
    Android 设置横屏或竖屏
    Android 屏幕画笔实现
    实现android activity之间的跳转
    CustomViewWith_Image_Text_Video
    新闻客户端nices
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4273247.html
Copyright © 2020-2023  润新知