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ù)源等,都是通過 ModuleConfig 來實(shí)現(xiàn)的。

          那么在 ActionServlet 初始化上面的那些模塊之前,就先要初始化 ModuleConfig ,然后由 ModuleConfig 來負(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ù)取得其配置,如果用戶沒有作配置,那么就使用默認(rèn)配置,如果用戶作了配置,那么就使用用戶的配置。

          如果用戶作了配置的話,那么就執(zhí)行設(shè)置成用戶的工廠。如何設(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è)用戶自己的對(duì)象。

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

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

          ??????? throws ServletException {

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

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

          如果用戶自己做了配置,那么此時(shí)初始化的工廠就是用戶指定后的工廠。如果沒有的話,那么就初始化的時(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)品。所以如果是用戶配置過的工廠,那么就會(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);

          ?

          ??? }

          }

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

          ?

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

          public class UserModuleConfigFactory extends ModuleConfigFactory implements Serializable{

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

          ?

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

          ?

          ??? }

          }

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

          ?

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

          ?

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



          |----------------------------------------------------------------------------------------|
                                     版權(quán)聲明  版權(quán)所有 @zhyiwww
                      引用請(qǐng)注明來源 http://www.aygfsteel.com/zhyiwww   
          |----------------------------------------------------------------------------------------|
          posted on 2007-02-01 17:34 zhyiwww 閱讀(832) 評(píng)論(0)  編輯  收藏 所屬分類: j2ee
          主站蜘蛛池模板: 榆社县| 信丰县| 兴化市| 潢川县| 长海县| 泾源县| 尉氏县| 九龙城区| 始兴县| 基隆市| 琼海市| 贡觉县| 红原县| 桓仁| 手游| 凤台县| 河北区| 和田县| 常德市| 商丘市| 手机| 县级市| 巢湖市| 教育| 东平县| 洛南县| 桂东县| 策勒县| 阿瓦提县| 绥阳县| 长白| 陵川县| 三门峡市| 视频| 黎城县| 宁河县| 游戏| 镇江市| 泽州县| 英吉沙县| 金秀|