forms - tutorial - Struts 2.3 form con múltiples etiquetas de envío con atributo de acción
etiquetas de struts 2 (2)
Esto es algo bastante simple que funcionó perfectamente con Struts 2.1.x. Pero recientemente actualizamos a 2.3.15.2 y se rompió. Básicamente tenemos un formulario (de hecho, muchos formularios) con múltiples envíos:
<s:form>
<s:submit action="save" />
<s:submit action="resetPassword" />
</s:form>
Si guardo la acción en la etiqueta todo está bien. Pero si en cambio está en la etiqueta, obtengo un error 404. ¡Y es la misma acción!
He estado depurando y descubrí que cuando usas el atributo "acción" en la etiqueta, el html generado es:
<input type="submit" name="action:save">
<input type="submit" name="action:resetPassword">
Supuestamente Struts debería tomar este prefijo de "acción" y decir "A-ha! ¡Esto es una acción!" y ejecutarlo. Y más o menos hace esto. O al menos trata de hacerlo. Lo que descubrí es que, en un nivel muy bajo, el método DefaultActionMapper.handleSpecialParameters () pasa por todos los parámetros e intenta crear una ParameterAction para cada uno, y si no es nulo, se ejecuta. La mayoría de los parámetros producen una ParameterAction "nula", pero no una "acción:".
En los documentos encontré esto sobre 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
Entonces, lo que hace es establecer el resultado del mapeo a un nuevo ServletDispatcherResult con el nombre de la Acción:
mapping.setResult(new ServletDispatcherResult(actionName));
Por otro lado, cuando la acción se especifica en la etiqueta s: form, el resultado de la asignación es nulo.
De modo que cuando finalmente lleguemos a Dispatcher.serviceAction ():
if (mapping.getResult() != null) {
Result result = mapping.getResult();
result.execute(proxy.getInvocation());
} else {
proxy.execute();
}
Por lo tanto, cuando se especifica la acción en la etiqueta, se llama a proxy.execute (), que solo llama a la Acción / método en sí. ¿Qué es lo que debería suceder? Pero cuando se especifica la acción en la etiqueta, dado que la asignación tiene un resultado, la invocación del proxy se pasa a result.execute (), que llama a ServletDispatcherResult ... y al final, obtengo un 404.
Esto parece mucho trabajo para que funcionen múltiples botones de envío con atributos de acción. ¿Es este un problema conocido para Struts 2.3? ¿Debo implementar una ParámetroAction para el prefijo "acción" como se indica en los documentos?
EDITAR
Ok, error conocido, abierto hace solo unos días. Mientras tanto, puedo retroceder a 2.3.15.1 o usar el atributo "método" en lugar del atributo "acción".
Espero que se solucione pronto ...
Se supone que esto está en proceso de ser arreglado para 2.3.15.3.
El jira específico es:
esto es b / c en struts2.3.16.
Inhabilita el soporte para la acción: prefijo
por defecto struts.mapper.action.prefix.enabled = false
conjunto
<constant name="struts.mapper.action.prefix.enabled" value="true"/>
en struts.xml
Cambios internos de struts2-core 2.3.16
La acción: y el método: los prefijos se excluyen por defecto y se cambia el orden para verificar primero excludeParams y luego se aceptanParams en ParámetrosInterceptor