2015-01-20 43 views
2

Apache documentationStruts2名称空间在表单和链接中是否需要前缀?

虽然前缀出现在浏览器URI,标签是“命名空间 知道”,所以命名空间前缀不需要嵌入形式 和链接。

struts.xml

<package name="testpkg" namespace="/test" extends="struts-default">    
    <action name="doTest" class="otes.test.TestAction"> 
     <result>/success.jsp</result> 
    </action>  
</package> 

index.jsphttp://localhost:8080/nsdemo/

<h2>Using HTML tags:</h2> 
<h3><a href="doTest">doTest without namespace</a></h3> <!-- 404 error --> 
<h3><a href="test/doTest">doTest with namespace</a></h3> <!-- works --> 

<h2>Using Struts2 tags:</h2> 
<h3><s:a href="doTest">doTest without namespace (s:a href)</s:a></h3> <!-- 404 error --> 
<h3><s:a href="test/doTest">doTest with namespace (s:a href)</s:a></h3> <!-- works --> 

<!-- 404 error --> 
<s:url action="doTest" var="myAction" /> 
<h3><s:a href="%{myAction}">doTest without namespace (s:url action)</s:a></h3> 

<!-- works --> 
<s:url action="test/doTest" var="myAction" /> 
<h3><s:a href="%{myAction}">doTest with namespace (s:url action)</s:a></h3> 

这是否意味着我真的必须指定在我的形式和链接的命名空间?

(我使用Struts 2.3.20如果该事项。)

+1

*标签*指的是S2标签。 – 2015-01-20 18:38:09

+0

您的意思是标签是''? – silver 2015-01-20 18:41:35

+0

是的,''和''。 – 2015-01-20 18:42:03

回答

1

首先:在文档中所提及的标签是标签Struts2的(例如<s:url><s:a>)。

而且感知名称空间意味着,如果你已经在JSP执行特别命名空间中的一些动作,那么你就不需要前缀S2环节和形式与当前命名空间。

E.g.如果你有这样的程序包配置:

<package name="testpkg" namespace="/test" extends="struts-default">    
    <action name="index">/index.jsp</action> 
    <action name="doTest" class="otes.test.TestAction"> 
     <result>/success.jsp</result> 
    </action>  
</package> 

和执行index动作(http://localhost/app/test/index.action)。然后在index.jsp中,您可以编写

<s:a action="doTest">test</s:a> 

并且该URL将带您到相同的命名空间。

如果您想更改名称空间,则可以使用某些标记中的namespace属性。

E.g.你在一些页面(http://localhost/app/index.action) - 注意URL中没有命名空间,那么下面的链接将在/test命名空间中执行doTest

<s:a action="doTest" namespace="/test">test</s:a> 

顺便说一句,不要将操作扩展添加到S2标记中的操作。

这是错误

<s:form action="doTest.action"> 

这是正确

<s:form action="doTest"> 
+1

感谢您的解释。 's:form action action'中可能会有拼写错误吗? (有2个'action'属性。) – silver 2015-01-20 20:04:08

+0

是一个错字,修正了它。不用谢。 – 2015-01-20 20:05:05

1

规则很简单:如果你定义与命名空间属性的包,那么其行为属于这个名称空间。当您使用urlaform标记时,应指定一个名称空间属性以及处于操作属性中的操作名称。如果您同时指定了这两个参数,Struts可以轻松将您的URL映射到包含命名空间的包中的操作。不要在这些属性中使用动作扩展。 Struts使用UrlHelper类来构建url,如果它找不到动作映射,它将按原样返回字符串。此外,如果您使用href属性,则Url助手不参与,因此字符串保持不变。

此代码应该工作:

<s:url namespace="/test" action="doTest" var="myAction" /> 
<h2><s:a href="%{#myAction}">doTest with href (s:url action)</s:a></h2> 
<h2><s:a namespace="/test" action="doTest">doTest with namespace and action (s:url action)</s:a></h2> 
+0

“当你使用'url'或'a'或'form'标签时,你应该指定一个名称空间属性和动作名称。” - 谢谢你对我这么清楚。 :) – silver 2015-01-20 20:02:58

相关问题