可以将一个struts-config.xml分割成多个小的struts-config.xml。每个都必须按照struts-config DTD文件的格式进行编写。配置举例如下:
<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-2.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
当载入ActionServlet类时,struts将多个配置文件拼成单个的配置文件(都放入一个ModuleConfig对象)。
如果多个配置文件中有重复的元素则使用最后一个配置文件中的。
这种方法可以很好地解决修改冲突的问题,不同的开发人员可以在不同的配置文件中设置自己
的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。
(
模块转发<forward>元素,映射路径前面都默认加上模块名字,默认的模块(struts-config.xml)没有模块名字,所以不存在模块名字。
如果需要模块之间转发时,需要设置contextrelative元素,path设置为:模块名字+路径。
对于使用<html:form>标签尤其要注意,具体注意时间参考《使用struts1.x多模块应用注意事项》
)
下面就是一个全局的例子:
<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,向它传递两个参数prefix和page。prefix指明了目标模块名称,必须是以斜扛开头(“/”),page指明了相对于目标模块的位置。如:
<html:link page="/toModule.do?prefix=moduleName&page=/SomeAction.do">
Change Module
</html:link>如果你要连接到一个action,别忘了加上”.do”。