Factorizar varias actions realizables en un sólo ActionForm: el DispatchAction

3240 vistas

A menudo es práctico poder realizar varias actions en el mismo formulario.
Por ejemplo, para la gestión de un panel virtual, poder añadir, modificar o borrar elementos.
Para realizar este tipo de tareas, podemos usar el DispatchAction que concentrará en una sola action el conjunto de operaciones realizables en un sólo JSP.
Usaremos un JavaScript sencillo que modifica el valor de un campo oculto en el momento de la aceptación.



html4strict
  1.   function setHidden(value){document.form.hidden.value=value;}



En el formulario:



html4strict
  1. <html:form action="/cartManagement">
  2.   ...
  3.   <html:hidden property="hidden" value="default"/>
  4.   ...
  5.   <html:submit onclick="setHidden('add');">ADD ELEMENT</html:submit>
  6. </html:form>



Ahora, en la Action en cuestión, bastará con crear los métodos que tengan los mismos nombres que los valores posibles del campo hidden en lugar del método execute(...).



java
  1. public class CartAction extends DispatchAction
  2. {
  3. public ActionForward add(
  4.     ActionMapping mapping,
  5.     ActionForm form,
  6.     HttpServletRequest request,
  7.     HttpServletResponse response)
  8.   throws IOException, ServletException { ... }
  9. public ActionForward remove(
  10.     ActionMapping mapping,
  11.     ActionForm form,
  12.     HttpServletRequest request,
  13.     HttpServletResponse response)
  14.   throws IOException, ServletException { ... }
  15. public ActionForward modify(
  16.     ActionMapping mapping,
  17.     ActionForm form,
  18.     HttpServletRequest request,
  19.     HttpServletResponse response)
  20.   throws IOException, ServletException { ... }
  21. }



En el fichero de configuración struts-config.xml, tendremos que añadir a la declaración del action el atributo "parameter" y indicarle el nombre del campo.



xml
  1. <action
  2.   path="/cartManagement"
  3.   type="app.management.CartAction"
  4.   name="cartForm"
  5.   scope="request"
  6.   validate="true"
  7.   parameter="hidden"/>