表单和链接中的 Struts2 命名空间是否需要前缀?
Is prefix needed for Struts2 namespace in forms and links?
While the prefix appears in the browser URI, the tags are "namespace
aware", so the namespace prefix does not need to be embedded in forms
and links.
struts.xml
:
<package name="testpkg" namespace="/test" extends="struts-default">
<action name="doTest" class="otes.test.TestAction">
<result>/success.jsp</result>
</action>
</package>
index.jsp
: (http://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。)
规则很简单:如果您使用命名空间属性定义了一个包,那么它的操作就属于这个命名空间。当您使用 url
或 a
或 form
标签时,您应该指定名称空间属性以及操作属性中的操作名称。如果您指定两个参数 Struts 可以轻松地将您的 URL 映射到带有命名空间的包中的操作。不要在这些属性中使用动作扩展。 Struts 正在使用 UrlHelper
class 构建 url,如果找不到动作映射,它将 return 字符串原样。此外,如果您使用 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>
首先:文档中引用的标签是 Struts2 标签(例如 <s:url>
、<s:a>
)。
和命名空间感知意味着如果你已经在特定的命名空间中执行了一些动作那么在JSP你不需要前缀S2 link使用 current 命名空间的 s 和表单。
例如如果你有这个包配置:
<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
属性。
例如您在某个页面 (http://localhost/app/index.action) - 注意 url 中没有命名空间,然后 link 将在 /test
命名空间中执行 doTest
。
<s:a action="doTest" namespace="/test">test</s:a>
顺便说一句,不要向 S2 标签中的操作添加操作扩展。
这是错误的:
<s:form action="doTest.action">
这是正确的:
<s:form action="doTest">
While the prefix appears in the browser URI, the tags are "namespace aware", so the namespace prefix does not need to be embedded in forms and links.
struts.xml
:
<package name="testpkg" namespace="/test" extends="struts-default">
<action name="doTest" class="otes.test.TestAction">
<result>/success.jsp</result>
</action>
</package>
index.jsp
: (http://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。)
规则很简单:如果您使用命名空间属性定义了一个包,那么它的操作就属于这个命名空间。当您使用 url
或 a
或 form
标签时,您应该指定名称空间属性以及操作属性中的操作名称。如果您指定两个参数 Struts 可以轻松地将您的 URL 映射到带有命名空间的包中的操作。不要在这些属性中使用动作扩展。 Struts 正在使用 UrlHelper
class 构建 url,如果找不到动作映射,它将 return 字符串原样。此外,如果您使用 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>
首先:文档中引用的标签是 Struts2 标签(例如 <s:url>
、<s:a>
)。
和命名空间感知意味着如果你已经在特定的命名空间中执行了一些动作那么在JSP你不需要前缀S2 link使用 current 命名空间的 s 和表单。
例如如果你有这个包配置:
<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
属性。
例如您在某个页面 (http://localhost/app/index.action) - 注意 url 中没有命名空间,然后 link 将在 /test
命名空间中执行 doTest
。
<s:a action="doTest" namespace="/test">test</s:a>
顺便说一句,不要向 S2 标签中的操作添加操作扩展。
这是错误的:
<s:form action="doTest.action">
这是正确的:
<s:form action="doTest">