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

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

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

    zhyiwww
    用平實(shí)的筆,記錄編程路上的點(diǎn)點(diǎn)滴滴………
    posts - 536,comments - 394,trackbacks - 0

    Struts 源碼的切片學(xué)習(xí)(四)——配置模塊初始化的實(shí)現(xiàn)

    ?

    ?

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

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

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

    轉(zhuǎn)載請(qǐng)注明出處 www.JavaResearch.org

    (copyright by @ zhangyi)

    ?

    ?

    Struts 中的 MessageResource PlugIn 、數(shù)據(jù)源等,都是通過(guò) ModuleConfig 來(lái)實(shí)現(xiàn)的。

    那么在 ActionServlet 初始化上面的那些模塊之前,就先要初始化 ModuleConfig ,然后由 ModuleConfig 來(lái)負(fù)責(zé)其初始化。

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

    ? ???? initModuleConfigFactory();

    之后再實(shí)例化一個(gè) ModuleConfig 的對(duì)象。

    ModuleConfig moduleConfig = initModuleConfig("", config);

    ?

    那么這個(gè)工廠到底初始化了什么?

    現(xiàn)看源代碼:

    ??? protected void initModuleConfigFactory(){

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

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

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

    ??????? }

    }

    很明顯,現(xiàn)從配置參數(shù)取得其配置,如果用戶(hù)沒(méi)有作配置,那么就使用默認(rèn)配置,如果用戶(hù)作了配置,那么就使用用戶(hù)的配置。

    如果用戶(hù)作了配置的話(huà),那么就執(zhí)行設(shè)置成用戶(hù)的工廠。如何設(shè)置的呢?

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

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

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

    ??? }

    在此我們可以看到,直接給 ModuleConfigFactory.factoryClass 賦值,為什么可以這樣做呢?因?yàn)榇俗兞渴牵?/span>

    ??? protected static String factoryClass =

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

    由此定義決定了可以使用此賦值方法。因?yàn)榇俗兞渴且粋€(gè)靜態(tài)的變量。

    ?

    正是因?yàn)榇俗兞渴且粋€(gè)靜態(tài)的變量,所以在下面的得工廠生成對(duì)象的時(shí)候就可以創(chuàng)建一個(gè)用戶(hù)自己的對(duì)象。

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

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

    ??????? throws ServletException {

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

    這個(gè)地方,我們可以看到,此時(shí)就由 ModuleConfigFactory 直接創(chuàng)建了一個(gè)工廠對(duì)象,而此時(shí)我們用的配置就是上面我們初始化后的配置。

    如果用戶(hù)自己做了配置,那么此時(shí)初始化的工廠就是用戶(hù)指定后的工廠。如果沒(méi)有的話(huà),那么就初始化的時(shí)默認(rèn)的工廠。

    也就是

    ??? protected static String factoryClass =

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

    的一個(gè)實(shí)例。

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

    ?????????? 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;

    ??? }

    ?

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

    其實(shí)是生成了一個(gè) ModuleConfig 的對(duì)象。這個(gè)對(duì)象是由其工廠產(chǎn)生的,由什么樣的工廠就會(huì)生成什么樣的產(chǎn)品。所以如果是用戶(hù)配置過(guò)的工廠,那么就會(huì)生成其對(duì)應(yīng)的配置模塊的實(shí)現(xiàn)。

    先看默認(rèn)的情況:

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

    ?

    ??? }

    }

    通過(guò)其默認(rèn)工廠的實(shí)現(xiàn),我們可以看到,其實(shí)例化了一個(gè) ModuleConfigImpl 的對(duì)象,這是 ModuleConfig 的一種實(shí)現(xiàn),也是當(dāng)前 struts 的默認(rèn)的實(shí)現(xiàn)。

    ?

    ?????? 如果是用戶(hù)配置了實(shí)現(xiàn)工廠的話(huà),可能的實(shí)現(xiàn)就是:

    public class UserModuleConfigFactory extends ModuleConfigFactory implements Serializable{

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

    ?

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

    ?

    ??? }

    }

    ?????? 當(dāng)然,如果要啟用你的工廠的話(huà),那么還要在你的配置文件中添加如下部分,在 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 >

    ?

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

    ?

    到此,配置模塊的初始化也已經(jīng)完成,下面就是要實(shí)現(xiàn)如何對(duì)各個(gè)不同的模塊進(jìn)行初始化了。



    |----------------------------------------------------------------------------------------|
                               版權(quán)聲明  版權(quán)所有 @zhyiwww
                引用請(qǐng)注明來(lái)源 http://m.tkk7.com/zhyiwww   
    |----------------------------------------------------------------------------------------|
    posted on 2007-02-01 17:34 zhyiwww 閱讀(829) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): j2ee
    主站蜘蛛池模板: 久久亚洲综合色一区二区三区| 国产亚洲视频在线播放| 亚洲一区视频在线播放| 91亚洲精品第一综合不卡播放| 亚洲日本久久久午夜精品| 亚洲免费日韩无码系列| **aaaaa毛片免费| 亚洲AV无码专区日韩| 亚洲无线一二三四区| 一级成人a免费视频| 99久久免费国产精品特黄| 永久亚洲成a人片777777 | 成全高清视频免费观看| 精品剧情v国产在免费线观看| 国产1024精品视频专区免费| 成年男女免费视频网站| AV在线播放日韩亚洲欧| 国产午夜亚洲精品午夜鲁丝片| 亚洲高清美女一区二区三区| 亚洲国产精品无码观看久久| 特级做A爰片毛片免费看无码 | www亚洲精品久久久乳| 两个人看www免费视频| 中文字幕免费高清视频| 国产大片91精品免费观看男同| 亚洲精品乱码久久久久66| 亚洲人成免费网站| 美女黄频视频大全免费的| 日本免费大黄在线观看| 日本特黄特黄刺激大片免费| 国产亚洲高清不卡在线观看| 亚洲色大成WWW亚洲女子| 最近免费mv在线观看动漫| 全免费a级毛片免费看不卡| 亚洲AV人无码综合在线观看| 亚洲国产成人久久一区二区三区| a级毛片在线免费观看| 青娱乐免费视频在线观看| 日韩一卡2卡3卡4卡新区亚洲| 国产色在线|亚洲| 国产va在线观看免费|