Iniciación a Spring Boot

Dec 2020

Guía paso a paso de cómo crear un proyecto en blanco, como plantilla para comenzar cualquier desarrollo web. En este tutorial utilizamos Java y Spring Boot para construir una aplicación web desde cero con sencillos pasos usando SpringBoot Initializr.

Cómo crear una aplicación con SpringBoot Initializr

Por parte de los desarrolladores de Spring, se tiene a disposición una herramienta web online denominada Spring Initializr donde por medio de unos parámetros de configuración genera automáticamente un proyecto Maven o Gradle, según se elija, en un archivo comprimido Zip conteniendo la carpeta con la estructura de la aplicación para ser importada directamente desde el editor de programación como Eclipse IDE, Netbeans IDE o Intellij.

Se puede acceder mediante el enlace a la dirección: https://start.spring.io/

El asistente web solicita una serie de datos necesarios para poder ejecutar la plantilla que construye los primeros archivos del programa. Para todos ellos aporta una configuración por defecto que conviene cambiar, como el nombre de la aplicación, o el package que se usará en las clases generadas.

A continuación se explica qué parámetros hay y para qué sirven:

  • Project: Permite elegir la herramienta de construcción de la aplicación. En Java las dos herramientas más usadas son Maven y Gradle. Recomendamos Maven al ser la más expendida.
  • Language: Lenguaje de programación que se va a utilizar en la aplicación. Los tres tipos están soportados por la máquina virtual JVM. Java es la opción más extendida y tiene mejor soporte de los editores de programación.
  • Spring Boot: Versión del Spring Boot a usar. Siempre que se pueda se optará por la última estable, compuesta únicamente por números.
  • Project Metadata, Group: Se refiere al descriptor de Maven groupId, utilizado para clasificar el proyecto en los repositorios de binarios. Normalmente se suele usar una referencia similar a la de los packages de las clases. Por ejemplo, com.arteco.web para disponer todas las aplicaciones web en el mismo directorio.
  • Project Metadata, Artifact: Se refiere al otro descriptor de Maven artifactId, y por tanto para indicar el nombre del proyecto y del binario resultante. La combinación de groupId y artifactId (más la versión) identifican inequívocamente a un binario dentro de cualquier organización.
  • Packaging: Indica qué tipo de binario se debe construir. Si la aplicación se ejecutará por sí sola se seleccionará JAR, éste contiene todas las dependencias dentro de él y se podrá ejecutar con java -jar binario-.jar. Si por el contrario, la aplicación se ejecutará en un servidor J2EE existente o en un Tomcat ya desplegado se deberá escoger WAR.
  • Java: Se selecciona la versión de Java a usar. En este caso, se recomienda usar la versión de Java más antigua para garantizar la compatibilidad con otras librerías o proyectos que se quieran incluir, así será más probable encontrar documentación existente que siga siendo válida. Reduce el riesgo de toparse con funcionalidades no muy maduras.
  • Dependencies: Buscador de dependencias con los starters de Spring boot disponibles. Las dependencias más habituales son:
    • Spring Web se deberá escoger cuando se desee hacer una aplicación web o microservicios, siempre que se requiera una comunicación http y por tanto el uso de Spring MVC.
    • Thymeleaf Incorpora el motor de plantillas para HTML dinámico, sucesor de los anteriores JSP (Java Server Page).
    • Spring Data JPA necesario para utilizar la capa estándar de acceso a base de datos SQL denominada Java Persistence Api.
    • Spring Security Permite incorporar controles de acceso en base a usuarios y roles sobre URLs de la aplicación. También habilita el control de ejecución de métodos de servicio en base a roles según los estándares J2EE.
    • Lombok Aporta utilidades que facilitan la programación como la creación de @Getters y @Setters automáticamente para las clases que forman parte del conjunto de mensajes.
    • Flyway Librería que permite aplicar scripts de cambios de base de datos de manera controlada cuando arranca la aplicación. Estos scripts se denominan migraciones y están sujetos a un control de versiones para garantizar que se aplican en el orden correcto.
    • Mysql/Postgresql Incluye el JAR que contiene el driver JDBC necesario para configurar la capa de JPA según la base de datos a usar.
    • Otras… El asistente permite seleccionar entre más de 50 dependencias e integraciones de herramientas open source dentro de los proyectos realizados con Spring.

Una vez seleccionados los parámetros que se quieren, haciendo click en el botón «Generate-Ctrl+» se descargará un archivo zip con el nombre del Artifact que contendrá la carpeta con la estructura de la aplicación lista para importar desde el IDE.

Recursos generados por SpringBoot Initializr

Para realizar la importación, bastará con importar o abrir el fichero pom.xml que viene dentro del comprimido. Los editores crearán y configurarán el classpath y las librerías que se indican en él para que estén disponibles para el programador.

El contenido del fichero tendrá la siguiente forma:

.
├── HELP.md
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
├── main
│  ├── java
│  │  └── org
│  │      └── eadp
│  │          └── spring
│  │              └── SpringAppApplication.java
│  └── resources
│      ├── application.properties
│      ├── static
│      └── templates
└── test
└── java
└── org
└── eadp
└── spring
└── SpringAppApplicationTests.java

De los ficheros incluidos, el más importante es MyWebAppApplication.java que corresponde con el punto de entrada a la ejecución del programa. Aquí es donde se aloja el método public static void main(String[] arg) que es el que inicializa toda la aplicación de Spring Boot.

Durante el arranque del framework, Spring revista el resto de directorios o paquetes que cuelgan de método main en búsqueda de clases marcadas con alguna anotación que permite el registro de componentes como: @Service, @Component, @Repository y demás anotaciones de Spring y de Spring MVC como @Controller o @RestController. Fíjese que el paquete utilizado es el com.eadp.web, esta opción puede especificarse en el asistente Spring Initializr.

El siguiente fichero más importante es application.properties que es donde se aloja toda la configuración de los componentes de Spring Boot, cómo que encoding usar (utf-8), si debe usar caché en las plantillas, qué nombre y clave de acceso son los de por defecto, etc… En el enlace de configuraciones y propiedades comunes de spring boot hay una referencia de todas las existentes y sus valores iniciales.

El siguiente fichero es MyWebAppApplicationTests.java donde se aloja el primer test de ejemplo que genera Initializr por nosotros. Ahí, el usuario debe añadir los test que considere oportunos para aplicar en la medida de lo posible desarrollo orientado a test o TDD.

Los otros directorios son static que es donde se alojan los recursos estáticos que la aplicación debe servir sin procesar. Por ejemplo en esta carpeta se incluyen los ficheros CSS, Javascript, imágenes o fuentes que se referencian desde el HTML.

Si el fichero alojado en este directorio está en una sub-carpeta de static, como puede ser static/css/main.css. Spring Boot lo publicará automáticamente en la url http://localhost:8080/css/main.css. Así que no debe haber información sensible que cuelgue del directorio static porque entonces será accesible abiertamente.

Y por último la carpeta templates almacena los ficheros que permiten generar HTML dinámicamente con algún motor de plantillas soportado por Spring como Thymeleaf o Freemarker.

Cómo añadir funcionalidad al proyecto

El proyecto creado es muy simple, si tratamos de arrancar el método main de la clase MyWebAppApplication, veremos cómo Spring inicializa toda la aplicación y se pone a la escucha del puerto 8080, pero si dirigimos el navegador a esa URL no aparecerá ningún contenido. Así que veamos cómo podemos hacer para imprimir algunos datos mediante html dinámico.

Para que las siguientes líneas sirvan debemos asegurarnos de haber escogido al menos las dependencias de Spring Web y Thymeleaf, dejando el resto de opciones como se indican en las líneas superiores. Generamos el proyecto de nuevo, de no ser así y crearemos el primer controlador que permitirá añadir código Java y una plantilla Thymeleaf que generará los primeros documentos HTML dinámicos.

Con el proyecto ya importado en el editor vamos a crear un primer controlador que será el encargado de ejecutar código Java dada una URL. En éste crearemos una variable que podrá ser impresa en la plantilla mediante el traspaso del dato vía el modelo.

// contenido del fichero: src/main/java/org/eadp/spring/controller/MyController.java
package org.eadp.spring;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import java.time.LocalDateTime;

@Controller
public class MyController {

    @GetMapping("/")
    public String index(Model model) {
        model.addAttribute("tstamp", LocalDateTime.now());
        return "index";
    }
}

El controlador registra un método en «/», la raíz del sitio, de tal manera que cuando la aplicación esté arrancada y lista para escuchar peticiones http, normalmente por el puerto 8080, el método index será ejecutado cuando se solicite la URL de inicio http://localhost:8080/. En ese momento, el método será ejecutado añadiendo la hora actual a una variable con nombre tstamp que se guarda en model, objeto que se pasa a la vista, para que pueda construir el html dinámicamente. En este caso, mostrando la hora en la que se invocó ese método.

Por otro lado, nada más ejecutarse el método del controlador, Spring pasará el control a la vista con nombre index correspondiente al fichero index.html de la carpeta de templates, tal y como indica el return «index», en el que no hace falta indicar la extensión .html.

Para completar el círculo y ver los resultado necesitamos crear la vista index.html con el siguiente contenido:

// contenido del fichero: src/main/resources/templates/index.html
<!DOCTYPE html>
<html lang="es" xmlns:th="http://www.thymeleaf.org">
    <head>
        <title>My First Spring Boot App</title>
        <style>
            html {
                font-family: "DejaVu Sans", Arial, Helvetica, sans-serif;
                color: #404040;
                background-color: #d3d3d3;
            }
            body {
                padding: 5em;
            }
        </style>
    </head>
    <body>
        <h1>Hello from Spring Boot!</h1>
        <p>This page is served at <span th:text="__$_{__tstamp}"></span></p>
    </body>
</html>

Y listos! Ahora ya podemos arrancar de nuevo la aplicación y hacer la petición a http://localhost:8080/. Dando como resultado la impresión de la hora en la que se ejecutó el controlador.

Iniciación a Spring Boot

¿Con ganas de seguir leyendo?

Nuestra guía de Java

Cerca de 450 páginas en un libro de tapa blanda que podrás utilizar para aprender a programar en Java desde cero sin conocimientos previos. Explicamos como usar las herramientas más usadas en el mundo empresarial, todas ellas son totalmente gratis y Open Source.

Aprende conceptos como TDD para desarrollar software con garantías. Conecta tus apps con JPA en bases de datos SQL. Integra tus proyectos con Maven y mantenlos bajo control con Git. Mantente al día con la programación funcional de Java 8+.

Nuestra guía de Java
Libro Javañol