2015-01-20 4 views
2

От Apache documentation:Префикс необходим для пространства имен Struts2 в формах и ссылках?

В то время как префикс появляется в браузере 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.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, если это имеет значение.)

+1

* метки * относится к тегам S2. –

+0

Вы имеете в виду теги типа ''? – silver

+0

Да и '' и ''. –

ответ

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-адресе, затем следующая ссылка будет выполнена doTest в /test пространства имен.

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

BTW не добавляет расширения действия к действиям в тегах S2.

Это неправильно:

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

Это правильно:

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

Спасибо за объяснение. Может ли быть опечатка в ' silver

+0

Да, опечатка, исправлена. Добро пожаловать. –

1

Правило простое: если вы определили пакет с атрибутом пространства имен, то его действия принадлежат к этому пространству имен. И когда вы используете url или a, или form теги, вы должны указать атрибут пространства имен вместе с именем действия, которое находится в атрибуте действия. Если вы укажете оба параметра, 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