Tutorial SpringBoot JPA v2023 - Parte 07 - Controller
Tutorial SpringBoot JPA v2023 - Parte 07 - Controller
TUTORIAL BASICO DE
SPRING BOOT Y JPA
Tutorial de Aplicación Web MVC con Spring Boot,
Spring DATA JPA y Spring Security
Descripción breve
Mini tutorial para crear una aplicación MVC con el Framework Spring 6.0 y Spring Boot 3.0
Y se guarda en “C:\JAVA\jdk”:
1
Se configura la variable de usuario “PATH”:
2
Y se copia en “C:\JAVA\STS\”
Y quedaría instalado:
3
Se inicia el IDE y se selecciona el espacio de trabajo:
4
Clic en <Install>:
5
Clic en “Preferences” y vamos a la opción “JAVA>Installed JREs”:
6
Clic en <Next>:
7
Clic en <Seleccionar carpeta>:
8
1.3 Descarga de Lombok
La librería Lombok se descarga de “https://projectlombok.org/download”:
Y se guarda en:
Se muestra:
9
Se especifica la localización del IDE:
Se acepta la selección:
10
2 Creación del Proyecto Spring Boot:
2.1 Proyecto Spring Started Project
11
Seleccionamos las dependencias para el proyecto y clic en <Finish>:
12
En la siguiente ventana ponemos el nombre de la base de datos a crear:
Clic en guardar:
13
2.4 Configuración adicional en el IDE:
Se recomienda configurar las siguientes propiedades en el IDE “Windows”, “Preferences”:
14
2.5 Estructura del Proyecto
Creamos la siguiente estructura inicial de paquetes y carpetas para el proyecto:
15
16
3 Código Backend (Clases JAVA)
3.1 Paquete Entidad
17
18
Clase Curso inicial, el código definitivo se muestra al final de la sección, conforme se vayan
agregando las relaciones con las clases Notas y Docente:
Ahora modificamos la clase Docente para agregar la relación con Curso, agregamos las líneas 81
y 82, así como las importaciones necesarias:
19
20
Ahora establecemos las relaciones entre Nota con Alumno y Curso:
21
Hacemos las modificaciones en las clases Alumno.java y Curso.java, quedando así:
22
Observando más detenidamente se puede apreciar la clase Nota, en realidad tiene una clave
compuesta por alumno, curso y docente; por lo tanto, se debe crear una clase que permita
manejar la clave compuesta para la clase Nota, llamada NotaID:
23
Luego de la redefinición de su clave primaria, la clase Nota quedaría así:
24
25
3.2 Paquete Repositorio
26
3.3 Paquete Servicio
Debido a que las clases de servicio tienen una funcionalidad base común, primero crearemos
una interfase genérica con dicha funcionalidad. Se le dice genérica porque además de los tipos
de datos clásicos o clases usa tipos de datos genéricos.
27
Paso siguiente es implementar las interfaces con la logica propia de cada caso:
28
29
30
31
3.4 Vistas Preliminares
La vista preliminar consta de algunas plantillas para las ventanas principales del sistema,
en base a HTML y Thymeleaf sin CSS, JavaScript ni Bootstrap, solo a modo de
previsualización de la interacción de la capa de presentación o GUI y para una mejor
comprensión de las clases de controlador.
Cabe recalcar que en una aplicación WEB-MVC las vistas (Plantillas Thymeleaf) se crean
dentro de la carpeta “src/main/resources/templates”, por lo tanto, dentro de ella, vamos
a crear el archivo “index.html” (ventana principal del sistema) y las carpetas “alumno”,
“docente”, “curso”, “nota”; así mismo dentro de la carpeta “docente” crearemos los
archivos “docenteIndex.html” y “docenteForm.html”.
32
Quedaría inicialmente así:
El código Thymeleaf para la ventana principal “index.html” (carga por defecto) seria:
33
Cuando el usuario hace clic en “Registrar Docente” en realidad hace una petición tipo GET
a la aplicación, la petición seria “/docente/index” esa petición será atendida por el
FrontController de Spring, quien lo derivará al controlador DocenteController.Java que
en última instancia procesará la petición. Este controlador se creará luego y su código se
mostrará en la siguiente sección; sin embargo, como se verá más adelante, este
controlador responde la petición devolviendo la plantilla “docenteIndex.html” para ser
renderizada, generando el código HTML que será devuelto al usuario. A continuación, se
muestra el código de la plantilla Thymeleaf “docenteIndex.html”:
34
Como ya se ha mencionado, el código mostrado no contempla temas de diseño web,
dicha funcionalidad se añadirá posteriormente en la versión final de la plantilla a través
de Bootstrap y otros, si se ha incluido la funcionalidad necesaria para mostrar los datos
provenientes de PostgreSQL.
Los datos provenientes de PostgreSQL son enviados a la vista por el controlador mediante
el modelo. Los datos del modelo están organizados en forma de variables que, como se
verá más adelante, son añadidas por el controlador y se agregar tantas variables como
datos se necesiten pasar del controlador a la vista que en realidad accede a las variables.
Los datos que el controlador puede agregar se conocen como atributos del modelo y cada
atributo tiene un nombre y un dato a enviar que puede ser de cualquier tipo desde un
String, Integer y Long hasta Objetos complejos e incluso listas de objetos.
El motor de plantillas Thymeleaf (la vista) accede a las variables con la sintaxis ${variable},
tal como se muestra en la línea 30 de “docenteIndex.html”, donde los datos de los
docentes se obtienen de la variable ${listaDocentes} que contiene la lista de docentes,
dicha lista se recorre con la directiva th:each (línea 30) y cada elemento de la lista es
accedido con la variable docente, luego Thymeleaf crea dinámicamente una fila <TR> por
cada elemento de la lista, mostrando los datos de cada docente en una celda <TD> usando
la variable ${docente} y la propiedad respectiva (líneas desde 31 hasta 38).
35
Ahora se muestra el código del formulario de ingreso de datos “docenteForm.html”:
36
En la línea 7 se declara el formulario para el envío de datos, hay tres cosas importantes:
la primera es la directiva th:object="${docente}" que establece que los controles del
formulario trabajarán con los atributos del objeto docente; la segunda es la directiva
th:action="@{/docente/nuevo}" que indica la ruta del requerimiento donde se
procesarán los datos; y la tercera es la directiva th:method="post" que indica el tipo de
petición del requerimento.
Cuando el usuario hace clic en el botón <Guardar> los datos ingresados en los controles
se asignan a los atributos respectivos del objeto docente y el objeto como tal se envía
como parte de la petición, ya se dijo anteriormente que esta petición es de tipo POST, eso
quiere decir que en el controlador “DocenteController” debe haber un método
mapeando la ruta “/docente/nuevo” por el método POST, es decir debe estar marcado
con la anotación @PostMapping (“/docente/nuevo”)., tal como se mostrará más
adelante en el bloque correspondiente a las clases del Package Controller.
37
Ingresamos los siguientes datos:
Para tal efecto crearemos la carpeta “_frag”, dentro de ella la plantilla “base.html” para
los fragmentos “site-head”, “site-header” y plantilla “Inputs.html” para fragmentos
parametrizados de INPUTs HTML para nuestros formularios. La finalidad de ambas
plantillas es reutilizar código HTML.
38
A continuación, se muestran las plantillas y sus fragmentos mencionados:
Plantilla Base.html, con fragmento para los “head” y “header” de las GUI:
Plantilla Inputs.html con fragmento iHTML con parámetros para controles de formularios:
El fragmento llamado iHtml tiene cuatro parámetros: tipo para especificar el tipo de
control HTML (Text, Date, number, etc.), label para establecer la etiqueta del control, ph
para especificar el placeholder del control (cuando corresponda) y campo para identificar
el atributo asociado al control. Estos parámetros se acceden como si fueran variables es
decir con la sintaxis ${nombre_variable}.
39
Plantilla index.html
Plantilla “cursoIndex.html”:
40
Plantilla “cursoForm.html”:
41
Clic en “Agregar Curso”:
42
A continuación, las plantillas de Registro de Alumnos: alumnoIndex.html y
alumnoForm.html.
Plantilla “alumnoIndex.html”:
43
Plantilla “alumnoForm.html”:
44
Hacemos clic en “Agregar Alumno”:
45
Hacemos clic en el enlace “matricular” y nos aparecerá:
46
3.5 Paquete Controlador
A continuación, se muestra el controlador “DocenteController.JAVA”:
47
Ahora del controlador “CursoController.JAVA”:
48
Controlador “AlumnoController.JAVA”:
49
Para “NotaController.java” primero debemos actualizar “NotaRepository.java”,
“NotaService.java” y “NotaServiceImpl.java”:
50
51