Пространство имен атрибутов в теге формы Struts2 не работает

В настоящее время я использую Struts2 (2.3.7) и столкнулся со следующей проблемой.
Когда я указываю пространство имен /x в теге формы на моем jsp:

<%@ taglib prefix="s" uri="/struts-tags"%>
<s:form namespace="/x">
    <s:submit action="z" />
</s:form>

созданный тег формы html содержит y, который отличается от объявленного x:

<form action="/contextRoot/y/z.action" method="post"> 

где y — это пространство имен предыдущего запроса, поэтому кажется, что пространство имен атрибутов не имеет значения. Я знаю, что теги "осведомлены о пространстве имен" Нужен префикс для пространства имен Struts2 в формах и ссылках? но я хочу указать другое.


person Massimo Perrone    schedule 23.12.2015    source источник
comment
Добавьте немного action в свою форму.   -  person Aleksandr M    schedule 23.12.2015
comment
@AleksandrM Хорошо, теперь это работает. Так что атрибут пространства имен не работает, как я ожидал. Он используется для чего-то другого?   -  person Massimo Perrone    schedule 23.12.2015
comment
Имеет ли z.action одно и то же имя в обоих пространствах имен?   -  person Andrea Ligios    schedule 23.12.2015
comment
Ну думаю, я должен объяснить это.   -  person Aleksandr M    schedule 23.12.2015
comment
@Andrea Нет, z.action определено только в пространстве имен x. Решение, предложенное Александром М, работает отлично. Я предполагаю, что пространство имен атрибутов в теге формы struts2 имеет смысл только тогда, когда атрибут действия определен в том же теге.   -  person Massimo Perrone    schedule 23.12.2015
comment
Я знаю, Namespace просто игнорируется, а действие в форме такое же, как при отправке JSP. Я ждал вашего отзыва, прежде чем ответить на вопрос, потому что мне непонятно, почему он должен помещать действие s: submit в действие s: form, если они не совпадают. Вы, вероятно, опубликовали содержимое действия s:submit, а не s:form, не так ли? Кстати, @AleksandrM лучше ответил, так как его комментарий был самим ответом, и его просто нужно было расширить.   -  person Andrea Ligios    schedule 23.12.2015
comment
@AndreaLigios: Это напоминает мне, что я забыл ответить на вопрос в ответе. :)   -  person Aleksandr M    schedule 23.12.2015
comment
@AndreaLigios: код ясен. Я обычно помещаю теги отправки внутрь тегов формы, особенно когда мне нужно больше одной отправки. В любом случае, мы можем считать вопрос закрытым!   -  person Massimo Perrone    schedule 23.12.2015
comment
Итак, вы пришли из old_Namespace/old_Action.action, используете <s:form namespace="/new_Namespace"> <s:submit action="new_Action" /> </s:form> и в HTML вы получаете <form action="/contextRoot/old_Namespace/new_Action.action" method="post">? Я ожидал <form action="/contextRoot/old_Namespace/old_Action.action" method="post">   -  person Andrea Ligios    schedule 23.12.2015
comment
@AndreaLigios Извините, я не понял вашего вопроса. HTML-контент был передан в s:submit. Спасибо, что заметили мою ошибку. В соответствии с этим я отредактирую вопрос.   -  person Massimo Perrone    schedule 23.12.2015


Ответы (1)


tl;dr

Также поместите атрибут action в тег <s:form>.

Объяснение:

Если в теге <s:form> нет атрибута action, то URL-адрес действия формы по умолчанию соответствует текущему URL-адресу запроса. т. е. действие и пространство имен исходят из текущего запроса. Побочным эффектом этого является то, что атрибут namespace в теге <s:form> просто игнорируется.

Пример:

Текущий запрос: app/some_namespace/some_action

И форма:

<s:form namespace="/x">
    <s:submit action="z" />
</s:form>

Создаст что-то подобное для URL-адреса формы:

app/some_namespace/some_action

и для кнопки отправки:

app/some_namespace/z
person Aleksandr M    schedule 23.12.2015