Tu primera Aplicación Web en Java con SpringBoot

En esta primera entrada del blog así que vamos a comenzar con algo básico para tener bases claras; vamos a crear una aplicación web sencilla usando Spring Boot para tenerla como base de futuros proyectos.

Requisitos:

  • Es clave tener Java (mínimo: 8, pero también sirven 11 ó 12) instalado en la máquina donde vamos a correr las pruebas. En caso de no tenerlo recomiendo usar SDKMAN que hasta ahora me parece una excelente herramienta para instalar múltiples versiones de Java e incluso de otros subproyectos como Spark, Groovy, Scala; de los que hablaremos posteriormente.
    • Instalación
    • curl -s "https://get.sdkman.io" | bash source "$HOME/.sdkman/bin/sdkman-init.sh"
    • Con el siguiente comando revisamos si quedó bien instalado y las versiones de Java disponibles sdk version sdk list java
    • Luego seleccionamos la versión a instalar y corremos:
    • sdk install java <nombre-versión-elegida> Por ejemplo sdk install java 11.0.3-amzn
    • Si tu máquina usa Windows o deseas obtener más información sobre la instalación de SDKMAN puedes ingresar aquí: https://sdkman.io/install
  • También es importante tener instalado Apache Maven en tu máquina para facilitar el proceso de construcción del proyecto, esto también lo puedes hacer usando SDKMAN así: sdk install maven

Paso 1: Seleccionar opciones y descargar la base de la aplicación usando Spring Initializr

Nos dirigimos a https://start.spring.io/ donde vamos a encontrar una cantidad sin fin de opciones para configurar nuestra nueva aplicación, vamos a examinar algunas:

Spring Initializr Options
  • Project: Aquí vamos elegir la herramienta de automatización de la construcción y gestión de dependencias que vamos a usar, esto va a definir la estructura del archivo que definirá nuestro proyecto, cómo se compila y cuáles son sus dependencias. Las opciones son:
    • Gradle: Herramienta de automatización de la construcción de proyectos enfocada en ser flexible y eficiente, sus definiciones se escriben usando un DSL de Groovy(aunque lás últimas versiones ya soportan Kotlin)
    • Apache Maven: Herramienta de automatización y gestión de dependencias basada en el concepto de definir un POM(Project Object Model) es la herramienta más tradicionalmente usada para construir proyectos en Java, sus definiciones se escriben en un archivo XML
  • Language: Spring Boot nos permite programar nuestro proyecto en tres diferentes lenguajes, Java, Kotlin y Groovy. Para efectos de este Post vamos a elegir Java.
  • Spring Boot: Aquí vamos a elegir la versión a usar, para ese post vamos a alegir la última versión, que viene elegida por defecto, estable (algo interesante es que tenemos la opción de probar las versiones que están en desarrollo para evaluar futuras funcionalidades).
  • Project Matadata: Para facilitar el entendimiento de esta parte, podríamos decir que un proyecto tiene un alcance que podría ser resuelto por una o más aplicaciones o servicios.
    • Group: Este sería como el paquete base del proyecto, por ejemplo para este blog vamos siempre a usar com.hansospina.demo como agrupador de los proyectos de este sitio.
    • Artifact: Este sería ya el el nombre de esta aplicación/servicio específica(o), en nuestor caso la del post del día de hoy sería simpleappNOTA: Con las dos elecciones anteriores, vamos a terminar con un proyecto cuya estructura de paquete sería . => com.hansospina.blog.simpleapp
Spring Initializr Project Metadata

Si expandimos la sección options vamos a ver las opciones Name que viene de autollenado del campo Artifact y Description que por defecto dice que es un proyecto de Spring Boot, estos valores se va a usar en la parte descriptiva de los proyectos para Maven/Gradle. Finalmente tenemos dos opciones importantes a revisar:

Spring Initializr Extra Options
  • Packaging: Define la manera en que se va a empaquetar el ejecutable(código objeto) de la aplicación, hay dos opciones Jar(vamos a elegir este por ahora) y War, ambos no son más que un archivo zip renombrado a una extensión con el mismo nombre y una estructura de carpetas especial:
    • Jar(Java Application Package): Es la unidad de empaquetamiento básica de aplicaciones Java, pueden ser incluso ejecutables si el sistema operativo lo permite y en su definición indican cuál es la clase por donde se arranca la aplicación(la que contenga el método main)
    • War(Web Application Package): Además de las estructuras de código base, tiene una subcarpeta llamada Web para los recursos web y siempre incluye dos directorios especiales: META-INF para la parte descriptiva del paquete y WEB-INF en el que almacenará los recursos privados y reutilizables de la aplicación(librerías, código objeto, etc.)
  • Java: Define la versión de Java objetivo para correr la aplicación: 8, 11 y 12. Para nuestro ejemplo vamos a usar la 11 que es la más comúnmente usada, pero puedes elegir la 8 o la 12 si ya las tienes instaladas y todo funcionará de igual manera siempre que elijas una versión acorde a la que tengas instalada en tu máquina.

Por último, tenemos la opción Dependencies:

Spring Initializr Dependencies

Aquí tendremos un buscador de librerías/dependencias a usar en el proyecto, vamos a escribir web y seleccionamos Spring Web Starter que es la librería más simple con todas las dependencias necesarias para crear nuestra primera aplicación en Spring Boot

Spring Initializr Dependencies Web Starter

Finalmente damos click en el botón Generate the Project y esto nos va a descargar un archivo ZIP(con el mimo nombre que el que le dimos al proyecto: simpleapp.zip) con nuestro proyecto listo para usar.

Paso 2: Configurar y Ejecutar la aplicación

Procedemos a descomprimirlo y a mirar los contenidos de la carpeta:

Project Folder Structure

Revisemos un poco:

  • En la raiz encontramos: HELP.md que es una documentación plantilla de maven y los dos archivos del maven wrapper mvnw y mvnw.cmd que permiten ejecutar maven incluso sin tenerlo instalado en la máquina pues se lo descarga y lo ejecuta.
  • Luego encontramos la carpeta src que va a contener todo el código fuente y nuestros archivos de configuración.
  • Dentro de src/main/resources vamos a encontrar el archivo application.properties que podremos usar para configurar nuestra aplicación de muchas maneras gracias a la flexibilidad de Spring Boot, cosas como cambiar el puerto en que corre la aplicación, variables de entorno, url de conexión a otros recursos y muchas cosas más, serán definidas en dicho archivo.

Para continuar abrimos el proyecto en el IDE que usemos regularmente(Yo uso Intellij)

Al abrir el proyecto, busquemos nuestra clase principal navegando desde src/main/java hacia adentro por el paquete(en mi caso com/hansospina/demo) hasta encontrar un archivo que tenga el nombre: <Nombre Proyecto>Application.javaen mi caso: SimpleappApplication

SpringBootApplication

Algunas Observaciones:

  • Aquí vemos que esta clase es ejecutable pues viene ya con un método public static void main(String[] args) que como sabemos es el requerimiento básico para ejecutar. cualquier programa escrito en Java
  • Cuando la aplicación arranca y el main es ejecutado, la aplicación de Spring se inicializa mediante SpringApplication.run(SimpleappApplication.class, args);

Es hora de verlo correr, nos ubicamos en la terminal dentro del a carpeta del proyecto y corremos: mvn spring-boot:run y debemos de ver una salida parecida a esta:

Spring Boot maven run

Felicitaciones! Ya tienes tu primer aplicación de SpringBoot corriendo!

Si miramos la última línea, dice: Tomcat started on port(s): 8080 (http) with context path '' es decir que nuestra aplicación web ya está escuchando llamados por el puerto 8080, abramos el navegador en la siguiente url: http://localhost:8080/ y veremos:

localhost 404 error page

Hmmm… no se ve ta bien, pero tranquilo, en el siguiente paso vamos agregar una página html que sea más acorde a un mensaje de bienvenida.

Paso 4: Crear un index.html

Vamos a crear un archivo llamado index.html dentro de la carpeta src/main/resources/static así:

Sprinb Boot resources static folder

Para el contenido del html puse:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Hola Spring Boot!</title>
</head>
<body>

<h1>Hola Spring Boot!</h1>

</body>
</html>

Luego de tener esto listo, vamos a decirle a spring que queremos usar dicha página, para ello vamos a agregar el siguiente método en nuestra clase principal SimpleAppAplication

  @Bean
  public WebMvcConfigurer forwardToIndex() {
    return new WebMvcConfigurer() {
      @Override
      public void addViewControllers(ViewControllerRegistry registry){
        registry.addViewController("/").setViewName(
            "forward:/index.html");
      }
    };

  }

Quedando así:

Spring Boot WebMvcConfigurer

Este código básicamente crea un bean (En Spring Framework, los objetos que componen tu aplicación y que son manejados por el Contenedor de Spring se llaman beans, el contenedor de Spring maneja su ciclo de vida) del tipo WebMvcConfigurer que define un controlador que recibe peticiones en la ruta raiz (“/”) y redirecciona para responder con nuestro archivo html.

Ahora, detenemos la aplicación si todavía está corriendo en la terminal, la ejecutamos de nuevo usando mvn spring-boot:run y si miramos los logs veremos el siguiente mensaje:

Spring Boot mapping logs

Y si abrimos el navegador veremos:

Mucho mejor, esto sería todo para nuestra primera aplicación con Spring Boot

En el próximo post vamos a agregar un poco de Unit Testing y a exponer un servicio REST en nuestra aplicación.

El código fuente se puede encontrar aquí : https://github.com/HansOspina/blog-spring-boot-1

Qué opinas? Si deseas ver más posts como este déjame saber los temas que te interesan en un comentario o vía twitter

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s