<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

    Struts 源碼的切片學習(四)——配置模塊初始化的實現

    ?

    ?

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

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

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

    轉載請注明出處 www.JavaResearch.org

    (copyright by @ zhangyi)

    ?

    ?

    Struts 中的 MessageResource PlugIn 、數據源等,都是通過 ModuleConfig 來實現的。

    那么在 ActionServlet 初始化上面的那些模塊之前,就先要初始化 ModuleConfig ,然后由 ModuleConfig 來負責其初始化。

    ActionServlet 初始化 ModuleConfig 的時候,先要初始化配置工廠,然后由配置工廠:

    ? ???? initModuleConfigFactory();

    之后再實例化一個 ModuleConfig 的對象。

    ModuleConfig moduleConfig = initModuleConfig("", config);

    ?

    那么這個工廠到底初始化了什么?

    現看源代碼:

    ??? protected void initModuleConfigFactory(){

    ??????? String configFactory = getServletConfig().getInitParameter("configFactory");

    ??????? if (configFactory != null) {

    ??????????? ModuleConfigFactory.setFactoryClass(configFactory);

    ??????? }

    }

    很明顯,現從配置參數取得其配置,如果用戶沒有作配置,那么就使用默認配置,如果用戶作了配置,那么就使用用戶的配置。

    如果用戶作了配置的話,那么就執行設置成用戶的工廠。如何設置的呢?

    ??? public static void setFactoryClass(String factoryClass) {

    ??????? ModuleConfigFactory.factoryClass = factoryClass;

    ??????? ModuleConfigFactory.clazz = null;

    ??? }

    在此我們可以看到,直接給 ModuleConfigFactory.factoryClass 賦值,為什么可以這樣做呢?因為此變量是:

    ??? protected static String factoryClass =

    ??????? "org.apache.struts.config.impl.DefaultModuleConfigFactory" ;

    由此定義決定了可以使用此賦值方法。因為此變量是一個靜態的變量。

    ?

    正是因為此變量是一個靜態的變量,所以在下面的得工廠生成對象的時候就可以創建一個用戶自己的對象。

    看一下是如何初始化 ModuleConfig ,看下面的源代碼:

    ?? protected ModuleConfig initModuleConfig(String prefix, String paths)

    ??????? throws ServletException {

    ?????? /*************************************************************

    這個地方,我們可以看到,此時就由 ModuleConfigFactory 直接創建了一個工廠對象,而此時我們用的配置就是上面我們初始化后的配置。

    如果用戶自己做了配置,那么此時初始化的工廠就是用戶指定后的工廠。如果沒有的話,那么就初始化的時默認的工廠。

    也就是

    ??? protected static String factoryClass =

    ??????? "org.apache.struts.config.impl.DefaultModuleConfigFactory" ;

    的一個實例。

    *************************************************************/

    ?????????? ModuleConfigFactory factoryObject = ModuleConfigFactory.createFactory();

    ??????? ModuleConfig config = factoryObject.createModuleConfig(prefix);

    ?

    ??????? // Configure the Digester instance we will use

    ??????? Digester digester = initConfigDigester();

    ?

    ??????? // Process each specified resource path

    ??????? while (paths.length() > 0) {

    ??????????? digester.push(config);

    ??????????? String path = null;

    ??????????? int comma = paths.indexOf(',');

    ??????????? if (comma >= 0) {

    ??????????????? path = paths.substring(0, comma).trim();

    ??????????????? paths = paths.substring(comma + 1);

    ??????????? } else {

    ??????????????? path = paths.trim();

    ??????????????? paths = "";

    ??????????? }

    ?

    ??????????? if (path.length() < 1) {

    ??????????????? break;

    ??????????? }

    ?

    ??????????? this.parseModuleConfigFile(digester, path);

    ??????? }

    ?

    ??????? getServletContext().setAttribute(

    ??????????? Globals.MODULE_KEY + config.getPrefix(),

    ??????????? config);

    ?

    ??????? // Force creation and registration of DynaActionFormClass instances

    ??????? // for all dynamic form beans we wil be using

    ??????? FormBeanConfig fbs[] = config.findFormBeanConfigs();

    ??????? for (int i = 0; i < fbs.length; i++) {

    ??????????? if (fbs[i].getDynamic()) {

    ??????????????? fbs[i].getDynaActionFormClass();

    ??????????? }

    ??????? }

    ?

    ??????? return config;

    ??? }

    ?

    那么初始化配置模塊的部分到底做了什么呢?

    其實是生成了一個 ModuleConfig 的對象。這個對象是由其工廠產生的,由什么樣的工廠就會生成什么樣的產品。所以如果是用戶配置過的工廠,那么就會生成其對應的配置模塊的實現。

    先看默認的情況:

    public class DefaultModuleConfigFactory extends ModuleConfigFactory implements Serializable{

    ??? // --------------------------------------------------------- Public Methods

    ?

    ??? /**

    ???? * Create and return a newly instansiated {@link ModuleConfig}.

    ???? * This method must be implemented by concrete subclasses.

    ???? *

    ???? * @param prefix Module prefix for Configuration

    ???? */

    ??? public ModuleConfig createModuleConfig(String prefix) {

    ?

    ??????? return new ModuleConfigImpl(prefix);

    ?

    ??? }

    }

    通過其默認工廠的實現,我們可以看到,其實例化了一個 ModuleConfigImpl 的對象,這是 ModuleConfig 的一種實現,也是當前 struts 的默認的實現。

    ?

    ?????? 如果是用戶配置了實現工廠的話,可能的實現就是:

    public class UserModuleConfigFactory extends ModuleConfigFactory implements Serializable{

    ?????? public ModuleConfig createModuleConfig(String prefix) {

    ?

    ??????? return new ModuleConfigUserImpl(prefix);

    ?

    ??? }

    }

    ?????? 當然,如果要啟用你的工廠的話,那么還要在你的配置文件中添加如下部分,在 web.xml 中修改如下部分:

    < servlet >

    ??? < servlet-name > action </ servlet-name >

    ??? < servlet-class > org.apache.struts.action.ActionServlet </ servlet-class >

    ??? < init-param >

    ????? < param-name > config </ param-name >

    ????? < param-value > /WEB-INF/struts-config.xml </ param-value >

    ??? </ init-param >

    ??? < init-param >

    ????? < param-name > debug </ param-name >

    ????? < param-value > 3 </ param-value >

    ??? </ init-param >

    ??? < init-param >

    ????? < param-name > detail </ param-name >

    ????? < param-value > 3 </ param-value >

    </ init-param >

    ?

    ??? <init-param>

    ????? <param-name>configFactory</param-name>

    ????? <param-value>org.aa.struts. UserModuleConfigFactory </param-value>

    </init-param>

    ?

    ??? < load-on-startup > 0 </ load-on-startup >

    ? </ servlet >

    ?

    這樣的話,你的工廠就可以生效了,也可以生成你自己的配置模塊的實例了。

    ?

    到此,配置模塊的初始化也已經完成,下面就是要實現如何對各個不同的模塊進行初始化了。



    |----------------------------------------------------------------------------------------|
                               版權聲明  版權所有 @zhyiwww
                引用請注明來源 http://m.tkk7.com/zhyiwww   
    |----------------------------------------------------------------------------------------|
    posted on 2007-02-01 17:34 zhyiwww 閱讀(829) 評論(0)  編輯  收藏 所屬分類: j2ee
    主站蜘蛛池模板: 亚洲国产高清视频在线观看| 伊人久久大香线蕉亚洲五月天| 伊人久久综在合线亚洲2019| 中文字幕免费在线视频| AV在线播放日韩亚洲欧| 国产成人无码精品久久久免费| 久久亚洲中文字幕精品一区四 | 成人亚洲国产精品久久| 日本午夜免费福利视频| 亚洲av综合日韩| 亚洲人成网站色在线入口| 91免费在线视频| 精品亚洲成a人片在线观看| 免费看片在线观看| 亚洲日韩AV一区二区三区四区 | 亚洲色自偷自拍另类小说| 免费无码又爽又刺激高潮软件| 亚洲短视频男人的影院| 亚色九九九全国免费视频| 色欲色欲天天天www亚洲伊| 亚洲精品在线视频| 一级毛片成人免费看免费不卡| 亚洲AV无码国产精品色| 国产传媒在线观看视频免费观看| 深夜a级毛片免费视频| 亚洲成AV人片在线观看无| 5555在线播放免费播放| 亚洲精品久久无码av片俺去也| 亚洲情a成黄在线观看| 久9这里精品免费视频| 亚洲欧美国产日韩av野草社区| 亚洲区小说区图片区| 18女人水真多免费高清毛片| 亚洲欧美国产国产综合一区| 亚洲午夜久久久久久久久久| 曰批视频免费30分钟成人| 永久免费无码日韩视频| 亚洲网站免费观看| 亚洲国产天堂久久久久久| 精品无码国产污污污免费网站| 亚洲AV无码一区二区三区鸳鸯影院|