在基于struts的WEB應用的開發中,使用多模塊開發是十分必要的,總結了一下如下:

Struts 的配置文件struts-config.xml 是Struts 框架最重要的資源之一,并且是需要頻繁改動的。如果并行開發的各個團隊都是用這一個配置文件,勢必造成訪問沖突。Strus 框架的模塊化機制就是專門應對這種情況的。

Struts 從1.1 版本開始增加了模塊化支持,并且一直在強化對模塊化的支持。不同的應用模塊可以擁有各自的struts-config 配置文件、消息資源、Validator 框架配置文件。不同的模塊可以協同開發,互不影響。

Struts 應用配置為多模塊應用,需要如下三個步驟:

為每個模塊分別建立一個struts配置文件;
通知模塊控制器;
使用特定的Action在模塊間跳轉。
一 給各模塊命名:

struts默認的配置文件名是struts-config.xml,給其它模塊配置文件命名struts-config-***.xml.比如登錄模塊需要一個單獨的模塊可以命名為struts-config-login.xml;

二 通知模塊控制器:

在web.xml中加入如下代碼:

<init-param>????
????? <param-name>config</param-name>????
????? <param-value>/WEB-INF/conf/struts-config.xml</param-value>????
</init-param>????
<init-param>????
????? <param-name>config/login</param-name>????
????? <param-value>/WEB-INF/conf/login/struts-config-login.xml</param-value>????
</init-param>???

配置文件對應的ActionServlet 初始化參數名為config。對于其他模塊,ActionServlet 初始化參數的命名原則是“config/模塊名”。如上面的代碼示例中,login 模塊的配置文件對應的初始化參數為config/login。其中前綴“config/”是不能缺少的,后面跟模塊名。在Struts 控制器中,是通過模塊名來區分不同模塊的。在資源訪問中,也是一模塊名作為前綴來區分對不同模塊的訪問。如以“/login”開頭的路徑會告訴控制器所要訪問的將是login 模塊的資源。

三 實現模塊間跳轉:

(1)用SwitchAction,主要用于實現頁面的跳轉

(2)全局轉發和局部轉發,用于實現模塊間的跳轉

(3)采用html:link標簽

多模塊開發示例:(Eclipse3.2+MyEclipse5.0)
1.新建一個Web Project
2.添加Struts 1.2 支持
3.在根目錄(WebRoot)下新建index.jsp頁面
4.在WebRoot目錄下新建一個模塊目錄“ModuleA”。
5.新建一個struts 1.2 module,名為“ModuleA”。
6.測試直接鏈接到其他模塊的jsp頁面(注意不能直接鏈接到其他模塊的與Action、ActionForm相關聯的頁面):

在根目錄的index.jsp頁面中添加如下代碼:

<html:link module="/ModuleA" page="/index.jsp">1.鏈接到其他模塊(ModuleA)直接鏈接到頁面</html:link><br>適用于沒有和Action,ActionForm關聯的純JSP頁面<br><p>

在ModuleA目錄下新建index.jsp頁面,完成后測試成功。

7.測試直接鏈接到其他模塊的jsp頁面(直接鏈接到其他模塊的與Action、ActionForm相關聯的頁面,應該不能成功):
首先配置struts-config-ModuleA.xml文件:
新建一個Form、Action and JSP,用例中填寫user,添加兩個屬性:name,password。
在JSP選項卡中填寫“/ModuleA/login.jsp”,點擊下一步,在Path中填寫“/login”,在forward選項卡中添加一個forward,name為“OK”,Path為“/welcome.jsp”,點擊完成。
在ModuleA目錄下新建wellcome.jsp文件,在源碼中加入如下代碼:
<bean:write name=”userForm” property=”name” />.在UserAction.java源碼中填寫如下代碼:return mapping.findForward(“OK”)。
在根目錄下的index.jsp源碼中添加如下代碼:
<html:link module="/ModuleA" page="/login.jsp">2.鏈接到其他模塊(ModuleA)試圖連接到和Action,ActionForm關聯的頁面</html:link><br>不能直接這樣鏈接,會報Cannot retrieve mapping for action /xxx異常,因為此時還是檢查struts-config.xml<br><p>
測試后果然異常。
正確做法如下:
在struts-config-ModuleA.xml文件中添加一個Action,在用例中填寫“toLoginPage”,在forward選項卡中添加一個forward,name為“toLoginPage”,Path為“/login.jsp”。
修改ToLoginPage.java的源碼為:return mapping.findForward(“toLoginPage”);。
在根目錄下的index.jsp源碼中添加如下代碼:
<html:link module="/ModuleA" page="/toLoginPage.do">3.鏈接到其他模塊(ModuleA)的xxxx.do,連接到和Action,ActionForm關聯的頁面</html:link><br>正確做法,是對2鏈接形式的更正,應該鏈接到ModuleA的一個Action,由該Action的forward轉發到login.jsp頁面<br><p>
經測試成功。

8.測試跨模塊表單提交(從主模塊提交表單到ModuleA模塊):
在struts-config.xml(主模塊)中新建Form、Action and JSP,用例中輸入“reg”,增加兩個屬性:sex、age,點擊下一步,在Path中填寫“/userReg”,Action Impl中選擇Use existing Action class,使用SwitchAction,直接finish掉。添加根目錄下的indexs.jsp文件源碼如下:

4.提交表單到其他模塊:<br>
<html:form action="/userReg?prefix=/ModuleA&page=/regOK.jsp">
sex : <html:text property="sex"/><html:errors property="sex"/><br/>
age : <html:text property="age"/><html:errors property="age"/><br/>
<html:submit/><html:cancel/>
</html:form><br><p>。

在ModuleA文件夾下新建regOK.jsp文件,在regOK.jsp文件源碼中寫入如下語句:
regOK,your sex is:<bean:write name="regForm" property="sex"/> age is:<bean:write name="regForm" property="age"/>
經測試成功。

9.測試跨模塊表單提交(從ModuleA模塊提交表單到ModuleB模塊):
新建struts1.2模塊,叫“ModuleB”,在WebRoot目錄下新建文件夾“ModuleB”,配置struts-config-ModuleB.xml文件:
新建Form、Action and JSP,在用例中輸入“employee”,增加兩個屬性:empName、depName,在JSP選項卡中填寫“/ModuleA/empInfo.jsp”,點擊下一步,Path中填寫“/employee”,在Action Impl中選擇Use existing Action class,使用SwitchAction,直接finish掉。
修改empInfo.jsp文件源碼:<html:form action="/employee?prefix=/ModuleB&page=/showEmp.jsp">…。
在ModuleB文件夾中新建showEmp.jsp文件,修改showemp.jsp源碼為:<bean:write name="employeeForm" property="empName"/>。
在struts-config-ModuleA.xml文件中,增加一個Action,在用例中輸入“empInfo”,增加一個forward,name為“/empInfo.jsp”。在根目錄下的index.jsp文件中增加如下內容:
5.提交表單到其他模塊(子模塊到子模塊):<br>
<html:link module="/ModuleA" page="/empInfo.do">鏈接到模塊(ModuleB)的empInfo.do</html:link><br>鏈接到ModuleA的一個Action,由該Action的forward轉發到empInfo.jsp頁面<br><p>
最后修改EmpInfoAction.java源碼:return mapping.findForward("empOK");
經測試成功。