<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    zhyiwww
    用平實的筆,記錄編程路上的點點滴滴………
    posts - 536,comments - 394,trackbacks - 0

    資源文件的初始化

    ?

    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
    主站蜘蛛池模板: 久久久精品免费国产四虎| 黄页视频在线观看免费| 丁香亚洲综合五月天婷婷| 男人天堂免费视频| 亚洲一久久久久久久久| 久久亚洲精品国产精品| 亚洲性日韩精品国产一区二区| 91精品国产免费久久久久久青草| 免费无码AV片在线观看软件| 一级做a爰全过程免费视频毛片| 久久黄色免费网站| jizz免费一区二区三区| 亚洲色大成网站www尤物| 亚洲一级毛片免费看| 亚洲夜夜欢A∨一区二区三区| 亚洲日韩国产AV无码无码精品| 久久免费福利视频| 国产免费一区二区视频| 在线视频网址免费播放| 免费网站观看WWW在线观看| 亚洲五月午夜免费在线视频| 一个人看的www在线免费视频| 日本特黄特色aa大片免费| 野花高清在线观看免费完整版中文| 久久综合日韩亚洲精品色| 亚洲午夜av影院| 久久精品亚洲福利| 亚洲高清在线播放| 亚洲图片激情小说| 亚洲heyzo专区无码综合| 精品国产日韩亚洲一区91| 91视频免费观看| 亚洲一区免费在线观看| 日韩免费视频播放| 黑人大战亚洲人精品一区| 亚洲图片校园春色| 一级做a爰全过程免费视频毛片 | 日产亚洲一区二区三区| 亚洲成A人片在线播放器| 国产免费人成视频在线播放播| 亚洲成色www久久网站夜月|