3

我正在使用 Struts2。下面是我的行动课(TutorialAction)。

public class TutorialAction {
    public String execute() {
        System.out.println("Hello from Execute!");
        return "failure";

    }
}

"failure"在这个 Action 类的执行方法中返回。

以下是我的 2 个 struts 配置文件:

======================== struts.xml ======================= =========

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC 
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

    <struts>    
        <package name="default" namespace="/tutorials" extends="struts-default">        
            <action name="getTutorial" class="com.tushar.action.TutorialAction">
                <result name="failure">/ErrorPage.jsp</result>        
            </action>       
        </package>    
        <include file="struts2.xml"></include> 
    </struts>

在上面的配置文件中,我struts2.xml为同一个命名空间包含了另一个 struts 配置文件():

======================== struts2.xml ======================= =========

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC 
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <package name="default" namespace="/tutorials" extends="struts-default">

        <action name="getTutorial" class="com.tushar.action.TutorialAction">
            <result name="failure">/SuccessPage.jsp</result>        
        </action>
    </package>
</struts>

我的项目运行良好。我只是想知道struts.xml(即struts2.xml)中包含的文件是在 main 之后struts.xml还是之前运行?

或者输出是什么:/SuccessPage.jsp/ErrorPage.jsp

4

2 回答 2

2

Struts 配置是在应用程序启动时解析 xml 文档之后构建的。然后它使用配置属性来映射其名称空间下的操作。这个映射是通过迭代所有包创建的,这也是一个映射。如果您在其他包中具有相同的命名空间,则最后一个将覆盖以前的映射。您应该知道迭代地图并不能保证检索到的元素的顺序。请参阅哈希映射

因此,不能保证创建命名空间映射的顺序,并且该命名空间将仅包含迭代器上次放置的那些操作。当 Struts2 从解析 URL 后创建的动作映射(在创建动作代理时)获取动作配置时,使用命名空间到动作映射。如果找到这样的操作配置,它会继续。结果被映射到一个操作,并且您没有同名的结果。

希望它很容易理解。如果你有相同的命名空间和相同的动作名称,以及相同的包名,我怀疑这是不可能的,这样的配置就不能使用,并且可能会导致不可预知的结果。这并不重要,包的创建顺序是什么。请注意,如果您在您的案例中不存在的包之间存在依赖关系,则顺序很重要。

于 2014-09-13T18:57:55.673 回答
1

如果你有这样的 struts2 配置。

   <struts>    
        <package name="default" namespace="/tutorials" extends="struts-default">        
            <action name="getTutorial" class="com.tushar.action.TutorialAction">
                <result name="failure">/ErrorPage.jsp</result>        
            </action>       
        </package>    
        <include file="struts-module2.xml"></include> 
    </struts>

或者

    <struts>    
      <include file="struts-module1.xml">   
        <include file="struts-module2.xml"></include> 
    </struts>

并根据Practical Apache Struts 2 Web 2.0 Projects

包含文件时,顺序非常重要。包含文件之间的依赖不会自动确定和解析,所以如果struts-module1.xml依赖于struts-module2.xml中提供的配置(并且struts-module2.xml是在struts-module1.xml之后配置的),会抛出异常. 解决方案是更改包含依赖配置的文件或更改包含文件的顺序。

但是因为你有相同的 url,这是/getTutorial你配置的最后一个,因为你覆盖了你的定义,所以总是赢。所以第一个没有用,如果你想同时使用,你应该给另一个名字。

于 2014-09-13T13:50:50.997 回答