在Struts 1.1中,為了解決這個(gè)并行開發(fā)的問題,提出了兩種解決方案:
支持多個(gè)配置文件,是指你能夠?yàn)锳ctionServlet同時(shí)指定多個(gè)xml配置文件,文件之間以逗號(hào)分隔,比如Struts提供的MailReader演示例子中就采用該種方法。
<!-- Action Servlet Configuration --> <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, /WEB-INF/struts-config-registration.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> |
這種方法可以很好地解決修改沖突的問題,不同的開發(fā)人員可以在不同的配置文件中設(shè)置自己的Action、ActionForm等等(當(dāng)然不是說每個(gè)開發(fā)人員都需要自己的配置文件,可以按照系統(tǒng)的功能模塊進(jìn)行劃分)。但是,這里還是存在一個(gè)潛在的問題,就是可能不同的配置文件之間會(huì)產(chǎn)生沖突,因?yàn)樵贏ctionServlet初始化的時(shí)候這幾個(gè)文件最終還是需要合并到一起的。比如,在struts-config.xml中配置了一個(gè)名為success的<forward>,而在struts-config-registration.xml中也配置了一個(gè)同樣的<forward>,那么執(zhí)行起來就會(huì)產(chǎn)生沖突。
為了徹底解決這種沖突,Struts 1.1中引進(jìn)了模塊(Module)的概念。一個(gè)模塊就是一個(gè)獨(dú)立的子系統(tǒng),你可以在其中進(jìn)行任意所需的配置,同時(shí)又不必?fù)?dān)心和其它的配置文件產(chǎn)生沖突。因?yàn)榍懊嫖覀冎v過,ActionServlet是將不同的模塊信息保存在不同的ModuleConfig對(duì)象中的。要使用模塊的功能,需要進(jìn)行以下的準(zhǔn)備工作:
1、為每個(gè)模塊準(zhǔn)備一個(gè)配置文件
2、配置web.xml文件,通知控制器
決定采用多個(gè)模塊以后,你需要將這些信息告訴控制器,這需要在web.xml文件進(jìn)行配置。下面是一個(gè)典型的多模塊配置:
<init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <init-param> <param-name>config/customer</param-name> <param-value>/WEB-INF/struts-config-customer.xml</param-value> </init-param> <init-param> <param-name>config/order</param-name> <param-value>/WEB-INF/struts-config-order.xml</param-value> </init-param> |
要配置多個(gè)模塊,你需要在原有的一個(gè)<init-param>(在Struts 1.1中將其對(duì)應(yīng)的模塊稱為缺省模塊)的基礎(chǔ)之上,增加模塊對(duì)應(yīng)的<init-param>。其中<param-name>表示為config/XXX的形式,其中XXX為對(duì)應(yīng)的模塊名,<param-value>中還是指定模塊對(duì)應(yīng)的配置文件。上面這個(gè)例子說明該應(yīng)用有三個(gè)模塊,分別是缺省模塊、customer和order,它們分別對(duì)應(yīng)不同的配置文件。
3、準(zhǔn)備各個(gè)模塊所需的ActionForm、Action和JSP等資源
但是要注意的是,模塊的出現(xiàn)也同時(shí)帶來了一個(gè)問題,即如何在不同模塊間進(jìn)行轉(zhuǎn)發(fā)?有兩種方法可以實(shí)現(xiàn)模塊間的轉(zhuǎn)發(fā),一種就是在<forward>(全局或者本地)中定義,另外一種就是利用org.apache.struts.actions.SwitchAction。
下面就是一個(gè)全局的例子:
... <struts-config> ... <global-forwards> <forward name="toModuleB" contextRelative="true" path="/moduleB/index.do" redirect="true"/> ... </global-forwards> ... </struts-config> |
可以看出,只需要在原有的path屬性前加上模塊名,同時(shí)將contextRelative屬性置為true即可。此外,你也可以在<action>中定義一個(gè)類似的本地<forward>。
<action-mappings> <!-- Action mapping for profile form --> <action path="/login" type="com.ncu.test.LoginAction" name="loginForm" scope="request" input="tile.userLogin" validate="true"> <forward name="success" contextRelative="true" path="/moduleA/login.do"/> </action> </action-mappings> |
如果你已經(jīng)處在其他模塊,需要轉(zhuǎn)回到缺省模塊,那應(yīng)該類似下面這樣定義,即模塊名為空。
<forward name="success" contextRelative="true" path="/login.do"/> |
此外,你也可以使用org.apache.struts.actions.SwitchAction,例如:
... <action-mappings> <action path="/toModule" type="org.apache.struts.actions.SwitchAction"/> ... </action-mappings> ... |
聯(lián)系客服