Guia SpringBoot Parte3 PDF
Guia SpringBoot Parte3 PDF
use DAA2;
CREATE TABLE `Categoria` (
`cod_cat` int(11) NOT NULL AUTO_INCREMENT,
`des_cat` varchar(255) NOT NULL,
PRIMARY KEY (`cod_cat`)
);
CREATE TABLE `Curso` (
`cod_cur` int(11) NOT NULL AUTO_INCREMENT,
`nom_cur` varchar(255) NOT NULL,
`cat_cur` int(11) NOT NULL,
PRIMARY KEY (`cod_cur`),
FOREIGN KEY (`cat_cur` ) REFERENCES `Categoria` (`cod_cat`)
);
Creación de la plantilla
<!DOCTYPE html>’
<html xmlns:th="http://www.thymeleaf.org">
<head th:fraget="head">
<meta charset="utf-8">
<title>Desarrollo Avanzado de Aplicaciones 2</title>
<link rel="stylesheet" th:href="@{/css/bootstrap.css}">
<script type="text/javascript" th:src="@{/js/script.js}"></script>
</head>
<body>
<header th:fragment="header">
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<a class="navbar-brand" href="#">Navbar</a>
<button class="navbar-toggler" type="button" data-toggle="collapse"
data-target="#navbarSupportedContent" aria-
controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav mr-auto">
<li class="nav-item">
<a class="nav-item nav-link" th:href="@{/alumno/}">Alumnos</a>
</li>
<li class="nav-item">
<a class="nav-item nav-link" th:href="@{/curso/}">Cursos</a>
</li>
<li class="nav-item">
<a class="nav-item nav-link" th:href="@{#}">Categorías</a>
</li>
</ul>
</div>
</nav>
</header>
<div class="container">
</div>
</footer>
</body>
</html>
Página “listarAlumnos.html”
Corrección de acentos
10. En el “Package Explorer” hacer click derecho sobre la página
“listarAlumnos.html”
11. En “Text file encoding” marcar “Other”, seleccionar “UTF-8”, click en
“Apply and Close” y finalmente aceptar el mensaje de confirmación.
Estructurar el proyecto
Creación de la carpeta “Views”
16. Crear la capeta “views” dentro de la carpeta “templates”
f. En el método eliminarAlumno
reemplazar return "redirect:/listar";
por return "redirect:/alumno/";
http://localhost:8080/alumno/
CRUD Curso
26. En el paquete com.daa2.spring.model crear la clase “Categoria” con
los siguientes atributos:
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="categoria")
public class Categoria {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int cod_cat;
private String des_cat;
public Categoria() {
}
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name="curso")
public class Curso {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int cod_cur;
private String nom_cur;
@ManyToOne
@JoinColumn(name="cat_cur")
private Categoria categoria;
public Curso() {
}
public Curso(int cod_cur, String nom_cur, Categoria categoria) {
super();
this.cod_cur = cod_cur;
this.nom_cur = nom_cur;
this.categoria = categoria;
}
package com.daa2.spring.interfaces;
import org.springframework.data.repository.CrudRepository;
import com.daa2.spring.model.Categoria;
package com.daa2.spring.interfaces;
import org.springframework.data.repository.CrudRepository;
import com.daa2.spring.model.Curso;
import java.util.List;
import com.daa2.spring.model.Categoria;
package com.daa2.spring.interfacesservice;
import java.util.List;
import java.util.Optional;
import com.daa2.spring.model.Curso;
package com.daa2.spring.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.daa2.spring.interfaces.ICategoria;
import com.daa2.spring.interfacesservice.ICategoriaService;
import com.daa2.spring.model.Categoria;
@Service
public class CategoriaService implements ICategoriaService {
@Autowired
private ICategoria cat;
@Override
public List<Categoria> listarCategorias() {
return (List<Categoria>) cat.findAll();
}
import java.util.List;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.daa2.spring.interfaces.ICurso;
import com.daa2.spring.interfacesservice.ICursoService;
import com.daa2.spring.model.Curso;
@Service
public class CursoService implements ICursoService {
@Autowired
private ICurso cur;
@Override
public List<Curso> listarCursos() {
return (List<Curso>) cur.findAll();
}
@Override
public int grabarCurso(Curso pCurso) {
int res=0;
Curso curso = cur.save(pCurso);
if (!curso.equals(null)) {
res=1;
}
return res;
}
@Override
public Optional<Curso> cursoPorCodigo(int cod) {
return cur.findById(cod);
}
@Override
public void eliminarCurso(int cod) {
cur.deleteById(cod);
}
package com.daa2.spring.controller;
import java.util.List;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.daa2.spring.interfacesservice.ICursoService;
import com.daa2.spring.interfacesservice.ICategoriaService;
import com.daa2.spring.model.Curso;
import com.daa2.spring.model.Categoria;
@Controller
@RequestMapping("/curso")
public class CursoController {
@Autowired
private ICursoService servicio;
@Autowired
private ICategoriaService catservicio;
@GetMapping("/")
public String listar(Model model) {
List<Curso> cursos = servicio.listarCursos();
model.addAttribute("cursos", cursos);
return "/views/curso/listarCursos";
}
@GetMapping("/nuevoCurso")
public String nuevoCurso(Model model) {
List<Categoria> categorias = catservicio.listarCategorias();
model.addAttribute("curso", new Curso());
model.addAttribute("categorias", categorias);
return "/views/curso/formCursoNuevo";
}
@PostMapping("/grabarCurso")
public String grabarCurso(@Validated @ModelAttribute Curso pCurso) {
servicio.grabarCurso(pCurso);
return "redirect:/curso/";
}
@GetMapping("/editarCurso/{codigo}")
public String editarCurso(@PathVariable int codigo, Model model) {
List<Categoria> categorias = catservicio.listarCategorias();
Optional<Curso> c = servicio.cursoPorCodigo(codigo);
model.addAttribute("curso", c);
model.addAttribute("categorias", categorias);
return "/views/curso/formCursoEditar";
}
@GetMapping("/eliminarCurso/{codigo}")
public String delete(@PathVariable int codigo, Model model) {
servicio.eliminarCurso(codigo);
return "redirect:/curso/";
}
}
Front-end
37. En la carpeta “views” crear la carpeta “curso”
38. En la carpeta curso crear la página “listarCursos.html” y copiar lo
siguiente:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="layout/layout :: head"></head>
<body>
<header th:replace="layout/layout :: header"></header>
<div class="container">
<h1><center>Listado de Cursos</center></h1>
<a th:href="@{/curso/nuevoCurso}" >Nuevo</a>
<table class="table table-striped">
<thead>
<th>Codigo</th>
<th>Nombres</th>
<th>Categoria</th>
<th></th>
</thead>
<tbody>
<tr th:each="curso:${cursos}">
<td th:text="${curso.cod_cur}"></td>
<td th:text="${curso.nom_cur}"></td>
<td th:text="${curso.categoria.des_cat}"></td>
<td>
<a
th:href="@{/curso/editarCurso/}+${curso.cod_cur}">Editar</a>
<a
th:href="@{/curso/eliminarCurso/}+${curso.cod_cur}">Eliminar</a>
</td>
</tr>
</tbody>
</table>
</div>
<footer th:replace="layout/layout :: footer">
</footer>
</body>
</html>
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="layout/layout :: head"></head>
<body>
<header th:replace="layout/layout :: header"></header>
<main class="container">
<form th:action="@{/curso/grabarCurso}" th:object=${curso}
method="post" id="formCurso">
<section class="card">
<div class="card-header">
<h3>Nuevo Curso</h3>
</div>
<div class="card-body">
<div class="form-group">
<label>Nombre</label>
<input th:field="*{nom_cur}"
id="txtNombre" type="text" class="form-control">
<small class="form-text text-
danger" th:if="${#fields.hasErrors('nom_cur')}"
th:errors="*{nom_cur}">
</small>
</div>
<div class="form-group">
<label>Categoria</label>
<select th:field="*{categoria}"
id="cboCategoria" class="form-control">
<option
th:each="categoria:${categorias}"
th:value="${categoria.cod_cat}"
th:text="${categoria.des_cat}"
/>
</select>
</div>
</div>
<div class="card-footer">
<input type="submit" value="Guardar"
class="btn btn-primary">
<input type="button" value="Cancelar"
onclick="cancelarCurso()" class="btn btn-danger">
</div>
</section>
</form>
</main>
<footer th:replace="layout/layout :: footer">
</footer>
</body>
</html>
th:value="${categoria.cod_cat}"
th:text="${categoria.des_cat}"
/>
</select>
</div>
</div>
<div class="card-footer">
<input type="submit" value="Guardar"
class="btn btn-primary">
<input type="button" value="Cancelar"
onclick="cancelarCurso()" class="btn btn-danger">
</div>
</section>
</form>
</main>
<footer th:replace="layout/layout :: footer">
</footer>
</body>
</html>
Por: