Struts在项目启动的时候进行基本资源的初始化工作:
1. initInternal();初始化资源文件
2. initOther();初始化Web.xml对struts的定义信息
3. initServlet();初始化Web.xml对ActionServlet的定义信息.
4. initChain();初始化Struts的处理链,如果自己配置了处理链则要重写这个配置(Web.xml)
5. initModuleConfigFactory(); //设置模块模块工厂,如果自己配置了解析工厂则要重写这个配置(Web.xml)
6. initModuleConfig("prefix", config);初始化Struts-config.xml中的定义.
7. initModuleMessageResources(moduleConfig);初始化自定义消息资源
8. initModulePlugIns(moduleConfig);初始化插件信息
9. initModuleFormBeans(moduleConfig);初始化FormBean信息
[ baseFormBean = new FormBeanConfig();
baseFormBean.setName("baseForm");
baseFormBean.setType("org.apache.struts.action.DynaActionForm");
FormPropertyConfig property = new FormPropertyConfig();
property.setName("id");
property.setType("java.lang.String");
baseFormBean.addFormPropertyConfig(property);
]
这里设置FormBean的初始化工作,根据[Struts-config.xml]
10.initModuleForwards(moduleConfig);初始化Fowwards信息
[
baseForward = new ActionForward("success", "/succes.jsp", false);
]
这里设置ActionForward的信息
11.initModuleExceptionConfigs(moduleConfig);初始化异常信息
[
baseException = new ExceptionConfig();
baseException.setType("java.lang.NullPointerException");
baseException.setKey("msg.exception.npe");
ExceptionConfig exceptionConfig = new ExceptionConfig();
exceptionConfig.setType("java.sql.SQLException");
exceptionConfig.setKey("msg.exception.sql");
baseAction.addExceptionConfig(exceptionConfig);
]
这里设置Exception的处理
12.initModuleActions(moduleConfig);初始化Action
[
baseAction = new ActionMapping();
baseAction.setPath("/index");
baseAction.setType("org.apache.struts.actions.DummyAction");
baseAction.setName("someForm");
baseAction.setInput("/input.jsp");
baseAction.addForwardConfig(new ActionForward("next", "/next.jsp", false));
baseAction.addForwardConfig(new ActionForward("prev", "/prev.jsp", false));
]
这里设置Action的信息
13.moduleConfig.freeze();标记这个配置文件已经配置
Struts在项目启动成功后,进行Action的执行工作。
1. ModuleUtils.getInstance().selectModule(request, getServletContext());根据请求信息搜索模块配置信息
2. getRequestProcessor(config);得到请求处理器
3. processor.process(request, response);处理这个请求
4. request = processMultipart(request);初始化请求信息,主要是区别Multipart,也就是请求头信息是multipart/form-data
5. String path = processPath(request, response);识别和返回一个Path组件[从requestURI中取](XXX.do)
5. processLocale(request, response);初始化Locale信息
6. processContent(request, response);设置请求和头信息[默认为text/html]
7. processNoCache(request, response);设置头信息的不允许缓存
8. this.processCachedMessages(request, response);如果缓存的信息在Session中没有找到就移除
9. processMapping(request, response, path);初始化ActionMapping[根据Struts-config.xml]
10.processActionForm(request, response, mapping);初始化ActionForm[根据Struts-config.xml]
11.processPopulate(request, response, form, mapping);把请求参数中的属性设置到form当中。
12.processValidate(request, response, form, mapping);处理验证
13.processForward(request, response, mapping);处理响应
14.processInclude(request, response, mapping);处理包含
15.processActionCreate(request, response, mapping);处理Action的创建.
[Actions是一个HashMap,线程不安全的,所以这里采用的是synchronized,其实还有一个类为
HashTable是线程安全的,但是作者这里不使用HashTable,可见HashTable已经被废弃了]
16.processActionPerform(request, response, action, form, mapping);这里是处理Action,默认为execute方法
17.processForwardConfig(request, response, forward);处理ActionForward.
Struts封装了各环节的处理,在我们操作的时候,我们只需要编写Action,只需要编写execute方法就可以了,
采用了很多优秀的设计模式.