ActionServlet中的doPost和doGet的代码是一样的,都是调用process
直接看process代码
protected void process(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
ModuleUtils.getInstance().selectModule(request, getServletContext());
ModuleConfig config = getModuleConfig(request);
RequestProcessor processor = getProcessorForModule(config);
if (processor == null) {
processor = getRequestProcessor(config);
}
processor.process(request, response);
}
简单几行,不过每行都很有货啊!(否则前面那么复杂的配置怎么体现)
1、process第一行代码
ModuleUtils.getInstance().selectModule(request, getServletContext());
ModuleUtils
public void selectModule(HttpServletRequest request, ServletContext context) {
// Compute module name
String prefix = getModuleName(request, context);
// Expose the resources for this module
this.selectModule(prefix, request, context);
}
getModuleName
根据请求路径,找到匹配的prefix。
public String getModuleName(HttpServletRequest request,
ServletContext context) {
// Acquire the path used to compute the module
String matchPath =
(String) request.getAttribute(RequestProcessor.INCLUDE_SERVLET_PATH);
if (matchPath == null) {
matchPath = request.getServletPath();
}
//从这可以看出来,prefix的配置实际上是为了实现多个模块。此处就是返回相应的模块名
return this.getModuleName(matchPath, context);
}
再看this.selectModule(prefix,request,context)
public void selectModule(String prefix, HttpServletRequest request,
ServletContext context) {
// Expose the resources for this module
//根据prefix,和ServletContext,获取ModuleConfig
//就是前面init方法中设置的玩意
ModuleConfig config = getModuleConfig(prefix, context);
//存在对应moduleConfig的情况
if (config != null) {
//设置当前匹配的config到request中
request.setAttribute(Globals.MODULE_KEY, config);
//先得到messageResource配置
MessageResourcesConfig[] mrConfig =
config.findMessageResourcesConfigs();
for (int i = 0; i < mrConfig.length; i++) {
String key = mrConfig[i].getKey();
//遍历MessageResourcesConfig,找到匹配的MessageResources,然后将MessageResources放到request中
MessageResources resources =
(MessageResources) context.getAttribute(key + prefix);
//这里可以看到,在配置MessageResources时,key值是要唯一的,否则可能被覆盖掉
if (resources != null) {
request.setAttribute(key, resources);
} else {
request.removeAttribute(key);
}
}
} else {
request.removeAttribute(Globals.MODULE_KEY);
}
}
实际上第一行代码是设置了模块的ModuleConfig到request中
2、process第二行代码
ModuleConfig config = getModuleConfig(request);
回到process中,发现getModuleConfig就是从request或者ServletContext中获取到moduleConfig
protected ModuleConfig getModuleConfig(HttpServletRequest request) {
ModuleConfig config =
(ModuleConfig) request.getAttribute(Globals.MODULE_KEY);
if (config == null) {
config =
(ModuleConfig) getServletContext().getAttribute(Globals.MODULE_KEY);
}
return (config);
}
3、process第三、四行代码
RequestProcessor processor = getProcessorForModule(config);
if (processor == null) {
processor = getRequestProcessor(config);
}
getProcessorForModule
private RequestProcessor getProcessorForModule(ModuleConfig config) {
String key = Globals.REQUEST_PROCESSOR_KEY + config.getPrefix();
return (RequestProcessor) getServletContext().getAttribute(key);
}
在只配置一个模块的情况下,config.getPrefix()是空串。
public static final String REQUEST_PROCESSOR_KEY =
"org.apache.struts.action.REQUEST_PROCESSOR";
当getProcessorForModule返回null时,执行getRequestProcessor
protected synchronized RequestProcessor getRequestProcessor(
ModuleConfig config) throws ServletException {
RequestProcessor processor = this.getProcessorForModule(config);
if (processor == null) {
try {
//在这里,模块会拿到config的ControllerCOnfig
//如果用户没有配置controller,那么config.getControllerConfig()会生成一个new ControllerConfig()
//而这个controller的默认ProcessorClass是org.apache.struts.chain.ComposableRequestProcessor
//也就是说,默认情况下,processor是org.apache.struts.chain.ComposableRequestProcessor的一个实例
processor =
(RequestProcessor) RequestUtils.applicationInstance(config.getControllerConfig()
.getProcessorClass());
} catch (Exception e) {
throw new UnavailableException(
"Cannot initialize RequestProcessor of class "
+ config.getControllerConfig().getProcessorClass() + ": "
+ e);
}
//初始化
processor.init(this, config);
String key = Globals.REQUEST_PROCESSOR_KEY + config.getPrefix();
getServletContext().setAttribute(key, processor);
}
return (processor);
}
4、最后一句代码
processor.process(request, response);
处理请求与响应