国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Struts 源碼學(xué)習(xí)初始化屬性資源文件的過(guò)程

開(kāi)發(fā) 后端
本文為struts 源碼學(xué)習(xí),主要涉及初始化屬性資源文件的過(guò)程。資源文件分為內(nèi)部資源文件和外部資源文件。

資源文件,不過(guò)是strus架構(gòu)內(nèi)部使用的,還是用戶(hù)自己定義的資源文件,都是資源文件。之所以會(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)部資源文件和外部資源文件是分開(kāi)初始化的,其實(shí)是使用了不同的初始化方法。內(nèi)部資源文件是由init()調(diào)用initInternal()直接初始化的,而用戶(hù)的資源文件是通過(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è)俑櫼幌拢?
   

public synchronized static MessageResources getMessageResources(String config) { 

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


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

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

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

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

所以我們?cè)倏矗?
   

 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)用了。

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

用戶(hù)的資源文件是通過(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è)地方得到是工廠的類(lèi)的名稱(chēng)。如:

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

【編輯推薦】

  1. 在Eclipse中開(kāi)發(fā)struts應(yīng)用程序
  2. 手把手教你在Eclipse中配置開(kāi)發(fā)Struts
  3. Eclipse下開(kāi)發(fā)struts完整解決亂碼問(wèn)題
  4. Struts相關(guān)背景介紹
  5. 使用Easy Struts for Eclipse開(kāi)發(fā)Struts
責(zé)任編輯:張燕妮 來(lái)源: 百度空間
相關(guān)推薦

2009-06-05 09:40:59

2025-05-21 10:09:09

Spring 5.xIOC編程

2025-03-14 10:37:24

SpringSpring IOC容器

2012-03-13 13:38:42

Java

2021-07-07 05:00:17

初始化源碼

2023-08-28 07:25:58

DDE服務(wù)器管理器

2023-10-06 20:57:52

C++聚合成員

2009-11-18 17:53:18

PHP數(shù)組初始化

2011-07-07 15:13:42

PHP

2022-01-26 11:00:58

源碼層面Vue3

2013-06-17 17:02:15

Windows PhoWP開(kāi)發(fā)資源文件

2024-08-14 17:21:34

2023-11-12 23:08:17

C++初始化

2012-04-09 13:43:12

Java

2011-08-15 17:52:21

iPhone應(yīng)用對(duì)象NSString

2009-07-08 11:01:40

Servlet源文件

2021-12-13 00:54:14

組件Vue3Setup

2010-02-05 09:31:23

Ubuntu 配置文件

2011-08-15 14:47:28

Cocoa嵌入資源文件

2009-08-21 16:13:27

C#讀取資源文件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日韩三级视频| 久草在线综合| 99国产一区二区三精品乱码| 琪琪亚洲精品午夜在线| 小说区图片区色综合区| 午夜久久久影院| 日韩中文字幕亚洲精品欧美| 一呦二呦三呦国产精品| 日韩第一页在线| 四虎精品在线| 国产欧美综合在线观看第十页| 日本一区二区在线视频| 日本成人a网站| 亚洲欧美日韩成人| 二区在线视频| 亚洲乱码国产乱码精品精98午夜| 老司机av福利| 精品1区2区3区4区| 日本道色综合久久影院| 欧美床上激情在线观看| 国产美女视频免费| 很黄很黄激情成人| 欧美一级高清免费| 日本肉肉一区 | 久久久久久亚洲精品中文字幕| 亚洲七七久久综合桃花剧情介绍| 亚洲综合色成人| 91亚洲免费视频| 26uuu国产电影一区二区| 男人天堂成人网| 三级在线观看一区二区 | 国产精品成人国产| 欧美r级电影在线观看| 精品无吗乱吗av国产爱色| 玉米视频成人免费看| 人人干人人视频| av综合在线播放| 黄色一级片黄色| 国产成人自拍网| 超碰成人在线免费观看| 久久先锋资源| 欧洲久久久久久| 午夜在线播放视频欧美| 9a蜜桃久久久久久免费| 欧美一区成人| 成人日韩av在线| 婷婷另类小说| 3d动漫精品啪啪一区二区三区免费| 奇米狠狠一区二区三区| 欧美在线视频免费播放| 欧美亚洲色图校园春色| 国产91成人在在线播放| 天堂av一区二区三区在线播放| 98精品在线视频| 激情综合网五月| 亚洲aⅴ男人的天堂在线观看| 天堂美国久久| 久久综合九色欧美狠狠| 蜜桃视频在线一区| 天堂8在线天堂资源bt| 99久久伊人精品| 色播五月综合网| 精品国产1区2区| 求av网址在线观看| 亚洲乱码av中文一区二区| 成人综合日日夜夜| 国产91av在线| 亚洲情侣在线| 亚洲午夜精品一区二区| 成人av免费观看| av黄色免费| 欧美亚洲一区三区| 欧美少妇精品| 欧美激情视频一区| 精品中文一区| 国产精品视频入口| 国产一区二区三区观看| xxxx一级片| 欧洲一区在线电影| 国产伦精品一区二区三区视频金莲| 国产一区视频网站| 97人人做人人爽香蕉精品| 国产精品亚洲第一区| 欧美一级片免费看| 欧美午夜免费影院| 亚洲精品久久久久久下一站 | 妓院一钑片免看黄大片| 999久久久91| 污污视频网站免费观看| 欧美黑人xxx| 久久福利一区| 福利在线播放| 91亚洲精品一区二区| 亚洲一二三四久久| 天堂日韩电影| 另类小说色综合| 91免费看国产| 亚洲电影第1页| 成人一道本在线| 激情伊人五月天| 琪琪久久久久日韩精品| 日韩成人伦理| 国产精品日韩专区| 五月激情久久久| 国产在线xxx| 性欧美video另类hd尤物| 国产精品电影一区| 国产一区二区三区在线观看免费视频 | 亚洲视频播放| 久久9精品区-无套内射无码| 欧美久久高跟鞋激| 久久久久久毛片免费看| 视频一区视频二区视频三区高| 亚洲丝袜精品丝袜在线| 性欧美18一19sex性欧美| 高清不卡日本v二区在线| 国产精品区一区二区三区| 最新欧美色图| 久久综合九色欧美狠狠| 亚洲一二三级电影| 国产一区二区三区国产精品| 亚洲欧美日韩在线综合 | 2019中文字幕在线视频| 91高清视频在线免费观看| 麻豆视频一区二区| 国产在线日本| 国产精品久久久久久久9999 | 福利一区福利二区| 超碰电影在线播放| 亚洲精品日韩av| 一区二区成人在线| 久久97精品| 99在线精品免费视频| 欧美sm美女调教| 在线看片欧美| 午夜在线观看91| 国产精品96久久久久久| 久久亚洲精品小早川怜子| 擼擼色在线看观看免费| 日韩动漫在线观看| 日韩欧美色综合| 六月婷婷一区| 污污片在线免费视频| 欧美一区二区三区在线免费观看| 欧美视频一区二区三区四区| 99久久久久久中文字幕一区| av电影资源| 国产成人精彩在线视频九色| 亚洲色图一区二区三区| 私拍精品福利视频在线一区| 97操碰视频| 欧美诱惑福利视频| 亚洲激情自拍偷拍| 精品精品久久| 亚洲成av人影片在线观看| 成人美女免费网站视频| 丁香五六月婷婷久久激情| 国产精品99在线观看| 欧美视频综合| 国产伦一区二区三区色一情| 欧美亚洲日本国产| 久久av一区| 无遮挡爽大片在线观看视频| 中文字幕在线中文| 久久精视频免费在线久久完整在线看| 99国产精品久久久久| 2021年精品国产福利在线| 成人女性文胸| 国产综合在线观看视频| 在线看国产一区二区| 噜噜噜在线观看免费视频日韩| 久久青青色综合| www.亚洲视频.com| 久久久久国产精品www| 亚洲人精品午夜| 亚洲国产精品久久久天堂| av电影在线观看一区二区三区| 色婷婷精品国产一区二区三区| 亚洲精品第一页| 久久久久久久久久久电影| 亚洲精品无吗| 福利在线观看| 吴梦梦av在线| 久久久久国产视频| 午夜视黄欧洲亚洲| 日本美女一区二区| www欧美在线观看| 中文字幕视频在线免费| 免费影院在线观看一区| 一区二区三区国产视频| 亚洲婷婷国产精品电影人久久| 亚洲欧美综合久久久| 黄色大片在线| 青青青在线视频免费观看| 91影视免费在线观看| 亚洲精品97久久| 亚洲色图视频网| 久久精品国产77777蜜臀| 天天躁日日躁狠狠躁欧美巨大小说| 69av亚洲|