Spring MVC Configuración (I)

Debido a la explosión de las aplicaciones móviles cada día nos encontramos con una mayor necesidad de utilizar frameworks web que generen paginas HTML sencillas de tal forma que luego puedan decorarse con otras tecnologías tipo Bootstrap ,JQuery mobile o similares. A este tipo de categoría pertenece el framework Spring MVC que cada día es mas utilizado en las empresas. La siguiente comparativa es interesante para ver que cuota de mercado tiene cada framework.

Comparativa frameworks web y cuota de mercado

Como podemos ver aunque JSF es el standard Spring MVC hoy por hoy es el framework web mas utilizado.Vamos a dedicar algunos post a introducir este framework desde cero . En mi libro tenemos un par de capítulos que explican a detalle el modelo MVC y el modelo MVC 2 o de FrontController. Recordemos que un modelo de FrontController funciona de la siguiente manera. 001

Como podemos ver existe un único servlet que recibe todas las peticiones (GET,POST etc) y según la información que recibe delega en el comando adecuado que ejecuta la petición y devolverá unos resultados u otros .Spring MVC se apoya en este concepto.Vamos a montar como punto de partida una aplicación con Spring MVC que realice estas operaciones tan sencillas (Lista y Formulario). Para ello lo primero que necesitaremos es definir unas dependencias a nivel de Maven (pom.xml) con las librerias de Spring necesarias.

pom.xml

</pre>
<dependencies>
 <dependency>
 <groupId>org.apache.geronimo.specs</groupId>
 <artifactId>geronimo-servlet_3.0_spec</artifactId>
 <version>1.0</version>
 </dependency>
 <dependency>
 <groupId>org.springframework</groupId>
 <artifactId>spring-core</artifactId>
 <version>3.2.4.RELEASE</version>
 </dependency>
 <dependency>
 <groupId>org.springframework</groupId>
 <artifactId>spring-webmvc</artifactId>
 <version>3.2.4.RELEASE</version>
 </dependency>
 </dependencies>
<pre>

Realizado este paso vamos a configurar el framework Spring dentro de nuestra aplicación web. Para ello deberemos añadir el siguiente bloque de código en nuestro web.xml.


<web-app xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
 version="3.0">

<display-name>Spring MVC</display-name>
 <servlet>
 <servlet-name>springmvc</servlet-name>
 <servlet-class>
 org.springframework.web.servlet.DispatcherServlet
 </servlet-class>
 <init-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>/WEB-INF/application-context.xml</param-value>
 </init-param>
 <load-on-startup>1</load-on-startup>
</servlet>
 <servlet-mapping>
 <servlet-name>springmvc</servlet-name>
 <url-pattern>/</url-pattern>
 </servlet-mapping>
</web-app>

El fichero web.xml da de alta un nuevo servlet denominado DispatcherServlet que es el que realiza las tareas de controlador frontal de la aplicación y captura todas las peticiones ya que su url-pattern es “/”. Este controlador se apoya en el fichero clásico de Spring Framework que se encargará de gestionar los distintos flujos de la aplicación a traves del uso de beans.

004

Vamos a ver el código del fichero application-context.xml :


<?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-3.2.xsd">

 <bean name="/Lista"
 class="com.arquitecturajava.ListaController"/>
 <bean name="/Formulario"
 class="com.arquitecturajava.FormularioController"/>
</beans>

En nuestro caso vamos a optar por un primer ejemplo muy muy básico que usa dos beans que gestionan las distintas urls a las que accedemos utilizando el patron MVC2.

005

Si echamos un vistazo al código de cada de estas dos clases veremos lo siguiente.

Código ListaController:

package com.arquitecturajava;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class ListaController implements Controller {

public ModelAndView handleRequest(HttpServletRequest request,
 HttpServletResponse response) throws Exception {

 return new ModelAndView("/WEB-INF/jsp/Lista.jsp");
 }
}

Código FormularioControlller :

package com.arquitecturajava;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class FormularioController implements Controller {

public ModelAndView handleRequest(HttpServletRequest request,
 HttpServletResponse response) throws Exception {

 return new ModelAndView("/WEB-INF/jsp/Formulario.jsp");
 }
}

Como podemos ver nuestras clases implementan el interface Controller y tienen un método muy similar al método ejecutar (handleRequest) que nos redirige a una URL en concreto . 002

Una vez tenemos claro como funcionan los controladores que hemos definido es momento de ver el contenido de los ficheros JSP a los que hacen referencia. Lista.jsp

</pre>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Lista de Personas</title>
</head>
<body>
<ul>
<li>Pedro</li>
<li>Maria</li>
</ul>
<a href="Formulario">Ir a formulario</a>
</body>
</html>
<pre>

Formulario.jsp

</pre>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Lista de Personas</title>
</head>
<body>
<form action="Lista">
Nombre<input type="text" name="nombre" /></br>
Apellidos<input type="text" name="apellidos" /></br>
<input type="submit" value="Aceptar"/>

</form>
</body>
</html>
<pre>

Si solicitamos la url /Lista Spring MVC nos devolverá el contenido el fichero Lista.jsp.

003

@Controller y Anotaciones

El ejemplo que acabamos de construir es muy elemental y no hace uso para nada del sistema de anotaciones @Controller moderno del framework   que cubriremos en el siguiente Articulo. He preferido centrarme en los conceptos básicos y en la configuración propia del framework .

It's only fair to share...Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn

About Cecilio Álvarez Caules

Cecilio Álvarez Caules Sun Certified Enterprise Architech (J2EE/JEE).

24 Responses to Spring MVC Configuración (I)

  1. Roberto 20 Noviembre, 2013 at 21:33 #

    Buen artículo.

    Me ha resultado curioso el análisis al que linkas. Parece que los que mejor parados salen son los que menos cuota tienen. Yo últimamente he cogido bastante experiencia con gwt y la verdad es que es bastante satisfactorio. Tienes alguna opinión formada respecto a Grails, Vaadin y su futuro?

    Un saludo y felicidades por el blog

    • Cecilio Álvarez Caules 21 Noviembre, 2013 at 8:45 #

      Grails me parece que tiene mucho futuro ya que se nutre de la comunidad de Ruby que es una comunidad con grandes ideas. En cuanto a Vaadin no lo veo tan claro tendra su hueco pero no creo que vaya a ser nada que despegue simplemente tendrá su cuota

      • Roberto 27 Noviembre, 2013 at 21:18 #

        Gracias por la respuesta.

        Actualmente yo estoy mirándome Vaadin, como tengo conocimientos de GWT para mi es un paso natural. Una de las cosas que mas me llama la atención es que al ser puro java puedes utilizar otros frameworks como grails o play y quiero ver cuanto partido se le puede sacar a estas combinaciones.

        Aprovecho para compartir la siguiente parte del análisis, mas interesante si cabe:
        http://zeroturnaround.com/rebellabs/the-2014-decision-makers-guide-to-java-web-frameworks/
        En ella te orientan a elegir un framework en función del tipo de proyecto en el que trabajas. Es curioso que en uno de sus videopodcast preguntasen cual iba a ser el proximo framwork que iban a utilizar en un proyecto y la respuesta fué struts (el que quedó último en el análisis) y es que lo confortable que se siente un desarrollador con sus herramientas es tan o mas importante que las herramientas en si (eso también lo saqué de tu libro).

        Un saludo.

        • Cecilio Álvarez Caules 28 Noviembre, 2013 at 10:24 #

          Entiendo que para ti sea un paso natural si usas GWT . Otra cosa que aprovecho a comentar es la siguiente . Cuando uno usa un framework siempre hay muchas opciones . Pero una de las cosas mas importantes a la hora de tomar la decisión final es . ¿Hay alguna empresa solida detras? .A mi en mas de una ocasión me ha pasado que ha habido frameworks que eran originales pero que no tenian alguien grande detras …y simplemente con el tiempo se abandonaron . Con Vaadin no te pasara 🙂

  2. Daniel 6 Diciembre, 2013 at 18:31 #

    Buen dia Cecilio,
    Recomendarias Spring MVC para una aplicación de Escritorio (swing).

    • Cecilio Álvarez Caules 7 Diciembre, 2013 at 23:38 #

      Eso ya es un tema bastante distinto. Normalmente las aplicaciones de escritorio tienen otro tipo de requerimientos .Por ejemplo es muy habitual que sean muy muy dinamicas es decir … cargo un desplegable se carga otro directamente .Son cosas que se pueden hacer via AJAX con spring mvc o incluso con JSF .Pero no es lo mismo . Mi recomendación es … si uno quiere migrar su aplicación de escritorio lo que resulte mas encajable sea JSF en cuando a capacidades o algo como GWT. Esta también JavaFX pero lo sigo viendo prematuro.

      • Carlos 3 Mayo, 2016 at 20:45 #

        Como siempre muchas gracias por tus aportaciones y perdona si no hago la pregunta donde debo.
        Estoy leyendo este articulo e intentando desplegarlo pero me da el siguiente error y no consigo solucionarlo. ¿Alguna idea de por que me da lo siguiente?

        GRAVE: El Servlet.service() para el servlet [springmvc] en el contexto con ruta [/spring-mvc] lanzó la excepción [No adapter for handler [com.cgf.ListaController@37adb467]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler] con causa raíz
        javax.servlet.ServletException: No adapter for handler [com.cgf.ListaController@37adb467]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler
        at org.springframework.web.servlet.DispatcherServlet.getHandlerAdapter(DispatcherServlet.java:1128)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:903)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
        at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)

        • Carlos 3 Mayo, 2016 at 21:56 #

          Disculpa,

          Googleando vi que me faltaba añadir la interfaz controller a mis clases.

          Muchas gracias por compartir todo este conocimiento

          • Cecilio Álvarez Caules 5 Mayo, 2016 at 16:55 #

            De nada 🙂

  3. Richard Palacios 17 Abril, 2017 at 22:09 #

    Hola Cecilio, felicitaciones por tu página, es muy interesante la acabo de encontrar y me ayudado muchísimo.

    Quería preguntar algo, estoy empezando un proyecto web con java que posiblemente deba verse en Internet masiva mente y seguramente en dispositivos móviles con algún API Rest para el Backend.

    Si es verdad no tengo la experiencia suficiente en esto pero he usado ya JSF, Primefaces hasta Richfaces para proyectos puntuales que se ven en una intranet, pero ojeando por ahí he visto que se nombra mucho a Spring framework, la verdad aun no tengo mucho conocimiento de el mas que usa un patron MVC, tengo algo de curiosidad y se me da la duda de que tan eficiente y robusto sea usar JavaEE con Primefaces en internet a comparación de Spring MVC, en tu experiencia me recomiendas lanzarme por aprender Spring , o incluso descartar las alternativas anteriores y obtar por JSP y servlets?

    Muchas gracias por tu página, y espero ansiosamente me puedas dar tu opinión.
    Un saludo.

    • Cecilio Álvarez Caules 20 Abril, 2017 at 20:56 #

      Hoy por hoy Spring y Spring MVC son standares 🙂 yo te recomendaría abordarlos 😉

Trackbacks/Pingbacks

  1. Spring MVC Configuración (I) | Full Code - 7 Diciembre, 2013

    […] entrada Spring MVC Configuración (I) aparece primero en Arquitectura […]

  2. ¿Tiene futuro JSF? - Arquitectura Java - 12 Mayo, 2015

    […] artículos relacionados: JSF y HTML5 , Spring MVC , […]

  3. Spring MVC @ModelAttribute - Arquitectura Java - 9 Julio, 2015

    […] artículos relacionados: Spring MVC Configuración , Spring […]

  4. Utilizando Spring MVC Bean Validation - Arquitectura Java - 17 Julio, 2015

    […] artículos relacionados : Spring MVC Configuración , JSF vs Spring […]

  5. Spring REST Service con @RestController - Arquitectura Java - 24 Julio, 2015

    […] artículos relacionados:  Introducción a Spring MVC ,Spring MVC Bean […]

  6. Java Jodd MicroFramework - Arquitectura Java - 30 Julio, 2015

    […] Otros artículos relacionados: Spark Web Microframework , Introducción a Spring MVC […]

  7. Spring MVC @RequestMapping - Arquitectura Java - 14 Octubre, 2015

    […] artículos relacionados :  Spring MVC Configuración , Spring MVC Anotaciones ,Spring MVC Model […]

  8. Spring MVC Flash Attributes - Arquitectura Java - 22 Octubre, 2015

    […] artículos relacionados : Introducción a Spring MVC , EJB vs Spring , Spring Framework y […]

  9. Utilizando Spring MVC configuration annotation - Arquitectura Java - 23 Diciembre, 2015

    […] artículos relacionados: Introducción Spring MVC , Spring MVC […]

  10. Thymeleaf , un motor de plantillas - Arquitectura Java - 11 Marzo, 2016

    […] artículos relacionados: Modelo MVC cliente y servidor , Introducción a Spring MVC  , Spring […]

  11. ¿Qué es Spring Boot? - Arquitectura Java - 31 Marzo, 2016

    […] Otros artículos relacionados:  PropertiesPlaceHolder , SpringConfiguration , Spring MVC […]

  12. Spring Stereotypes y anotaciones - Arquitectura Java - 16 Junio, 2016

    […] artículos relacionados:Spring AOP y Aspectos , Spring MVC  , Thymeleaf , un motor de […]

  13. Spring @Inject CDI y standards - Arquitectura Java - 9 Enero, 2017

    […] Otros artículos relacionados:  JAX-RS , Spring Responsabilidades,  Spring MVC […]

Deja un comentario