日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Struts 源碼學(xué)習(xí)初始化屬性資源文件的過(guò)程

資源文件,不過(guò)是strus架構(gòu)內(nèi)部使用的,還是用戶自己定義的資源文件,都是資源文件。之所以會(huì)用到資源文件,有兩個(gè)原因:

一是方面是系統(tǒng)通過(guò)配置來(lái)實(shí)現(xiàn),那么就會(huì)有更好的擴(kuò)展性,也會(huì)更靈活。

另一個(gè)方面,可以實(shí)現(xiàn)國(guó)際化。

所以我們可能會(huì)有一個(gè)或多個(gè)資源配置文件。

那么資源文件到底是如何實(shí)現(xiàn)其初始化的呢?

內(nèi)部資源文件和外部資源文件是分開初始化的,其實(shí)是使用了不同的初始化方法。內(nèi)部資源文件是由init()調(diào)用initInternal()直接初始化的,而用戶的資源文件是通過(guò)配置模塊實(shí)現(xiàn)的。

內(nèi)部資源文件如何初始化?

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

        }
}

上面的方法就實(shí)現(xiàn)了內(nèi)部資源的初始化。

其實(shí)很簡(jiǎn)單,通過(guò)資源文件定位,然后返回成一個(gè)MessageResources的對(duì)象就OK了。

也就是internal變量,以后通過(guò)此變量就可以直接取屬性的值了。

那么你可能會(huì)問(wèn),getMessageResources(internalName)又是如何實(shí)現(xiàn)取得資源文件的?

我們?cè)俑櫼幌拢?br />   

public synchronized static MessageResources getMessageResources(String config) { 

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

很明顯,這里面也使用了工廠模式。然后由工廠去生成一個(gè)資源MessageResources.

我們可以這樣理解,所有的資源其實(shí)屬于同一類產(chǎn)品,所以他們可是使用同一個(gè)工廠。
上面的初始化工廠的部分,我們其實(shí)可以看到, MessageResourcesFactory是一個(gè)抽象類,其抽象方法正是createResources(config),

那么他的實(shí)現(xiàn)是誰(shuí)呢?這要問(wèn)我們的工廠,因?yàn)槟阒挥兄懒斯S,才會(huì)知道產(chǎn)品。

所有我們要先知道,我們初始化了一個(gè)什么工廠。

所以我們?cè)倏矗?br />

 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);
        }

    }

其實(shí)工廠實(shí)由factoryClass決定的。
這在

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

定義了。

所以我們可以看到,其實(shí)是PropertyMessageResourcesFactory實(shí)現(xiàn)了*.properties文件的初始化。

初始化后的結(jié)果在哪?如何去使用呢?

內(nèi)部資源文件初始化后的結(jié)果以MessageResources的實(shí)例保存在internal變量上。其定義如下:

protected MessageResources internal = null;

所以只有struts內(nèi)部能用,我們就不能調(diào)用了。

用戶的資源文件時(shí)如何初始化的呢?

用戶的資源文件是通過(guò)配置模塊ModueConfig來(lái)實(shí)現(xiàn)的。上面我們已經(jīng)初始化了一個(gè)ModuleConfig了。所以我們就可

以來(lái)初始化我們的資源文件了。

initModuleMessageResources(moduleConfig); 

struts的內(nèi)部分工也是非常明顯的。

ModuleConfig用來(lái)管理各個(gè)不同的模塊的配置。

其實(shí),各個(gè)由他管理的模塊也有自己的配置。

屬性資源文件的配置是就是MessageResourcesConfig

此配置的實(shí)例由ModuleConfig來(lái)管理,所有由ModuleConfig的實(shí)例,可以得到所有屬性文件配置的實(shí)例。

其實(shí)是每一個(gè)properties文件,就會(huì)對(duì)應(yīng)一個(gè)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()
                        + "'");
            }

這個(gè)地方得到是工廠的類的名稱。如:

"org.apache.struts.util.PropertyMessageResourcesFactory"
  

通過(guò)這個(gè),我們和前面的比較就可以知道,只要是屬性文件,就用的都是這個(gè)工廠。
   

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

知道了用哪個(gè)工廠之后,就可以實(shí)例化了,創(chuàng)建一個(gè)工廠了。

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

        

由工廠生產(chǎn)出一個(gè)MessageResources

            MessageResources resources = 
                factoryObject.createResources(mrcs[i].getParameter());
            resources.setReturnNull(mrcs[i].getNull());
            resources.setEscape(mrcs[i].isEscape());
   
          將解析的結(jié)果保存在context 中。

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

}
至此,strtus如何初始化資源文件的過(guò)程也完成了?,F(xiàn)在我們已經(jīng)知道了struts初始化屬性資源文件的過(guò)程。
最終解析的結(jié)果是以MessageResources的形式保存在context中。
至于,如何將properties文件解析成MessageResources,詳細(xì)地過(guò)程和實(shí)現(xiàn),再去細(xì)細(xì)的學(xué)習(xí)和研究。

【編輯推薦】

  1. 在Eclipse中開發(fā)struts應(yīng)用程序
  2. 手把手教你在Eclipse中配置開發(fā)Struts
  3. Eclipse下開發(fā)struts完整解決亂碼問(wèn)題
  4. Struts相關(guān)背景介紹
  5. 使用Easy Struts for Eclipse開發(fā)Struts

文章名稱:Struts 源碼學(xué)習(xí)初始化屬性資源文件的過(guò)程
文章URL:http://www.dlmjj.cn/article/cooejed.html