struts 使用多個配置文件

Struts 1.0中,我們只能在web.xml中爲ActionServlet指定一個配置文件,這對於我們這些網上的教學例子來說當然沒什麼問題,但是在實際的應用開發過程中,可能會有些麻煩。因爲許多開發人員都可能同時需要修改配置文件,但是配置文件只能同時被一個人修改,這樣肯定會造成一定程度上的資源爭奪,勢必會影響開發效率和引起開發人員的抱怨。

在Struts 1.1中,爲了解決這個並行開發的問題,提出了兩種解決方案:

  1. 多個配置文件的支持
  2. 模塊的支持

 

支持多個配置文件,是指你能夠爲ActionServlet同時指定多個xml配置文件,文件之間以逗號分隔,比如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>

 

這種方法可以很好地解決修改衝突的問題,不同的開發人員可以在不同的配置文件中設置自己的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>  
    ...
發佈了23 篇原創文章 · 獲贊 4 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章