本文为struts 源码学习,主要涉及初始化属性资源文件的过程。资源文件分为内部资源文件和外部资源文件。

资源文件,不过是strus架构内部运用的,仍是用户自己界说的资源文件,都是资源文件。之所以会用到资源文件,有两个原因:

Struts 源码学习初始化特点资源文件的进程  struts 源码 资源文件 第1张

一是方面是体系经过装备来完成,那么就会有更好的扩展性,也会更灵敏。

另一个方面,能够完成国际化。

所以咱们或许会有一个或多个资源装备文件。

那么资源文件到底是怎么完成其初始化的呢?

内部资源文件和外部资源文件是分隔初始化的,其实是运用了不同的初始化办法。内部资源文件是由init()调用initInternal()直接初始化的,而用户的资源文件是经过装备模块完成的。

内部资源文件怎么初始化?

protected void initInternal() throws ServletException { 
try {
internal = MessageResources.getMessageResources(internalName);
} catch (MissingResourceException e) {

}
}


上面的办法就完成了内部资源的初始化。

其实很简单,经过资源文件定位,然后回来成一个MessageResources的目标就OK了。

也便是internal变量,今后经过此变量就能够直接取特点的值了。

那么你或许会问,getMessageResources(internalName)又是怎么完成获得资源文件的?

咱们再盯梢一下:

public synchronized static MessageResources getMessageResources(String config) { 

if (defaultFactory == null) {
defaultFactory = MessageResourcesFactory.createFactory();
}
return defaultFactory.createResources(config);
}


很显着,这里边也运用了工厂方式。然后由工厂去生成一个资源MessageResources.

咱们能够这样了解,一切的资源其实归于同一类产品,所以他们但是运用同一个工厂。
上面的初始化工厂的部分,咱们其实能够看到, MessageResourcesFactory是一个笼统类,其笼统办法正是createResources(config),

那么他的完成是谁呢?这要问咱们的工厂,由于你只要知道了工厂,才会知道产品。

一切咱们要先知道,咱们初始化了一个什么工厂。

所以咱们再看:

public static MessageResourcesFactory createFactory() { 

// Construct a new instance of the specified factory class
try {
if (clazz == null)
clazz = RequestUtils.applicationClass(factoryClass);
MessageResourcesFactory factory =
(MessageResourcesFactory) clazz.newInstance();
return (factory);
} catch (Throwable t) {
LOG.error("MessageResourcesFactory.createFactory", t);
return (null);
}

}

其实工厂实由factoryClass决议的。
这在

 protected static String factoryClass = 
"org.apache.struts.util.PropertyMessageResourcesFactory";

界说了。

所以咱们能够看到,其实是PropertyMessageResourcesFactory完成了*.properties文件的初始化。

初始化后的成果在哪?怎么去运用呢?

内部资源文件初始化后的成果以MessageResources的实例保存在internal变量上。其界说如下:

protected MessageResources internal = null;

所以只要struts内部能用,咱们就不能调用了。

用户的资源文件时怎么初始化的呢?

用户的资源文件是经过装备模块ModueConfig来完成的。上面咱们现已初始化了一个ModuleConfig了。所以咱们就可

以来初始化咱们的资源文件了。

initModuleMessageResources(moduleConfig); 

struts的内部分工也是十分显着的。

ModuleConfig用来办理各个不同的模块的装备。

其实,各个由他办理的模块也有自己的装备。

特点资源文件的装备是便是MessageResourcesConfig

此装备的实例由ModuleConfig来办理,一切由ModuleConfig的实例,能够得到一切特点文件装备的实例。

其实是每一个properties文件,就会对应一个MessageResourcesConfig.

所以咱们就能够了解下面的部分代码了。

protected void initModuleMessageResources(ModuleConfig config) 
throws ServletException {

MessageResourcesConfig mrcs[] = config.findMessageResourcesConfigs();
for (int i = 0; i < mrcs.length; i++) {
if ((mrcs[i].getFactory() == null)
|| (mrcs[i].getParameter() == null)) {
continue;
}
if (log.isDebugEnabled()) {
log.debug(
"Initializing module path '"
+ config.getPrefix()
+ "' message resources from '"
+ mrcs[i].getParameter()
+ "'");
}

这个当地得到是工厂的类的称号。如:

"org.apache.struts.util.PropertyMessageResourcesFactory"

经过这个,咱们和前面的比较就能够知道,只要是特点文件,就用的都是这个工厂。

String factory = mrcs[i].getFactory();

知道了用哪个工厂之后,就能够实例化了,创立一个工厂了。

 MessageResourcesFactory.setFactoryClass(factory); 
MessageResourcesFactory factoryObject =
MessageResourcesFactory.createFactory();
factoryObject.setConfig(mrcs[i]);

由工厂生产出一个MessageResources

 MessageResources resources = 
factoryObject.createResources(mrcs[i].getParameter());
resources.setReturnNull(mrcs[i].getNull());
resources.setEscape(mrcs[i].isEscape());

将解析的成果保存在context 中。

getServletContext().setAttribute(
mrcs[i].getKey() + config.getPrefix(),
resources);
}

}
至此,strtus怎么初始化资源文件的进程也完成了。现在咱们现已知道了struts初始化特点资源文件的进程。
终究解析的成果是以MessageResources的方式保存在context中。
至于,怎么将properties文件解析成MessageResources,具体地进程和完成,再去细细的学习和研讨。

【修改引荐】

  1. 在Eclipse中开发struts应用程序
  2. 手把手教你在Eclipse中装备开发Struts
  3. Eclipse下开发struts完好处理乱码问题
  4. Struts相关布景介绍
  5. 运用Easy Struts for Eclipse开发Struts
转载请说明出处
知优网 » Struts 源码学习初始化特点资源文件的进程

发表评论

您需要后才能发表评论