資源文件的初始化
?
Author
???? :????? zhyiwww
E-Mail
????? :????? zhyiwww@163.com
Date
????????? :????? 2007-1-10
轉載請注明出處
m.tkk7.com/zhyiwww
(copyright by @ zhangyi)
???
資源文件,不過是strus架構內部使用的,還是用戶自己定義的資源文件,都是資源文件。之所以會用到資源文件,有兩個原因:一是方面是系統通過配置來實現,那么就會有更好的擴展性,也會更靈活。
另一個方面,可以實現國際化。
所以我們可能會有一個或多個資源配置文件。
那么資源文件到底是如何實現其初始化的呢?
?????? 內部資源文件和外部資源文件是分開初始化的,其實是使用了不同的初始化方法。內部資源文件是由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,詳細地過程和實現,再去細細的學習和研究。
|----------------------------------------------------------------------------------------|
版權聲明 版權所有 @zhyiwww
引用請注明來源 http://m.tkk7.com/zhyiwww
|----------------------------------------------------------------------------------------|
posted on 2007-01-23 18:27
zhyiwww 閱讀(2942)
評論(0) 編輯 收藏 所屬分類:
j2ee