tutorial etiquetas forms jsp struts2 dmi

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 ...



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