Spring MVC es un framework para desarrollar aplicaciones Java basadas en Web. Dos de los objetivos más importantes de Spring MVC es permitir que el desarrollo se concentre en la lógica del negocio y que se haga empleando buenos principios de diseño orientado a objetos.
Para lograrlo se utiliza un concepto muy interesante llamado Inversión del Control, también conocido como el principio Hollywood: “No nos llames, nosotros te llamaremos.” Esto permite que el código escrito por los desarrolladores para la lógica principal del sistema no tenga dependencias sobre las clases del framework; lo cual redunda en un código mucho más limpio y con la posibilidad de utilizar todas las ventajas de la programación orientada a objetos (específicamente la herencia).
Ya que tenemos una idea de la utilidad de Spring MVC, pongamos manos a la obra.
Objetivos:
- Configurar un ambiente de desarrollo con Eclipse, Tomcat y Spring MVC.
- Escribir una aplicación básica para demostrar el funcionamiento del framework.
Prerequisitos:
- Java 5 o superior
- Apache Tomcat
- Eclipse
- Desacargar Spring (con dependencias)
1. Instalando herramientas necesarias en Eclispe
Para empezar hay que instalar las herramientas necesarias para desarrollar una aplicación Web con Eclipse. Primero abre la ventana de instalación de nuevos paquetes haciendo click en la ruta Help >> Software Updates >> Find and Install…
Selecciona la opción Search for new features to install y haz click en Next.
Selecciona Europa Discovery Site.
Haz click en Finish y selecciona un mirror. En la pantalla siguiente selecciona Web and JEE Development, te marcará un error diciendo que las dependencias no están satisfechas, para lo cual presionamos el botón Select Required.
Después haz click en Next, acepta las licencias, de nuevo click en Next y luego en Finish. El manejador de actualizaciones empezará a descargar los paquetes necesarios.
2. Creando un proyecto Web
Una vez terminada la descarga e instalación haz click en File >> New >> Project. Selecciona Web >> Dynamic Web Project y haz click en Next. Elige un nombre para el proyecto (este nombre formará parte del URL), yo llamaré a mi proyecto spring1. Por último haz click en Finish.
Ahora vamos a integrar nuestra instalación de Tomcat para controlarla desde Eclipse, para lo cual vamos a Window >> Show View >> Other. En esta ventana selecciona Servers y haz click en Ok.
Para crear un nuevo servidor en Eclipse haz click derecho sobre el espacio blanco de la vista Servers y haz click en New >> Server. Elige el servidor que estarás usando (para efectos de este tutorial usaremos Tomcat, pero puede ser cuelquier otro contenedor de servlets, como JBoss o Weblogic).
Haz click en Next. En la siguiente pantalla selecciona la carpeta en la que se encuentra instalado Tomcat y haz click en Finish. Debe aparecer una nueva entrada en la vista Servers representando al servidor Tomcat que acabas de configurar.
Ahora agreguemos nuestro proyecto al Tomcat para que haga el deploy automáticamente, para lo cual hay que hacer click sobre el servidor Tomcat y luego en Add and Remove Projects. Aparecerá la siguiente ventana, donde hay que pasar el proyecto spring1 de Available Projects a Configured Projects y luego haz click en Finish.
Es hora de probar que todo funcione hasta ahora. Haz click derecho sobre el del servidor que acabamos de configurar y luego en Start. A continuación se mostrará la consola del servidor, el cual debe arrancar sin problemas. Ahora abre tu navegador favorito y abre la dirección http://localhost:8080/spring1/. Si se muestra un error 404 todo está bien (hasta ahora). El error es por que no hemos creado una página de inicio; según nuestro archivo WebContent/WEB-INF/web.xml se debe llamar index.jsp, por lo que procedemos a crearlo (en la carpeta WebContent):
<?xml version="1.0" encoding="UTF-8" ?> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Hola Mundo!</title> </head> <body> Hola Mundo! </body> </html>
Si vuelves a checar http://localhost:8080/spring1/ te aparecerá el contenido de index.jsp.
3. Spring MVC
Por si no lo han notado aún, lo que hemos hecho hasta ahora no ha tenido mucho que ver con Spring. Esto se debe a que solo hemos configurado un ambiente para desarrollo de aplicaciones JEE, lo cual nos facilitará las cosas para crear nuestra aplicación Spring MVC.
Ahora viene lo bueno. A manera de resumen, para crear un proyecto (mínimo) Spring MVC hay que seguir los siguientes pasos:
- Colocar las librerías necesarias.
- Configurar al DispatchServlet como FrontController.
- Configurar un View Resolver para asociar las vistas a los controladores.
- <loop_begin>
- Escribir un controlador y agregarlo al contexto del DispatcherServlet.
- Escribir una vista (JSP).
- <loop_end>
3.1 Colocar las librerías necesarias
Copia los siguientes archivos a la carpeta WebContent/WEB-INF/lib del proyecto:
- spring-framework-2.5/dist/spring.jar
- spring-framework-2.5/dist/modules/spring-webmvc.jar
- spring-framework-2.5/lib/jakarta-commons/commons-logging.jar
- spring-framework-2.5/lib/j2ee/servlet-api.jar
3.2 Configurar al DispatchServlet como FrontController
Agrega lo siguiente al archivo WebContent/WEB-INF/web.xml dentro del tag web-app. El nombre que le daremos a este Servlet también será muy importante, ya que formará parte del nombre de el(los) archivo(s) de configuración del contexto del FrontController, donde definiremos los Beans que formarán nuestra aplicación.
<servlet> <servlet-name>spring1</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet>
La anterior definición solo le dice a Tomcat que cargue al DispatcherServlet al iniciar. Ahora hay que decirle qué URLs serán procesadas por Spring. Como pueden ver, el url-pattern incluye todas las direcciones que terminan con .jsp, en realidad esta es una terminación arbitraria y podemos sustituirla por cualquier cosa.
<servlet-mapping> <servlet-name>spring1</servlet-name> <url-pattern>*.jsp</url-pattern> </servlet-mapping>
3.3 Configurar un View Resolver para asociar las vistas a los controladores
El View Resolver es un bean que se define en el contexto de la aplicación (del DispatcherServlet). Para lo cual debemos crear un archivo llamado spring1-servlet.xml en la carpeta WebContent/WEB-INF/. El archivo tiene el siguiente contenido:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp"/> </bean> </beans>
En el código anterior hay tres cosas que notar: 1) El View Resolver que se utiliza. InternalResourceViewResolver es uno de los más sencillos y fáciles de usar, pero existen otros con mayor flexibilidad. 2) La property “prefix” define la carpeta en donde se encuentran las vistas. 3) La property “suffix” define la extensión de los archivos de las vistas.
3.4 Escribir un controlador y agregarlo al contexto del DispatcherServlet
Spring MVC prevee varios tipos de controladores que tienen usos diferentes, por ejemplo:
- Los que manejan un simple request, pero que no tienen ningún tipo de workflow.
- Los form controllers que manejan el ciclo de vida completo de una forma XHTML.
- Los wizard controllers que pueden manejar múltiples flujos de trabajo.
En este caso usaremos el más sencillo: AbstractController.
package com.andreimosso.spring1.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
public class HomeController extends AbstractController {
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request,
HttpServletResponse response) throws Exception {
return new ModelAndView("home");
}
}
Aquí debemos considerar un par de cosas importantes: 1) Los controladores deben implementar el método handleRequestInternal, que recibe un request y un response, y que también debe regresar un objeto de tipo ModelAndView. Este último objeto, como su nombre indica, contiene la información necesaria para representar al modelo y a la vista asociadas a un controlador. En este caso vemos que en el constructor del objeto ModelAndView se para una cadena: “home”. Esta cadena será utilizada por el View Resolver para generar el path para localizar al archivo de la vista (ejemplo: WebContent/WEB-INF/jsp/home.jsp).
Lo único que resta con el controlador es agregarlo al contexto de la aplicación. Agregaremos un bean más al archivo spring1-servlet.xml que haga referencia al controlador que recien creamos.
<bean name="/home.htm" class="com.andreimosso.spring1.controller.HomeController"/>
3.5 Escribir una vista (JSP)
Crea un archivo llamado home.jsp en la carpeta WebContent/WEB-INF/jsp/ con el siguiente contenido.
<?xml version="1.0" encoding="UTF-8" ?> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Insert title here</title> </head> <body> Hola Mundo! </body> </html>
Finalmente podremos ver los resultados de todo este trabajo. Abre la siguiente dirección en tu navegador http://localhost:8080/spring1/home.htm y verifica que se despliegue el contenido que definiste en la vista home.jsp.
Con esto concluye el ejercicio más simple que hay en Spring MVC. Sin embargo, a veces lo más difícil es ponernos sobre los pies y dar el primer paso. Espero pronto publicar una secuela a este post para manejar información enviada en una forma y tal vez un tercer post para acceso a bases de datos.
Espero que este tutorial haya sido de utilidad. Hasta la próxima.


Yeah!! ahora si aprendo spring!!! dbrias poner un boton para donar n_n
Lector
April 14th, 2008
Que onda buen Lector! Solo que no es el spring común y corriente. Este es específico para aplicaciones web.
Eso del botón de donar suena bien, jajaja. Saludos.
moshin
April 14th, 2008
Copie todo tal cual pero me da error 404, con index.jsp funciona pero con home no, no habra que cargar las librerias tambien en java build path? Muchas gracias.
andres
June 2nd, 2008
ahora me funciono bien tenes un ejemplo un poco mas avanzado para ir progresando?
Gracias
andres
June 11th, 2008
Buenas,
Estoy intentando que funcione este ejemplo pero no hay manera, Andrés, me da el mismo fallo que a ti, ¿como lo has solucionado?
kodice
June 15th, 2008
Creo que al mapear *.jsp en el web.xml, se le escapa home.htm.
Es decir que hay que poner que mapee *.htm o bien home.htm para que sea procesado con spring.
Así, sí funciona.
lucía
July 23rd, 2008
Gracias por el tutorial, lo puse en practica pero con netbeans, una maravilla, ahora nose si hay q ponerte puntos aqui, si es asi te doy 10 si es de 1 a 10, 100 si es de 1 a 100
oscar
August 13th, 2008
Hola a todos!!!
todo parece ir bien pero no logro que me funcione con el home.jsp ???
Tomcat me dice que no está disponible el recurso…
tengo duda sonbre donde coloco el controlador HomeController.java !!!
Luis
September 9th, 2008
Hola !!!
He seguido todos los pasos del tutorial y el tomcat me arroja el siguiente error:
ADVERTENCIA: No mapping found for HTTP request with URI [/spring/WEB-INF/jsp/home.jsp] in DispatcherServlet with name ’spring’
11/10/2008 01:23:27 PM org.springframework.web.servlet.DispatcherServlet noHandlerFound
A ver si alguno puede ayudarme
Cguz
October 11th, 2008
He conseguido solucionarlo. Cambiando lo siguiente:
spring1
*.jsp
</servlet-mapping
En el web.xml por esto:
spring
/
No pregunten el porque se arreglo ..que no tengo ni idea. Lo estoy desarrollando en Apache Tomcat 6 con la ultima version de Java. El ultimo eclipse y la ultima version de spring.
Un saludo,
Cguz
October 11th, 2008
Como puedo conectar el SpringMVC para acceder a los datos de mi MD Postgres, ?
El nene
November 12th, 2008