分离Struts配置文件

    Struts1支持多个配置文件,你能够为ActionServlet同时指定多个xml配置文件,文件之间以逗号分隔

<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文件进行配置。下面是一个典型的多模块配置:

<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</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>
	<load-on-startup>1</load-on-startup>
</servlet>

    要配置多个模块,你需要在原有的一个<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。

下面就是一个全局的例子:

<global-forwards>
	<forward name="toModuleB" contextRelative="true"
		path="/moduleB/index.do" redirect="true" />
	...
</global-forwards>

   可以看出,只需要在原有的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>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值