Cómo crear una aplicación web Java con Spring Boot

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

Pantalla de configuración de nuevo proyecto Spring

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:

Una vez seleccionados los parametros 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 generá 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 https://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 https://localhost:8080/. Dando como resultado la impresión de la hora en la que se ejecutó el controlador.