← Ir a portada

Spring MVC y Annotations

Últimamente he realizado una serie de artículos acerca de persistencia con Spring y Annotations, la semana pasada hice uno de Spring MVC, Rest, JSON y Annotations así que aprovechando me he mirado en profundidad el framework de Spring MVC.  Nuevamente he vuelto a conseguir una solución con Annotations en las que los archivos XML se configuran una vez y listo. Y nuevamente tengo que afear a los creadores de la documentación oficial ya que esta vez me he pasado el 80% de los tres días que me ha costado realizar el ejemplo (yo ya estoy mu ducho con Spring) intentando internacionalizar la aplicación, con lo que deduzco que una persona sin experiencia en Spring lo hubiera dejado a los 15 minutos y todo porque los conceptos no están lo sufienctemente esquemáticos.

 

Sea como fuere, vamos a empezar a contar las diferentes partes del ejemplo. Nuevamente he tomado el ejmeplo del instituto y he realizado un listado y una añadido a la tabla de alumnos utilizando la lógica en Spring-JDBC anteriormente creada.

1) El primer paso es crear un proyecto Web Dinámico con Eclipse y asegurarnos que nos añade el contexto de Apache Tomcat o el servidor que estemos usando para poder arrancar y parar el servidor desde Eclipse. Bastaría con descargase Tomcata de la web oficial, crearse la variable de entorno JAVA_HOME apuntando a la JDK, y enlazar nuestro servidor desde Eclipse.

2) Una vez creado crear el archivo web.xml en el directrio dentro del proyecto WebContent/WEB-INF/web.xml. En mi caso mi web xml es este:

De este fichero cabe destacar que en el parámetro de contexto se indica la ruta donde se encuentra el fichero de la lógica de negocio de Spring /WEB-INF/applicationContext.xml y que además se utiliza una expresión regular para cargar todos los archivos que empiecen por applicationContext. Después, se declara un listner para cargar el contexto de Spring. Finalmente, se crea el servlet que atenderá nuestras peticiones como en todos los frameworks MVC. En nuestro caso las que acaben por .htm. 3)Creamos nuestro primer controller:

Es el típico controller que lista todas las entradas de la tabla alumnos. Para decir que es un controller utilizamos la annotation @Controller y para que atienda la URL que acabe en “/listarAlumnos.htm” he utilizado la anntotation @RequestMapping, le he añadido el código anti cacheo, se llama a la lógica de negocio y se le pasa en un Map a la view. En nuestro caso será el JSP /WEB-INF/jsp/listarAlumnos.jsp. Cuando lleguemos a la configuracion de Spring MVC comentaré como se consigue esto. Lo mejor de esto es que la navegación de la aplicación por fin ya no está en un XML, para mí que había programado en Struts 1 esto era vital ya que retrasa mucho el desarrollo. Por último, comentar que el Exception handler lo que hace es redirigir a una pantalla de error genérica en caso de que se eleve cualquier excepción. Si se quisiera tratar de manera distinta cada excepción se puede poner uno por cada excepción que se quiera tratar.

4) La View que mostrará el resultado:

De la view hay que comentar que he puesto los enlaces para cambiar de idioma que explicaré cuando explique el fichero de configuración de Spring MVC y que utilizo los JSP common tags de Apache para visualizar el contenido del ArrayList en una tabla de HTML. 5) El fichero de configuración de Spring MVC. En mi caso este fichero se encuentra en la ruta WebContent/WEB-INF/springmvc-servlet.xml. El nombre tiene que coincidir con el nombre que se le haya dado al servlet en el archivo web.xm seguido de -servlet.xml. El fichero tiene este aspecto:

De este fichero hay que comentar que se especifica el paquete en el que se encuentran nuestros controllers, se activan las anotaciones para los contrroller. En el último punto se añade el view resolver, para que cuando nosotros pongamos “cocotero” en nuestro controller vaya a /WEB-INF/jsp/cocotero.jsp. El resto de cosas son para habilitar la internacionalización de la aplicación. El idioma por defecto es el español, el parámetro que indica el cambio de idioma se llama “idioma”, ojo con la configuración de este objeto hay muchos ejemplos en internet en los que este objeto no está dentro de los tagses probable que este código funcione en Spring 3.0 o en Spring 2.5, pero no funciona en Spring 3.1. Yo me he tirado un buen rato en busca de respuestas, incluso he pensado en cambiar el locale de manera programática no se os ocurra porque los mensajes de validación de los formularios os saldrán en el idioma por defecto y no se enterarán de los cambios, seguid el ejemplo. Por último se especifica la ruta de los ficheros de properties, el tiempo de cacheo de los mismo y su codificación que en mi caso es UTF-8.

No pongo el contenido de los fichereos messages_es.properties y messages_en.properties porque son igual en todos los lenguajes.

6) El siguente paso es hacer un post de un formulario con sus validaciones así que lo primero es crearse el objeto que recoja los datos que llegan del formulario. Es mejor hacerse un objeto a parte y no utilizar las clases de dominio ya que en las aplicaciones web es habitual pasar parámetros de control, incluso si se utiliza Hibernate validation framework, las annotations de las validaciones irían ahí y yo no las pondría por si se pengan con las de JPA por ejemplo. El objeto AlumnoForm quedaría así:

Como se puede observar es un pojo normal y corriente 7) Creamos el validador del objeto AlumnoForm:

El código habla por sí mismo se enlaza con el objeto AlumnoForm y se valida en el método validate añadiendo un mensaje por cada error. Se utiliza la clase ValidationUtils para almacenar los mensajes de error que se le pasarán a la view en caso de que haya errores. He visto que se puede utilizar también Hibernate validator framework y que permite validar mediante annotations en los formBeans pero, la verdad es que no he tenido tiempo para mirármelo y la verdad es que la solución de Spring también me parece muy buena y customizable para casos de validaciones complicadas.

8) El controller que atenderá las peticiones del formulario:

Declaramos el controller para que atienda las peticiones acabadas en “/anadirAlumnto.htm” y le inyectamos la lógica de negocio. Encontramos de nuevo un método que enlaza el validador con el controller mediente la annotation @InitBinder. Además, tenemos un exception handler para atender las excepciones que se generen en el controller y redirigirlas a una pantalla genérica de error. “/WEB-INF/jsp/error.jsp”. Por otro lado, tenemos un método que atienede las peticiones que llegan por el GET que sirve para llevar a la view que muestra el formulario, esta view tiene que llamarse como el controller para que no haya que declararla, se nuestro controller era AnadirAlumnoController la view deberá llamarse anadirAlumno.jsp. En este método creamos un objeto AlumnoForm si quisieramos establecer valores por defecto en el formulario bastaría con dar valor a las propiedaes de este objeto. Por último, tenemos el método que atiende las peticioens que llegan por el POST toma como parámetros un objeto AlumnoForm con los datos llegados del formulario y tras haber pasado las validaciones y en mi caso el objeto reponse para eliminar el cacheo. En el cuerpo de este método se comprueba si existen errores de validación en cuyo caso se vuelve a la pantalla de añadirAlumno, si todo es correcto se va a la pantalla de listar alumnos después de haber añadido el alumno. 9) La view de añadir alumno:

Es el típico formulario de un MVC en el que las propiedades del objeto AlumnoForm se relacionan con los campos del formulario mediante el tag de spring

y para mostrar los errores de validación se utiliza el tag. Para lo demás, se utilizan los JSP Common tags. En la parte superior se pueden observar los dos enlaces para cambiar de idioma.

Y ya estaría todo. La solución me gusta porque aunque tiene muchos XML al final estos se configuran una vez y no crecen con el tiempo, el resto del código es programable mediante annotations. Así que desde mi punto de vista se acaba de superar el mayor problema que tenían los MVC de Java. Si se utilizan herramientas que ayuden a generar código se puede ir tan rápido como en otras tecnologías. Es sí vuelvo a tirarles de las orejas a los que han realizado la documentación oficial ya que la mayoría de los ejemplos son de Spring 3.0 y no funcionan en esta versión.

Os dejo una lista de artículos que me han ayudado a desarrollar este ejemplo:

Apuntes relacionados:

4 Respuestas a “Spring MVC y Annotations”

  1. Tere dice:

    Que tal me parecio muy interesante su articulo, lo fui siguiendo, pero tengo un problema y espero que pueda resolvermelo, cuando ejecuto mi aplicación no aparece la pagina principal, intente ver cual era el problema, ya que tambien segui su articulo de Spring-Jdbc y Annotations, y lo que no logro ver es como se direccionan las paginas para que el controlador sea quien inicie, listando a los alumnos, uso coneccion con sql server, espero que pueda responderme o quizas enviarme el proyecto completo para que pueda guiarme, gracias

  2. Raul dice:

    Buenas Tere en este artículo se muestra como hacer la lógica de negocio, pero no he explicado como enlazarlo con un MVC. Para ello hay que poner una serie de cosas en el web.xml de nuestra aplicación, o bien, cargar la factoría de spring de manera programática. Como no sé qué quieres hacer, te comento que si lo que estás usando es una aplicación Swing utiliza el acceso programatico.

    ApplicationContext ctx = new ClassPathXmlApplicationContext(“applicationContext.xml”);
    Bean myBean = ctx.getBean(“testBean”);

    facilita la direccion de tu fichero de Spring y luego carga el bean que tengas definido en el applicationContext.xml el que pongas en el <bean id="testbBean"..

    Sino mira como enlazar tu MVC, Struts, Spring MVC, JSF con Spring. En este blog si buscas Spring MVC y annotations tienes un ejemplo con Spring MVC.

    Un saludo y suerte

  3. Raul dice:

    Perdona Tere, me he liado con otra respuesta y no me he dado cuenta que era el post de Spring MVC. Puedes borrar la última parte jajaj. Tienes que configurar el web.xml y crear los controladores como pone en el ejemplo. Asegúrate de tener bien todas las librerías de Spring y sus dependencias. Este ejemplo está hecho con Spring 3.1 en función de la versión puede que el código no te funcione asegúrate de tener la misma versión. Prueba a sacar un mensaje en un JSP para ver que el MVC está bien configurado y luego haz la capa de negocio, así irás desechando errores. De todas maneras te aconsejo que vayas poco a poco a mí el tema de la internacionalización y los mensajes de error me costó bastante y estoy acostumbrado. Si te da problemas pueba a pasar de ella y déjala para el fina.

    Un saludo ya me contarás ;)

  4. Vic dice:

    Ah muy bueno y muy bien explicado

Deja un comentario