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