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