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://www.aygfsteel.com/zhyiwww   
          |----------------------------------------------------------------------------------------|
          posted on 2007-02-01 17:34 zhyiwww 閱讀(831) 評論(0)  編輯  收藏 所屬分類: j2ee
          主站蜘蛛池模板: 崇阳县| 西林县| 宁远县| 安化县| 海安县| 中牟县| 汨罗市| 辽源市| 镇巴县| 安化县| 马边| 金华市| 昌乐县| 大冶市| 万源市| 惠东县| 沅江市| 林周县| 大方县| 昭觉县| 邵阳县| 郎溪县| 辽中县| 海盐县| 勃利县| 谷城县| 固镇县| 黄大仙区| 靖远县| 石屏县| 密山市| 奈曼旗| 电白县| 南投县| 南康市| 邵东县| 吕梁市| 涟水县| 金川县| 杂多县| 鄂伦春自治旗|