En el articulo anterior hemos configurado Spring MVC para cargar un ejemplo de Lista y Formulario .Ahora bien no hemos usado para nada el sistema de anotaciones de Spring . En este articulo cubriremos ese hueco. Lo primero que vamos a hacer es añadir un ViewResolver a nuestro fichero application-context.xml .
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean>
Se trata de un bean sencillo que parametriza la URL de las distintas vistas que cargamos. A partir de este momento nuestros controladores podran devolver algo como lo siguiente.
return new ModelAndView("Lista");
Spring MVC y @Controller
A partir de Spring 2.5 se permite el uso de un sistema de anotaciones que simplifica la forma de trabajar . Para usar este sistema deberemos en primer lugar añadir una nueva dependencia a nuestro pom.xml.
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.2.4.RELEASE</version> </dependency>
Esta dependencia nos permitirá modidificar el fichero application-context.xml y añadir una etiqueta
<context:component-scan base-package="com.arquitecturajava"/>
Esta etiqueta se encarga de decirle a Spring en que packages debe buscar clases anotadas para su registro . En nuestro caso en “com.arquitecturajava” .Realizada esta operación creamos una clase PersonaController dentro del package.
Vamos a ver su código fuente :
package com.arquitecturajava; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class PersonaController { @RequestMapping("/Lista") public String Lista() { return "Lista"; } @RequestMapping("/Formulario") public String Formulario() { return "Formulario"; } }
Como podemos observar hemos evolucionado nuestro ejemplo y en vez de tener varios comandos . Disponemos de un controlador que agrupa un conjunto de acciones .
Vamos a explicar para que sirven las anotaciones que hemos utilizado.
@Controller: Anotación que registra el controlador para Spring MVC
@RequestMapping: Anotación que se encarga de relacionar un método con una petición http.
El uso de anotaciones no implica que unicamente tengamos un único controlador sino que nos permite agrupar un conjunto de urls que esten asociadas a nivel de negocio en un controlador especifico. La aplicación soportará n controladores.
Spring MVC y el Modelo
Por ahora lo único que hemos hecho es construir el controlador .Ahora bien el controlador suele enviar datos a la vista a traves de un modelo. Vamos a modificar PersonaController para que tenga una lista de Personas y nos las envie a Lista.jsp. El primer paso será añadir la clase Persona.
package com.arquitecturajava; public class Persona { private String nombre; private String apellidos; public Persona(String nombre, String apellidos) { super(); this.nombre = nombre; this.apellidos = apellidos; } //omitimos equals y hashcode eclipse public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public String getApellidos() { return apellidos; } public void setApellidos(String apellidos) { this.apellidos = apellidos; } }
Realizada esta operación el siguiente paso será modificar el controlador para que genere una lista de Personas .
package com.arquitecturajava; import java.util.ArrayList; import java.util.List; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class PersonaController { @RequestMapping("/Lista") public String Lista(Model modelo) { List<Persona> milista= new ArrayList<Persona>(); Persona persona1= new Persona("pedro","perez"); Persona persona2=new Persona ("maria","gonzalez"); milista.add(persona1); milista.add(persona2); modelo.addAttribute("listaPersonas",milista); return "Lista"; } @RequestMapping("/Formulario") public String Formulario() { return "Formulario"; } }
Como podemos observar ahora el método lista soporta un objeto de tipo Model .Es en esto objeto en el cual nosotros añadimos la lista. Realizado este paso nos quedará modificar la pagina JSP para que nos muestre una lista utilizando JSTL. Para ello antes deberemos añadir la dependencia a Maven.
<dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
Finalmente mostramos la página JSP que se encarga de mostrar la lista de personas.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Lista de Personas</title> </head> <body> <ul> <c:forEach items="${listaPersonas}" var="persona"> <li>${persona.nombre}, ${persona.apellidos}</li> </c:forEach> </ul> <a href="Formulario">Ir a formulario</a> </body> </html>
Para finalizar cargamos la página en un navegador y nos mostrará la lista.
Ya tenemos un ejemplo sencillo con anotaciones y Spring MVC funcionando
Hola Cecilio tuve problemas para poder usar :
dentro del applicaction-context.xml
Como dijo alguien arriba en un comentario lo resolvi llevando las dependencias de spring a la version 4.2.5.RELEASE
Gracias por el ejemplo lo demas funciona muy bien.
org.apache.geronimo.specs
geronimo-servlet_3.0_spec
1.0
org.springframework
spring-core
4.2.5.RELEASE
org.springframework
spring-webmvc
4.2.5.RELEASE
org.springframework
spring-context
4.2.5.RELEASE
gracias por el aporte 🙂
Cecilio un saludo, te felicito por tus tutoriales, y por sobre todo por tu libro Arquitectura Java Sólida, de lo mejor que he leido. He estado haciendo este sencillo tuto, pero me he percatado de un problema, usas la versión 3 spring, pero esta no soporta las anotaciones del controlador tal como las usas, ni la etiqueta , hay dos opciones o te quedas en la version 3 y declaras el bean en el application context tal cual se hizo en el tuto anterior, o subes a la version 4 que si soporta el uso de anotaciones completamente. Un saludo.
gracias por la correción
[…] artículos relacionados : Spring MVC Configuración , Spring MVC Anotaciones ,Spring MVC Model […]
Hola estimado cecilio,
Tengo una duda, en un controlador he visto que para devolver metodos se retornar un Objeto ModelAndView y tambien se puede retornar un String.
– Mi duda cuando se debe retornar cada uno
– Cual de los 2 es mas optimo
– Es cierto que en Spring 3 se recomienda usar String
Si retonas un modelview puedas hacer más cosas pero puedes adaptarlo más lo que sucede es que el 99 % de las veces con que devuelva String es suficiente , yo es el que uso, devuelvo String
Hola Cecilio, el problema es que el sitio al cual necesito darle mantenimiento no utiliza anotaciones, todo esta definido en el dispatcher de todas formas ya le di solucion, quizas no tan optima pero funciona. Gracias de todas formas pues su blog me ha servido de mucha ayuda y lo tengo como referencia de consulta. Felicidades!!!!
Buenas, antes que todo gracias por el tuto. Tengo una pregunta, como queda el código en el “application-context.xml” luego de agregar el nuevo bean “viewResolver” y el ???? hay que borrar los Beans agregados en el primer tutorial???
Otra pregunta, cuál es el sentido de que los métodos de la clase PersonaController devuelvan un String?? por que no se hizo con un “ModelAndView”?? Muchas gracias!
Porque es más moderno simplemente devolvemos las urls
Hola Cecilio, como siempre un excelente articulo. Lo exsorto a no perder las ganas de enseñar. Le cuento que he recibido un sitio desarrollado con Spring MVC 2.5 para hacerle algunos ajustes y es me ha presentado el siguiente problema. Tengo varios controlladores que dada cierta condición varía el valor de uno de sus atributos, hasta aquí todo bien. Lo que necesito es que cuando esa condición varíe el atributo tome el valor declarado en el dispatcher-servlet. ¿cómo pudiera leer lo que tiene el dispatcher ó reestablecer el valor declarado en el mismo? Ejemplo: Declaración Dispatcher dada la condición en… Read more »
No lo entiendo muy bien Osmay normalmente las rutas en Spring son dinámicas a través de los request mappings
Hola, yo tengo un problema, he seguido todo el tutorial pero nunca me accede a los metodos de la clase PersonaController y por lo tanto no recibo nada del modelo. ¿Cómo lo resuelvo? Llevo unas horas probando y no hay manera. ¡Gracias!
Pues no te se decir, pero revisa que tienes activada la parte de registro de anotaciones
Tras darle muchas vueltas me he dado cuenta de que el ejemplo del controlador con anotaciones es un simil del ejemplo de los dos controladores por separado. Simplemente habia que decirle en el beans el nuevo controlador. Ahora ya me funciona. Buen tutorial =)
ok 🙂
Hola. Ante todo enhorabuena por tanto por el blog como por el magnífico libro. Estaba probando el ejemplo que comentas, pero me surge un problema. Al añadir a application-context la etiqueta: me salta un error, como si no lo reconociera (la dependencia está añadida correctamente al pom.xml). Para solucionarlo he añadido al fichero (en la declaración de beans) lo siguiente: xmlns:context=”http://www.springframework.org/schema/context” Con esto ya no hay problema a la hora de realizar el build, sin embargo cuando está haciendo el despliegue salta el siguiente error: GRAVE: El Servlet /PRJ_PRUEBAS-0.0.1-SNAPSHOT lanzó excepción de load() org.xml.sax.SAXParseException: cvc-complex-type.2.4.c: The matching wildcard is strict,… Read more »
Tienes un error de parseo en la cabecera XML . Probablemente es una tonteria revisa en la documentación que pones el namespace y el schema . Pon en google spring mvc example y te saldran varios ejemplos con el código exacto 🙂