viernes, 27 de noviembre de 2015

Configuración Básica de Spring MVC mediante Java.

En este primer ejemplo de configuración de Spring MVC se realizará completamente con código Java, sin nada de XML. Consiste en un sencillo Hola Mundo con Spring. Para ello utilizaré como herramientas:


Maven
Netbeans 8.0.2
Tomcat 8.0.28
Spring 4.2.2

Podéis descargar el código fuente del proyecto en mi respositorio de GitHub: https://github.com/Jaime-Alonso/TutorialSpringMVC

Cuando un usuario hace una solicitud a nuestra aplicación web, como mínimo incluye la URL, pero también puede contener información adicional como por ejemplo la enviada a través de un formulario.

La primera parada de la solicitud es del Dispatcher Servlet de Spring, que cómo otros frameworks, procesa todas las solicitudes mediante un servlet frontal que delega la responsabilidad en otros componentes de la aplicación, normalmente llamados controladores. El Dispatcher Servlet tiene que decidir que controlador elegir en cada caso.

Es habitual en la lógica del controlador que se procese una respuesta con información hacia el usuario, y con un formato normalmente HTML. La tarea del controlador es empaquetar los datos del modelo, asignar una vista correspondiente (normalmente un JSP) y devolverlo al Dispatcher Servlet.



Una vez el Dispatcher Servlet sabe que vista tiene que procesar junto con los datos del modelo se los envía a un JSP.

Antes de los Servlets 3.0 era necesario utilizar el descriptor de despliegue web.xml, que ahora también es una posibilidad válida, pero voy a utilizar java para configurar nuestro servlet frontal. Al no utilizar el web.xml es necesario un contenedor que soporte la especificación servlet 3.0 como Tomcat en versiones superiores a la 7.


package net.codigoalonso.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

/**
 *
 * @author codigoalonso.net
 */
public class TutorialWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{

    @Override
    protected Class[] getRootConfigClasses() {
        return new Class[] { RootConfig.class};
    }

    @Override
    protected Class[] getServletConfigClasses() {
        return new Class[] {WebConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] {"/"};
    }    
}


Con el método getServletMappings estamos indicando que el Dispatcher Servlet va a procesar la ruta "/" siendo así el servlet predeterminado de nuestra aplicación web.

En la siguiente clase WebConfig.java habilitaremos Spring MVC y el solucionador de vistas. En una configuración XML se utilizaba <mvc:annotation-driven> para habilitar Spring MVC utilizando anotaciones, en una configuración java simplemente anotamos con @EnableWebMvc.


package net.codigoalonso.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

/**
 * @author codigoalonso.net
 */

@Configuration
@EnableWebMvc
@ComponentScan("net.codigoalonso.controllers")
public class WebConfig extends WebMvcConfigurerAdapter{
    
    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        resolver.setExposeContextBeansAsAttributes(true);
        
        return resolver;
    } 
    
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();        
    }    
}

Con la anotación ComponentScan buscará en el paquete especificado componentes, como son los controladores, que anotaremos con @Controller y así nos evitaremos de declararlos específicamente.
Existen varios solucionadores de vistas de los que ya hablaré, por el momento estamos configurando el solucionador especificando dónde se guardaran los JSP's. El otro método se utiliza para que nuestro Dispatcher Servlet no procese las solicitudes a recursos estáticos.

La siguiente clase RootConfig es otra clase más para configurar Spring, se utiliza para declarar beans que afecten a toda la aplicación e importar otras configuraciones, al utilizar @ComponentScan sin pasar ningún paquete como parámetro, analiza las clases dentro de su paquete y subpaquetes con el archivo @Configuration,


package net.codigoalonso.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 * @author codigoalonso.net
 */

@Configuration
@ComponentScan
public class RootConfig {
    
}

Por último nos queda el controlador que es tan simple como:


package net.codigoalonso.controllers;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HomeController {
    
    @RequestMapping(value="/", method =RequestMethod.GET)
    public String home() {
        return "home";
    }
}

El resto de archivos del proyecto los podéis como el pom.xml donde están las librerias necesarias o el home.jsp en mi repositorio de GitHub: https://github.com/Jaime-Alonso/TutorialSpringMVC

4 comentarios: