在基于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");
经测试成功。