Struts 2.3 форма с несколькими тегами отправки с атрибутом действия

Это что-то довольно простое, что отлично работает со Struts 2.1.x. Но мы недавно обновились до 2.3.15.2, и он сломался. В основном у нас есть форма (на самом деле, много форм) с несколькими представлениями:

<s:form>
 <s:submit action="save"  />
 <s:submit action="resetPassword"  />
</s:form>

Если я добавлю действие в тег, все будет хорошо. Но если вместо этого в теге, я получаю ошибку 404. И это то же самое действие!

Я отлаживал и обнаружил, что когда вы используете атрибут "action" в теге, генерируется HTML:

<input type="submit" name="action:save">
<input type="submit" name="action:resetPassword">

Предположительно Struts должен взять этот префикс "action" и сказать "А-ха! Это действие!" и выполнить его. И это более или менее делает это. Или, по крайней мере, пытается. Я обнаружил, что на очень низком уровне метод DefaultActionMapper.handleSpecialParameters() просматривает все параметры и пытается создать ParameterAction для каждого, и, если он не равен нулю, он выполняется. Большинство параметров выдают "нулевое" действие ParameterAction, но не "действие:".

В документации я нашел это о ParameterAction:

Defines a parameter action prefix.  This is executed when the configured prefix key is
matched in a parameter name, allowing the implementation to manipulate the action mapping 
accordingly.  For example, if the "action:foo" parameter name was found, and a 
ParameterAction implementation was registered to handle the "action" prefix, the execute 
method would be called, allowing the implementation to set the "method" value on the 
ActionMapping

Поэтому он устанавливает в качестве результата сопоставления новый ServletDispatcherResult с именем Action:

mapping.setResult(new ServletDispatcherResult(actionName));

С другой стороны, когда действие указано в теге s:form, результат отображения будет нулевым.

Так что когда мы наконец доберемся до Dispatcher.serviceAction():

if (mapping.getResult() != null) {
 Result result = mapping.getResult();
 result.execute(proxy.getInvocation());
} else {
 proxy.execute();
}

Поэтому, когда в теге указано действие, вызывается proxy.execute(), который просто вызывает сам метод Action /. Что и должно произойти! Но когда действие указано в теге, так как отображение имеет результат, вызов прокси передается в result.execute(), который вызывает ServletDispatcherResult... и, в конце концов, я получаю 404.

Это похоже на большую работу только для того, чтобы несколько кнопок отправки работали с атрибутами действий. Это известная проблема для Struts 2.3? Нужно ли реализовывать ParameterAction для префикса "action", как указано в документации?

РЕДАКТИРОВАТЬ

Хорошо, известная ошибка, открылась всего несколько дней назад. В то же время я могу либо перейти к версии 2.3.15.1, либо использовать атрибут "method", а не "action".

Надеюсь, это будет исправлено в ближайшее время...

2 ответа

Это ч / б в распорках 2.3.3.

Отключает поддержку действия: префикс

по умолчанию struts.mapper.action.prefix.enabled = false

задавать

<constant name="struts.mapper.action.prefix.enabled" value="true"/> 

в struts.xml

Внутренние изменения стоек2-ядро 2.3.16

Префиксы action: и method: по умолчанию исключаются и меняются в порядке, сначала проверяющем excludeParams, а затем acceptParams в ParametersInterceptor

Это должно быть в процессе исправления для 2.3.15.3.

Конкретный джира это:

https://issues.apache.org/jira/browse/WW-4204

Другие вопросы по тегам