1. 程式人生 > >Struts中使用多個配置檔案 struts-config.xml

Struts中使用多個配置檔案 struts-config.xml

或許很多開發人員都面臨著這樣的困惑,那就是struct-config.xml檔案中有很多的配置,什麼action,formbean..... 我這裡說的100個action那是很小的專案了,呵呵,看得眼花繚亂,不利於模組化的開發和維護;解決的方法就是把struct-config.xml分離,也就是把裡面的配置分成幾個檔案來寫,至於怎麼分那 就看你自己的原則和專案的需要了,這裡不過多討論這樣的問題;分離的方法也很簡單 就是在你的專案裡面的web.xml檔案中加多一個init-param,具體寫法如下(僅保留和struts相關配置,其他元素省略):
       <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_test.xml</param-value>
         </init-param>
         <!--
             <init-param>
             <param-name>chainConfig</param-name>
             <param-value>/WEB-INF/chain-config.xml</param-value>
             </init-param>
         -->
         <load-on-startup>1</load-on-startup>
     </servlet>

     <servlet-mapping>
         <servlet-name>action</servlet-name>
         <url-pattern>*.do</url-pattern>
     </servlet-mapping>
熟悉struct1.x版本的哥們一看就明白了,其實就是在/WEB-INF/struts-config.xml後面加多一個配置檔案的路徑,檔案路徑之間用逗號分隔就ok了,至於/WEB-INF/struts-config_test.xml的寫法 和truts-config.xml是完全一樣的,直接把truts-config.xml的檔案頭copy過來,加上自己的配置就可以了!

這種方法可以很好地解決修改衝突的問題,不同的開發人員可以在不同的配置檔案中設定自己的Action、ActionForm等等(當然不是說每個開發人員都需要自己的配置檔案,可以按照系統的功能模組進行劃分)。但是,這裡還是存在一個潛在的問題,就是可能不同的配置檔案之間會產生衝突,因為在 ActionServlet初始化的時候這幾個檔案最終還是需要合併到一起的。比如,在struts-config.xml中配置了一個名為 success的<forward>,而在struts-config-registration.xml中也配置了一個同樣的< forward>,那麼執行起來就會產生衝突。
為了徹底解決這種衝突,Struts 1.1中引進了模組(Module)的概念。一個模組就是一個獨立的子系統,你可以在其中進行任意所需的配置,同時又不必擔心和其它的配置檔案產生衝突。因為前面我們講過,ActionServlet是將不同的模組資訊儲存在不同的ModuleConfig物件中的。要使用模組的功能,需要進行以下的準備工作:
1、為每個模組準備一個配置檔案
2、配置web.xml檔案,通知控制器
決定採用多個模組以後,你需要將這些資訊告訴控制器,這需要在web.xml檔案進行配置。下面是一個典型的多模組配置:
<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>
要配置多個模組,你需要在原有的一個<init-param>(在Struts 1.1中將其對應的模組稱為預設模組)的基礎之上,增加模組對應的<init-param>。其中<param-name>表示為config/XXX的形式,其中XXX為對應的模組名,<param-value>中還是指定模組對應的配置檔案。上面這個例子說明該應用有三個模組,分別是預設模組、customer和order,它們分別對應不同的配置檔案。
3、準備各個模組所需的ActionForm、Action和JSP等資源
但是要注意的是,模組的出現也同時帶來了一個問題,即如何在不同模組間進行轉發?有兩種方法可以實現模組間的轉發,一種就是在< forward>(全域性或者本地)中定義,另外一種就是利用org.apache.struts.actions.SwitchAction。
下面就是一個全域性的例子:
     ...
     <struts-config>
...
<global-forwards>
<forward name="toModuleB"
contextRelative="true"  
path="/moduleB/index.do"
redirect="true"/>  
...
</global-forwards>  
...  
     </struts-config>
可以看出,只需要在原有的path屬性前加上模組名,同時將contextRelative屬性置為true即可。此外,你也可以在<action>中定義一個類似的本地<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>
如果你已經處在其他模組,需要轉回到預設模組,那應該類似下面這樣定義,即模組名為空。
<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>  
     ...