Struts中多module的互相调用问题

当我们在一个Struts的项目中定义了多个module之后,一般会出现以下几种情况要在多module之间产生调用: 

1. 页面上的链接。页面上一个链接,该链接要调用到非本module的一些action,此时有两种方法: 

A. 使用<html:link module="xxx" ......>,这样就OK了,如果要调用根module的action,将 module="" 即可。 

B. 使用Struts自带的SwitchAction class。可以首先在struts的配置文件中配置这样一个action: 

CODE: SELECT ALL
<action-mappings> 
    <action path="/toModule" 
    type="org.apache.struts.actions.SwitchAction"/> 
    ... 
</action-mappings>


然后调用的URL写成:toModule.do?prefix=portal&page=/Index.do即可。这样就调用了portal module中的Index action。

2. 我们在一个action之后要调用另外一个module中的action。在Struts的官方文档中,给出的做法是在<forward配置中增加contextRelative="true",这是可以的,但是存在一个问题。contextRelative="true"表示的是在forward中定义的path会接在当前的URI后面,比如http://192.168.0.100/easycluster/Login.ec,在这个Login action中,验证通过后要调用portal module中的Index action,此时我是用的contextRelative,我是这样配置的:

CODE: SELECT ALL
      <action   path="/Login"
                type="cn.com.jointforce.root.action.LoginAction"
                name="LoginForm"
                scope="request"
                input="login">
          <forward name="login" path="/jsp/index.jsp"/>
          <forward name="portal" contextRelative="true" path="/portal/Index.ec" redirect="true"/>
          <forward name="admin" contextRelative="true" path="/admin/Index.ec" redirect="true"/>
      </action>


这样配置了contextRelative=true之后,URL就变成了http://192.168.0.100/easycluster/portal/Index.ec,这样Struts就会自动切换到portal module中了。所以,这是可以的,但是有一个问题,就是如果想从portal module切换到root module的时候,就产生问题了。在EC 2.0中,这种情况就是Logout,比如portal中的Logout action首先清掉session中的对象,然后就会要调用到root module中的HomePage Action。

此时用contextRelative="true"就不行了。因为上面说过了,contextRelative=true是从当前的URI开始往后拼接,而不是从web应用的根目录开始,所以用这个是没办法从portal模块切换到root模块的。

所以,这里要介绍一下我自己发现的一个解决方法,这个方法在Struts的文档中是没有提到的,那就是在<forward 元素中直接配置module=xxx即可。比如:

CODE: SELECT ALL
    <action   path="/Logout"
                 type="cn.com.jointforce.portal.action.LogoutAction">
          <forward name="login" module="" path="/HomePage.ec" redirect="true"/>
      </action>


这样,Logout action在findForward("login")的时候,就会直接forward到root module的HomePage action了。相比上面一种contextRelative的方法,我觉得这是最直接有效的一个做法,不知道为什么Struts的文档中没有提到这个。在这里我的建议是,只要是在一个action中要调用另外一个module的action(能使用forward配置的),都要用这种方法!上面配置中module=""就表示调用root module。 

对于在页面中发生的链接,那就用上面第一点提到的两种方法就可以了。
补充一点,在上述的第二点,就是一个action调用另外一个module中的action时,在forward中如果直接将path中的内容配置成使用SwitchAction是不行的,比如: 

CODE: SELECT ALL
    <action   path="/Logout" 
                 type="cn.com.jointforce.portal.action.LogoutAction"> 
          <forward name="login" path="toModule.ec?prefix=&page=/HomePage.ec" redirect="true"/> 
      </action>


上面的配置中,假设我们已经在本module中配置了一个toModule的action。这样配置是不行的,如果这样配置,netbeans就会直接告诉我们这样的xml语法是不对的,因为&, page这些都是关键字,不能这样书写。如果将这样的配置放到tomcat里面去跑,tomcat就会直接报告说这个xml文件配置不对,无法解析。 

原文地址:https://www.cnblogs.com/super119/p/1934988.html