成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Struts 源碼學習初始化屬性資源文件的過程

開發 后端
本文為struts 源碼學習,主要涉及初始化屬性資源文件的過程。資源文件分為內部資源文件和外部資源文件。

資源文件,不過是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,詳細地過程和實現,再去細細的學習和研究。

【編輯推薦】

  1. 在Eclipse中開發struts應用程序
  2. 手把手教你在Eclipse中配置開發Struts
  3. Eclipse下開發struts完整解決亂碼問題
  4. Struts相關背景介紹
  5. 使用Easy Struts for Eclipse開發Struts
責任編輯:張燕妮 來源: 百度空間
相關推薦

2009-06-05 09:40:59

2025-03-14 10:37:24

SpringSpring IOC容器

2025-05-21 10:09:09

Spring 5.xIOC編程

2012-03-13 13:38:42

Java

2021-07-07 05:00:17

初始化源碼

2023-08-28 07:25:58

DDE服務器管理器

2023-10-06 20:57:52

C++聚合成員

2009-11-18 17:53:18

PHP數組初始化

2011-07-07 15:13:42

PHP

2022-01-26 11:00:58

源碼層面Vue3

2013-06-17 17:02:15

Windows PhoWP開發資源文件

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應用對象NSString

2009-07-08 11:01:40

Servlet源文件

2021-12-13 00:54:14

組件Vue3Setup

2009-08-21 16:13:27

C#讀取資源文件

2011-06-20 14:18:27

Qt 資源 文件

2012-02-03 09:55:06

Delphi
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产福利在线小视频 | av一区二区在线观看 | 国产精品伦一区二区三级视频 | 欧美一区二区三区在线播放 | 91精品国产综合久久精品 | 超碰av在线 | 亚洲精品国产a久久久久久 午夜影院网站 | 亚洲区一区二 | 一区二区三区在线免费观看 | 日韩福利电影 | 精久久| 好姑娘影视在线观看高清 | 成人福利在线观看 | 亚洲精品久久久久久一区二区 | 成人欧美一区二区三区在线观看 | 97视频在线观看免费 | 久久99精品久久久久久狂牛 | 成人av资源在线 | 国产综合精品 | 一本色道精品久久一区二区三区 | 羞视频在线观看 | 久久99精品久久久久久噜噜 | 91国产精品 | 国产在线精品一区二区 | 日本一区二区三区在线观看 | 91成人在线视频 | 国产综合精品一区二区三区 | 亚洲一区在线免费观看 | 99精品视频在线 | 亚洲精选一区 | 在线观看www | 亚洲理论在线观看电影 | h在线免费观看 | 亚洲喷水| 国产一区二区三区 | eeuss国产一区二区三区四区 | 日韩精品在线一区 | 国产福利资源在线 | 91偷拍精品一区二区三区 | 国产伦精品一区二区三区精品视频 | 91精品国产91久久久久久 |