zhyiwww
          用平實的筆,記錄編程路上的點點滴滴………
          posts - 536,comments - 394,trackbacks - 0
          <2007年1月>
          31123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          -------------------------------------------
          崇尚原創精神,
          文章歡迎轉載,
          請您注明出處,
          在此特別聲明。
          版權所有@zhyiwww
          引用鏈接
          http://www.aygfsteel.com/zhyiwww

          --------------------------------------------

          常用鏈接

          留言簿(33)

          隨筆分類(626)

          朋友的博客

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 1561120
          • 排名 - 11

          最新評論

          閱讀排行榜

          評論排行榜

          資源文件的初始化

          ?

          Author ???? :????? zhyiwww

          E-Mail ????? :????? zhyiwww@163.com

          Date ????????? :????? 2007-1-10

          轉載請注明出處 www.aygfsteel.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://www.aygfsteel.com/zhyiwww   
          |----------------------------------------------------------------------------------------|
          posted on 2007-01-23 18:27 zhyiwww 閱讀(2945) 評論(0)  編輯  收藏 所屬分類: j2ee
          主站蜘蛛池模板: 拜城县| 吉林市| 牡丹江市| 砀山县| 山丹县| 邢台市| 密山市| 仁化县| 宁河县| 临江市| 胶州市| 东山县| 德庆县| 眉山市| 潜江市| 莱西市| 方山县| 大同市| 旬邑县| 嘉禾县| 仙居县| 察哈| 平乐县| 海安县| 富宁县| 富阳市| 广灵县| 揭东县| 昌江| 喜德县| 齐齐哈尔市| 苗栗县| 嘉荫县| 上林县| 和田县| 天镇县| 大同市| 南安市| 姜堰市| 新沂市| 平泉县|