Board logo

标题: 深入 Struts 1.1(2)模块 [打印本页]

作者: look_w    时间: 2018-7-15 08:55     标题: 深入 Struts 1.1(2)模块

模块我们知道,在 Struts 1.0 中,我们只能在 web.xml 中为 ActionServlet 指定一个配置文件,这对于我们这些网上的教学例子来说当然没什么问题,但是在实际的应用开发过程中,可能会有些麻烦。因为许多开发人员都可能同时需要修改配置文件,但是配置文件只能同时被一个人修改,这样肯定会造成一定程度上的资源争夺,势必会影响开发效率和引起开发人员的抱怨。
在 Struts 1.1 中,为了解决这个并行开发的问题,提出了两种解决方案:      
支持多个配置文件,是指你能够为 ActionServlet 同时指定多个 xml 配置文件,文件之间以逗号分隔,比如 Struts 提供的 MailReader 演示例子中就采用该种方法。
1
2
3
4
5
6
7
8
9
10
11
12
<!-- 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 文件进行配置。下面是一个典型的多模块配置:
1
2
3
4
5
6
7
8
9
10
11
12
<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。
下面就是一个全局的例子:
1
2
3
4
5
6
7
8
9
10
11
12
...
<struts-config>
...
<global-forwards>
     <forward name="toModuleB"
         contextRelative="true"
         path="/moduleB/index.do"
     redirect="true"/>
...
</global-forwards>
...
</struts-config>




可以看出,只需要在原有的 path 属性前加上模块名,同时将 contextRelative 属性置为 true 即可。此外,你也可以在 <action> 中定义一个类似的本地 <forward>。
1
2
3
4
5
6
7
8
9
10
11
<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>




如果你已经处在其他模块,需要转回到缺省模块,那应该类似下面这样定义,即模块名为空。
1
<forward name="success" contextRelative="true" path="/login.do"/>




此外,你也可以使用 org.apache.struts.actions.SwitchAction,例如:
1
2
3
4
5
6
7
...
<action-mappings>
<action path="/toModule"
type="org.apache.struts.actions.SwitchAction"/>
...
</action-mappings>
...






欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0