Solución ejercicio autores

Controlador

package com.trifulcas.SpringBootVistas.controller;

import java.util.List;

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

import com.trifulcas.SpringBootVistas.model.Autor;
import com.trifulcas.SpringBootVistas.repository.AutorRepository;

// La anotación nos indica que es un controlador normal, que requerirá una vista
@Controller
// Nos indica la ruta de entrada general a este controlador
@RequestMapping("/autor")
public class AutorController {

	// Necesitamos acceder a los datos por lo tanto creamos el repositorio
	// el autowired nos hace inyección de dependencia automática
	@Autowired
	AutorRepository autorRepository;

	// Aquí especificamos que accedemos vía get
	@GetMapping("")
	// Pongo el parámetro Model que nos permita pasar datos a la vista
	public String getAutores(Model model) {
		try {
			// Obtengo los datos como en la API rest
			List<Autor> autores = autorRepository.findAll();
			// Paso la información a la vista vía model
			// La vista tendrá una variable 'autores' con la lista de autores
			model.addAttribute("autores", autores);
			// Le digo que me cargue la vista 'autores' la buscará en templates
			return "autores";
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
			return "error";
		}
	}

	// Mapeo que me pasen un parámetro id
	@GetMapping("/{id}")
	// Tengo el parámetro id que me pasan y el model para pasar datos a la vista
	public String getAutor(Model model, @PathVariable Integer id) {
		try {
			// Recupero el autor
			Autor autor = autorRepository.findById(id).orElse(null);
			if (autor != null) {
				// Lo paso a la vista
				model.addAttribute("autor", autor);
				// Devuelvo la vista
				return "autor";
			} else {
				// Me he creado una vista para mostrar un error
				return "error";
			}
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
			return "error";
		}
	}
}

Plantilla autores

<!DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8">
	<title>Lista de autores</title>
	<!-- Latest compiled and minified CSS -->
	<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">

	<!-- Latest compiled JavaScript -->
	<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>

</head>

<body>
<h2>Autores</h2>
<!-- El th:each es como un bucle foreach, en este caso le estamos diciendo 
que recorra la variable autores y lo guarde en una variable llamada autor
	-->
	<div class="card w-50" th:each="autor: ${autores}">
		<!-- Si yo estoy guardando cada elemento en una variable llamada 'autor'
		puedo acceder a sus propiedades y mostrarlas
		Pongo un enlace al detalle del autor -->
		<div class="card-header"><a class="btn btn-primary"
									th:href="@{/autor/{id}(id=${autor.idautor})}"><span th:text="${autor.idautor}"></span></a></div>
		<!--
			Cuando accedemos a la propiedad nombre spring boot busca el getter
			Es decir, intentará acceder a getNombre() -->
		<div class="card-body"><span th:text="${autor.nombre}"></span></div>
	</div>
</body>

</html>

Plantilla autor

<!DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8">
	<title>Autor</title>
	<!-- Latest compiled and minified CSS -->
	<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">

	<!-- Latest compiled JavaScript -->
	<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>

</head>

<body>
<h2>Autor</h2>
<!-- El th:each es como un bucle foreach, en este caso le estamos diciendo 
que recorra la variable autores y lo guarde en una variable llamada autor
	-->
	<div class="card w-50">
		<!-- Si yo estoy guardando cada elemento en una variable llamada 'autor'
		puedo acceder a sus propiedades y mostrarlas -->
		<div class="card-header"><span th:text="${autor.idautor}"></span></div>
		<!--
			Cuando accedemos a la propiedad nombre spring boot busca el getter
			Es decir, intentará acceder a getNombre() -->
		<div class="card-body"><span th:text="${autor.nombre}"></span></div>
	</div>
	<table class="table table-striped">
    <thead>
      <tr>
        <th>Id</th>
        <th>Titulo</th>
        <th>Páginas</th>
      </tr>
    </thead>
    <tbody>
		<!-- Puedo acceder a la propiedad libros porque mi entidad autor
		tiene un getLibros() que me devuelve los libros y los recorro con el each -->
      <tr th:each="libro: ${autor.libros}">
        <td><span th:text="${libro.idlibro}"></span></td>
         <td><span th:text="${libro.titulo}"></span></td>
       <td><span th:text="${libro.paginas}"></span></td>
    
      </tr>
     
    </tbody>
  </table>
  	<a class="btn btn-primary" th:href="@{/autor}">Ir al índice</a>

</body>

</html>

Plantilla error

<!DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8">
	<title>Error</title>
	<!-- Latest compiled and minified CSS -->
	<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">

	<!-- Latest compiled JavaScript -->
	<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>

</head>

<body>
	<div class="alert alert-danger">
		<strong>Error</strong> La petición ha generado un error.
	</div>
	<!-- Creo un enlace con th:href en principio me calcula la ruta adecuada -->
	<a class="btn btn-primary" th:href="@{/autor}">Ir al índice</a>
</body>

</html>

Publicado por

Juan Pablo Fuentes

Formador de programación y bases de datos