zoukankan      html  css  js  c++  java
  • 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文件配置不对,无法解析。 

  • 相关阅读:
    Linq查询
    Lambda表达式与标准运算符查询
    第四章 面向对象与IO操作
    第三章 C#循环与方法
    第二章 C#基本数据类型
    FPGA与嵌入式一点见解
    FPGA中RAM使用探索
    可控硅的工作原理和主要作用
    异步电路中时钟同步的方法
    FPGA中计数器设计探索
  • 原文地址:https://www.cnblogs.com/super119/p/1934988.html
Copyright © 2011-2022 走看看