深入浅出学习Struts1框架(八):ActionServlet实例化之ModuleConfig
来源:互联网 发布:培训课程网络促销方案 编辑:程序博客网 时间:2024/05/18 11:45
上篇博客介绍了在ActionServlet的init方法实例化的时候完成的三个方法,主要是介绍了initInternal()方法、initOther()方法、initServlet()方法这三个方法。
通过上篇博客的介绍我门知道initInternal()方法主要是创建资源类MessageResources的,比如说国际化资源等,具体这里可以见org.apache.struts.action下的ActionResources.properties文件;initOther()方法初始化其它的配置,获取我们自己的struts-config配置文件的路径,而它的默认路径就是web-inf/struts-config.xml,另外这个方法还会注册一些转换类的;而initServlet()方法就是主要利用digester来解析web.xml下的配置内容。
今天将继续讲解init方法中做的其他的事情。首先说在说之前还是先讲init方法的具体实现代码写出来以便大家方便阅读和理解。
Init源代码:
- public void init() throws ServletException {
- try {
- //初始化资源类
- initInternal();
- //注册转换类
- initOther();
- //利用digester读取web.xml文件并且将其放到servletContext中
- initServlet();
- getServletContext().setAttribute(Globals.ACTION_SERVLET_KEY, this);
- initModuleConfigFactory();
- ModuleConfig moduleConfig = initModuleConfig("", config);
- initModuleMessageResources(moduleConfig);
- initModuleDataSources(moduleConfig);
- initModulePlugIns(moduleConfig);
- moduleConfig.freeze();
- Enumeration names = getServletConfig().getInitParameterNames();
- while (names.hasMoreElements()) {
- String name = (String) names.nextElement();
- if (!name.startsWith("config/")) {
- continue;
- }
- String prefix = name.substring(6);
- moduleConfig = initModuleConfig
- (prefix, getServletConfig().getInitParameter(name));
- initModuleMessageResources(moduleConfig);
- initModuleDataSources(moduleConfig);
- initModulePlugIns(moduleConfig);
- moduleConfig.freeze();
- }
- this.initModulePrefixes(this.getServletContext());
- this.destroyConfigDigester();
- } catch (UnavailableException ex) {
- throw ex;
- } catch (Throwable t) {
- log.error("Unable to initialize Struts ActionServlet due to an "
- + "unexpected exception or error thrown, so marking the "
- + "servlet as unavailable. Most likely, this is due to an "
- + "incorrect or missing library dependency.", t);
- throw new UnavailableException(t.getMessage());
- }
- }
getServletContext().setAttribute(Globals.ACTION_SERVLET_KEY,this);这句话是将ActionServlet实例将以Globals.ACTION_SERVLET_KEY作为key存入servletcontext中。
这里的Globals.ACTION_SERVLET_KEY在ActionServlet已经给出了声明:
- public static final String ACTION_SERVLET_KEY=
- "org.apache.struts.action.ACTION_SERVLET";
接下来initModuleConfigFactory()方法,这个方法主要的作用是解析在web.xml中configFactory的text值。如果configFactory有配置,则将设置ModuleConfigFactory中得factoryClass值,否则默认得为 DefaultModuleConfigFactory。该方法其实宗旨是让开发人员自己开发出ModuleConfigFactory,从而得到自己所需要的ModuleConfig类。因为我们的实例中没有配置这个参数信息,所以我们这里的实例是要defalutModelConfigFactory了。
代码段一:
- protected voidinitModuleConfigFactory(){
- String configFactory =getServletConfig().getInitParameter("configFactory");
- if (configFactory != null) {
- ModuleConfigFactory.setFactoryClass(configFactory);
- }
- }
代码段二:
- public static void setFactoryClass(String factoryClass) {
- ModuleConfigFactory.factoryClass = factoryClass;
- ModuleConfigFactory.clazz = null;
- }
代码段三:
- protected static String factoryClass =
- "org.apache.struts.config.impl.DefaultModuleConfigFactory";
- }
ModuleConfig moduleConfig =initModuleConfig("", config)方法是非常重要的,initModuleConfig方法给strits-config里面的属性初始化后放入moduleConfig对象里面去,放到moduleConfig对象里面去便于以后操作更快,因为它是文件流。
具体实现代码:
- protected ModuleConfig initModuleConfig(Stringprefix, String paths)
- throws ServletException {
- // :FIXME: Document UnavailableException? (Doesn't actually throw anything)
- if (log.isDebugEnabled()) {
- log.debug(
- "Initializing module path '"
- + prefix
- + "' configuration from '"
- + paths
- + "'");
- }
- // Parse the configuration for this module
- ModuleConfigFactory factoryObject= ModuleConfigFactory.createFactory();
- ModuleConfig config =factoryObject.createModuleConfig(prefix);
- // Configure the Digester instance we will use
- Digester digester =initConfigDigester();
- // Process each specified resource path
- while (paths.length() > 0) {
- digester.push(config);
- String path = null;
- int comma = paths.indexOf(',');
- if (comma >= 0) {
- path =paths.substring(0, comma).trim();
- paths =paths.substring(comma + 1);
- } else {
- path = paths.trim();
- paths = "";
- }
- if (path.length() < 1){
- break;
- }
- this.parseModuleConfigFile(digester,path);
- }
- getServletContext().setAttribute(
- Globals.MODULE_KEY +config.getPrefix(),
- config);
- // Force creation and registration of DynaActionFormClass instances
- // for all dynamic form beans we wil be using
- FormBeanConfig fbs[] =config.findFormBeanConfigs();
- for (int i = 0; i < fbs.length; i++) {
- if (fbs[i].getDynamic()) {
- fbs[i].getDynaActionFormClass();
- }
- }
- return config;
- }
这里有必要解析一下这段代码。首先得到继承ModuleConfigFactory的实现类,如果在initModuleConfigFactory()中能设置factoryClass属性,则能生成客户化得factory,否则得到得是默认得DefaultModuleConfigFactory类,该工厂得到ModuleConfigImpl类。然后调用initConfigDigester()该方法为解析配置文件做准备,初始化Digest类(具体digest的初始化实现就不讲解)。最后返回ModuleConfig,而这时的ModuleConfig里面封装了所有的struts-config.xml中的信息。
最后的几个方法就简单说一下就行,不是非常难理解:
initModuleMessageResources(moduleConfig)方法是通过moduleConfig中的配置文件信息,创建MessageResource对象.
initModuleDataSources(moduleConfig)方法是通过moduleConfig中的配置文件信息,创建DataSource对象. initModulePlugIns(moduleConfig)加载并初始化默认应用模块的所有插件的。
moduleConfig.freeze()是将配置文件中的各个对象,设置成已配置状态.
最后我们看到了,下面还有一段同上面代码的循环代码,这段代码的主要意思就是当默认子应用模块被成功初始化后,如果应用还包括其他子应用模块,将重复流程,分别对其他子应用模块进行初始化。这个也是很好理解的。
到此为止ActionServlet就init完成。
经过这两篇博客的源码分析,我们能够很清晰的知道在为什么在web.xml文件下会那样配置信息,也知道程序是怎么样初始化ActionServlet的了。下一篇博客讲ActionServlet是如何截取字符串的。敬请关注
- 深入浅出学习Struts1框架(八):ActionServlet实例化之ModuleConfig
- 深入浅出学习Struts1框架(八):ActionServlet实例化之ModuleConfig
- 深入浅出学习Struts1框架(六):ActionServlet的实例化
- 深入浅出学习Struts1框架(六):ActionServlet的实例化
- 深入浅出学习Struts1框架(七):ActionServlet实例化之读取struts-config.xml配置文件
- 深入浅出学习Struts1框架(七):ActionServlet实例化之读取struts-config.xml配置文件
- 深入浅出学习struts1框架(五)--正式进入struts1框架学习,从一个实例开始
- 深入浅出学习struts1框架(五)--正式进入struts1框架学习,从一个实例开始
- 深入浅出学习struts1框架(五)--正式进入struts1框架学习,从一个实例开始
- Struts1 - 源码学习 - ActionServlet
- Struts1框架学习(六)--业务分发器ActionServlet和业务具体处理组件Action
- 【SSH之旅】一步步学习Struts1框架(三):解析对比Struts1实例
- Struts1框架八之国际化
- 深入浅出学习Struts1框架(九):截取URL
- 深入浅出学习Struts1框架(九):截取URL
- 层层递进Struts1(四)之预加载ActionServlet
- 深入浅出学习struts1框架(四):从MVC模式代码认识struts1框架
- 深入浅出学习struts1框架(四):从MVC模式代码认识struts1框架
- 深入浅出学习Struts1框架(七):ActionServlet实例化之读取struts-config.xml配置文件
- 字符编码问题
- 原型链的原理
- LeetCode Majority Element
- 出现Field 'ssl_cipher' doesn't have a default value错误怎么解决
- 深入浅出学习Struts1框架(八):ActionServlet实例化之ModuleConfig
- file属性读取 Struct dirent struct stat
- poj 1195 Mobile phones 二维树状数组
- java 奇技淫巧
- UVA Ordering Tasks (经典拓扑排序)
- 深入浅出学习Struts1框架(九):截取URL
- ubuntu12.04 gdb安装使用
- 表达式(字符表达式、关系表达式)
- xfire 404