logo

Primer proyecto con Spring MVC

Introducción

Inaguramos una serie de tutoriales referentes al framework Spring MVC. En esta serie de tutoriales como viene siendo habitual se verá muy poca teoría, lo que haré es poner enlaces que explican la teoría en cada una de las partes que componen dicho tutorial según se vaya avanzando en el mismo y por otra parte dejaré colgado en Github el código de los proyectos que vayamos viendo para que lo podaís descargar y probarlo.

Sería bueno que os pasarais por la página de spring para un primer vistazo.

Comenzamos.

El Proyecto

Este proyecto simplemente consiste en configurar el esqueleto de un proyecto springmvc para posteriormemte ir añadiendo funcionalidades (esto se verá en otros tutoriales) y que se vaya pareciendo a algo medianamente serio.

La estructura del proyecto

Vemos como va a quedar el proyecto para que te sirva de referencia

estructura

Creamos un proyecto maven (hay cientos de ejemplos en la red de como crearlo) y añadimos las dependencias que necesitamos.

Las dependencias
pom.xml

  <dependencies>
  <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
  <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.1.5.RELEASE</version>
  </dependency>
  <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
  <dependency>   
      <groupId>javax.servlet</groupId>   
      <artifactId>servlet-api</artifactId>    
      <version>3.0-alpha-1</version>    
  </dependency>
  <!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
  <dependency>  
      <groupId>javax.servlet</groupId> 
      <artifactId>jstl</artifactId> 
      <version>1.2</version>  
  </dependency>
</dependencies>
            
La Configuración

Pasamos a los archivos de configuración, configuramos en primer lugar el DispatcherServlet, para ello extendemos la clase AbstractAnnotationConfigDispatcherServletInitializer, quedando el fichero como sigue:

SpringWebAppInitializer.java

package com.wanchopi.spring.config;

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

/**
 * Init app
 * @author Wanchopi
 *
 */
public class SpringWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

  @Override
  protected Class<?>[] getRootConfigClasses() {
    return null;
  }

  @Override
  protected Class<?>[] getServletConfigClasses() {
    return new Class<?>[] { WebMvcConfig.class};
  }

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

}
            

Ahora pasamos a configurar Spring MVC, esto establecerá el soporte básico que necesitamos para un proyecto MVC

WebMvcConfig.java

package com.wanchopi.spring.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;


/**
 * Configure Spring MVC
 * @author Wanchopi
 *
 */
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.wanchopi.spring")
public class WebMvcConfig implements WebMvcConfigurer {
  
  @Bean(name = "viewResolver")
  public InternalResourceViewResolver getViewResolver() {
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
    
    viewResolver.setPrefix("/WEB-INF/views/");
    viewResolver.setSuffix(".jsp");
    
    return viewResolver;
  }
  
  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/public/**").addResourceLocations("/public/"); 
    }

}              
            

Dejo un enlace interesante que explica todo esto con detenimiento pinchar aquí

El Modelo

Pasamos a crear una pijada de modelo solo a modo de ejemplo. Lo iremos complicando en sucesivos tutoriales.

Greeting.java

package com.wanchopi.spring.model;


/**
 * Model
 * @author Wanchopi
 *
 */
public class Greeting {
  
  private String message;
  private String date;
  
  /**
   * @return the message
   */
  public String getMessage() {
    return message;
  }
  /**
   * @param message the message to set
   */
  public void setMessage(String message) {
    this.message = message;
  }
  /**
   * @return the dateTime
   */
  public String getDate() {
    return date;
  }
  /**
   * @param dateTime the dateTime to set
   */
  public void setDate(String date) {
    this.date = date;
  }
  
}
            
El Controlador

Y el controlador de la aplicación. Anotamos la clase con la anotación @Controller para que Spring lo registre, inyectamos el modelo con la anotación @Autowired y al único método del controlador le ponemos la anotación @RequestMapping, anotación que se encarga de relacionar un método con una petición http. Señalar que el nombre del método puede ser ei que queramos, pero combiene que sea un nombre indentificativo para que esté claro lo que hace.

HomeController.java

package com.wanchopi.spring.controller;

import java.time.LocalDateTime;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.wanchopi.spring.model.Greeting;

/**
 * Spring MVC Controller
 * @author Wanchopi
 *
 */
@Controller
public class HomeController {
  
  @Autowired
  private Greeting greeting;
  
  @RequestMapping("/")
  public String home(Model model) {
    // code ...
    Greeting greeting = new Greeting();
    greeting.setMessage("Hello World");
    int day = LocalDateTime.now().getDayOfMonth();
    int month = LocalDateTime.now().getMonthValue();
    int year = LocalDateTime.now().getYear();
    String date = day + " del " + month + " de " + year;
    greeting.setDate(date);
    model.addAttribute("greeting", greeting);
    return "index";
  }

}
            
Las Vistas

Y por último después de cargar las librerías habituales (bootstrap, jQuery, etc...), y las imagenes que necesitemos, creamos una vista .jsp.

index.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>index :: HelloWorld</title>
<link rel="stylesheet" href="public/css/bootstrap.min.css">
<link rel="stylesheet" href="public/css/font-awesome.min.css">
</head>
<body>
  <div class="container">
    <div class="row">
      <div class="col-lg-12" align="center">
        <img alt="logo" src="public/images/logo.png">
      </div>
      <div class="col-lg-12">
        <h2>${greeting.message}</h2>
        <h4>El día ${greeting.date}</h4>
        <h2>de Spring MVC 5 !!</h2>
      </div>
    </div>
  </div>

    <!-- jQuery core JavaScript -->
    <script src="public/js/jquery.min.js"></script>
    <!-- Bootstrap core JavaScript -->
    <script src="public/js/bootstrap.min.js"></script>
</body>
</html>
            

Desplegamos la aplicación, en mi caso, utilizo Tomcat 8.5 y la vemos funcionando.

aplicación corriendo

Nota: En el código colgado en GitHub añado un test sobre el controlador, pero de momento eso lo obviamos hasta que veamos Spring Boot.


Herramientas y Software

  • Eclipse Version: 2019-03 (4.11.0)
  • Java SE-1.8 (jdk1.8.0)
  • Tomcat v8.5
  • Spring MVC 5.1.5
  • bootstrap 4.3.1
anterior

Librería Gson

siguiente

Form Spring Mvc