Esto es un espacio para hablar de programación, algoritmos y tecnología. Aquí trato de publicar artículos que contengan un valor adicional y (ojalá) de utilidad para todos lo que los lean.

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.

Spring 2.5

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:


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.

Search for New Features

Selecciona Europa Discovery Site.

Selected Sites

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.

Selected Packages

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.

New Web Project

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.

Servers View

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).

New Server

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.

Tomcat Server

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.

Add Project to Tomcat

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.

34 Responses to “Spring MVC Práctico I: Hola Mundo!”

  1. Yeah!! ahora si aprendo spring!!! dbrias poner un boton para donar n_n

    Lector

  2. 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

  3. 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

  4. ahora me funciono bien tenes un ejemplo un poco mas avanzado para ir progresando?
    Gracias

    andres

  5. 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

  6. 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

  7. 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

  8. 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

  9. 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

  10. 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

  11. Como puedo conectar el SpringMVC para acceder a los datos de mi MD Postgres, ?

    El nene

  12. Me aparece recurso no disponible, alguien me puede decir a q se debe?. Muchas gracias

    JHON

  13. Muy buen post para empezar con srping

    Juan Jose

  14. @JHON: Posiblemente sea porque no estás mapeando correctamente algo, ya sea en web.xml o el dispatcher, en este caso spring1-servlet.xml.

    Jesfre

  15. Hola, tengo un comentario, cual es la diferencia que hay entre el concepto “inversion de control” y el “template method pattern” ?

    Ulises

  16. En que carpeta debo crear la clase HomeController? no se

    williams

  17. me sale este error:
    18/02/2009 06:06:07 PM org.springframework.web.servlet.DispatcherServlet noHandlerFound
    ADVERTENCIA: No mapping found for HTTP request with URI [/spring1/home.htm] in DispatcherServlet with name ‘spring1′

    williams

  18. Hola moshin. Gracias por el tutorial, esta bastante bueno para empezar.

    Sobre el error que hace que no funcione muy bien… solo hay que cambiar en el web.xml::

    que el url-pattern sea de *.htm en vez de *.jsp
    Es mas, genera un error a momentos con la pagina index de la aplicación web.

    Moshin, buscaré si ampliaste el tema, es de gran interés para mi, tambien para preguntarte por material para ampliar mi conocimiento a partir de este buen ejemplo tuyo.

    saludos.

    samz550a

  19. Llevo horas dándole vueltas y debe haber algo mal en los ficheros web.xml o spring1-servlet.xml porque no encuentra la clase del controlador.

    Deloco

  20. Hola no me encuentra las libreria de org.spring de web.servlet en el home.inedx no me funciona no se por que me da muxos errores

    youssef

  21. weno para la gente que le daba el controller errores eso es por que no han importado las librerias de spring necesarias, como la org./we.servlet/. * , intentar en projet añadir jars externos y seleccionar los y ya vereis como si deja de dar errores, pero el caso que si os puede dar un 404 NOT FOUND pq ami si me lo da, eso es todo lo que tengo Suerte a todos…

    youssef

  22. Hola que tal?

    si eres tan amable de ayudarme te lo agradecere.

    Tengo el siguiente error a la hora de ejecutar el proyecto.

    Error configurando escuchador de aplicación de clase org.springframework.web.context.request.RequestContextListener

    ¿Como puedo solucionarlo?

    Imgino que sera que le falta el jar de spring a tomcat, por que lo he visto por hay, pero como puedo agregarle y donde, el jar de eclipse a tomcat?

    Un saludo y gracias de antemano.

    marcos

  23. EXCELENTE DOCUMENTO!!! SENCILLO Y DIRECTO AL PUNTO!! HE COMPRADO UN LIBRO CARISIMO DE SPRING Y FUE ESTA PAGINA LA QUE ME PERMITIO DAR MI PRIMER PASO!! MUY BIEN EXPLICADO Y MUY CUIDADO EN LOS DETALLES!

    Andres

  24. no funciona! pero buen trabajo!

    vl4dy

  25. Pues yo pude echar a andar este ejemplo en 15 minutos, y hasta me di el lujo de cambiar de package en mi controller, a riesgo de perderme pues to que nunca he hecho nada en Spring, gracias!!!!

    The Neko

  26. ps la neta io no pudde y ps ni le entendi jajajajaja haber q puedo hacer tendre q checar otras pags ni modo jajajajaja

    angel

  27. yo te apoyo angel….—>no le entendi!!!!

    karikatura

  28. en el web xml hay que cambiar

    *.jsp

    por *.htm

    Esto canbia el filtro que redirecciona al servlet ya que la url que hay que probar indica home.htm

    fsalinas

  29. Facil de entender para comenzar con Spring gracias !!!

    Y todo funcionando correctamente.

    ikker26

  30. Todo bien lo unico es cambiar en el web.xml
    *.jsp
    por *.htm

    Saludos doc y buen trabajo está como un coquito.
    Lima-Perú

    Slipkeri

  31. gracias Bro, es un muy buen comienzo en Spring

    tiger5412

  32. Gracias!! rapido, facil y consciso!! justo lo que necesito!! Y k mas tienes???

    lyne

  33. Holas…..yo lo hice funcionar con un tomcat project en vez de Dynamic Web Project…y hay que cambiar, en web.xml, *.jsp POR /…eso es todo..saludos!!

    ivan

  34. Hola, me parece muy bien la entrada, estoy iniciando a este Framework que me parece un poco complicado, quiero compartir mi blog, para que utilicen maven, tengo algunos post que ayudaran mucho! Gracias

    Johann

Leave a Reply