我正在使用Struts2。以下是我的动作课程(TutorialAction)。
TutorialAction
public class TutorialAction { public String execute() { System.out.println("Hello from Execute!"); return "failure"; } }
我将返回"failure"此Action类的execute方法。
"failure"
以下是我的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
======================== 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(mains struts2.xml)中包含的文件是在main struts.xml之前还是之后运行?
struts.xml
或者这将是输出:/SuccessPage.jsp或/ErrorPage.jsp?
/SuccessPage.jsp
/ErrorPage.jsp
在应用程序启动时已解析xml文档之后,才构建Struts配置。然后,它使用配置属性将动作映射到它们的名称空间下。此映射是通过迭代所有也是映射的包创建的。如果其他程序包中具有相同的名称空间,则最后一个将覆盖先前的映射。您应该知道,迭代地图并不能保证所检索元素的顺序。参见HashMap。
因此,不能保证创建名称空间映射的顺序,并且名称空间将仅包含迭代器最后一次执行的操作。当Struts2从解析URL之后创建的动作映射(在创建动作代理时)获取动作配置时,将使用名称空间到动作的映射。然后,如果找到这样的操作配置,它将继续。结果将映射到操作,并且没有相同名称的结果。
希望它很容易理解。如果您拥有相同的名称空间,相同的操作名称以及相同的程序包名称(我怀疑这是不可能的),则无法使用这种配置,并且可能导致无法预测的结果。这对于创建包的顺序并不重要。请注意,如果您的案例中缺少软件包之间的依赖关系,则顺序很重要。