h1

Spring MVC con SimpleFormController

2 Julio 2008


Después de usar durante bastante tiempo Struts, he hecho algunas pruebas con Spring MVC.

La documentación es amplia, y existe un manual paso a paso .

Se puede generar confusión por la amplia variedad de configuraciones que permite Spring MVC, de manera que al principio puede resultar complicado saber por dónde empezar.

Para realizar la típica pantalla en la que se envían datos en un formulario y se espera una respuesta o acción en el servidor, se puede extender SimpleFormController.

Esta clase ofrece varios métodos que se pueden sobreescribir y que aporta varias ventajas sobre Struts. Por ejemplo, el método initBinder permite definir conversores de datos específicos para cada formulario. También el método referenceData está pensado para informar grupos de datos que se usan para construir listas (municipios, provincias, etc).

El método onSubmit se ejecuta cuando el formulario se envía; la lógica de la acción se debería disponer ahí. Otra ventaja es que no estamos obligados a crear un objeto que refleje los campos del formulario (el ActionForm de Struts), sino que podemos utilizar un bean del modelo que nos llegará como parámetro de este método en el parámetro command.

La configuración MVC se realiza en un archivo /WB-INF/aplicacion-servlet.xml. Se declara la acción como un bean más, de la clase Controller que hemos creado:

<bean name="/accion.do" class="com.ejemplo.MiController">
<property name="sessionForm" value="true" />
<property name="commandClass" value="com.ejemplo.ObjetoModelo"/>
<property name="commandName" value="objetoModelo"/>
<property name="formView" value="vista"/>
<property name="successView" value="vistaOK"/>
</bean>

Se puede inyectar todas las dependencias que sean necesarias. El objeto que representa al formulario (commandClass) es del tipo del modelo de la aplicación, y lo podemos usar con el identificador que se especifique como commandName. Cuando se solicite esta acción se dirigirá a la vista “vista”, y si el envío del formulario se ejecuta correctamente, se mostrará “vistaOK”.

Para utilizar como tecnología de la vista JSP, se debe configurar en el mismo archivo:

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>

De esta forma, cuando se indique una vista (formView o successView), se buscará el valor prefix + nombre de la vista + suffix.

Para que todo funcione correctamente, debe configurarse el DispatcherServlet en el archivo WEB-INF/web.xml:

<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

En general, Spring MVC me ha parecido que mejora en bastantes aspectos a Struts. Además en la versión Spring 2.5 se ha incorporado bastantes elementos “convención antes que configuración”, de manera que se podría evitar algunas configuraciones en archivo, aunque esto hace que sea más difícil comprender a simple vista cómo funciona el sistema. No hay tanta documentación disponible como para Struts, pero la documentación existente está bastante bien.

2 comentarios

  1. quiero agradecerte por tu aporte, probe tu aplicativo, bueno yo me imaguino q como dices no es necesario crear un objeto con los datos del formulario,entonces supongo q la informacion ingresada en el formulario se guardara en algun objeto, me imaguino q es en el objeto modelo, bueno yo estoy mandando a imprimir en consola el contenido de ese objeto modelo y no tiene ningun dato, me podrias decir como comprobar donde se almacenan los datos, muchas gracias….


  2. Hola,

    Gracias por tu comentario. Aunque hace ya bastante tiempo que hice esta prueba, al repasar la documentación de la API veo que el método onSubmit tiene como parámetro “Object command”. Este objeto es el que, si se ha configurado correctamente, es un objeto de la clase que se haya especificado, y que como comento en el artículo, se puede aprovechar las clases del modelo del dominio.
    Puedes intentar debugar la ejecución para ver si al entrar en el método onSubmit te está llegando un objeto del tipo que has especificado. Si no es así, repasa la configuración del archivo /WEB-INF/aplicacion-servlet.xml. En caso que te cree la instancia, pero no contenga datos, revisa que tu objeto del modelo tiene los getters/setters necesarios, y que en el formulario JSP has puesto los mismos nombres que a los atributos de esa clase.

    Un saludo,
    El Junco Hueco.



Dejar un comentario