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图

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

       图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";