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.
Конкретный джира это: