Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.
Nota importantísima. Toda la estructura de paquetes de SpringBoot debe colgar de un paquete base que hemos definido en el initializer de la lección anterior. Si creamos clases que esten en un paquete que no es hijo del paquete base, el código no funcionará.
Configuración básica
Vista
./src/main/webapp/index.html
<form action="/createPersona">
<input type="text" name="nombre">
<input type="submit" value="Alta">
</form>
Descargar Proyecto Controlador
com.pablomonteserin.prueba.controller.PersonaController
@Controller
public class PersonaController {
@Autowired
private PersonaRepository personaRepository;
// @PostMapping("/createPersona")
@GetMapping("/createPersona")
public String indexGET(@ModelAttribute("persona") Persona persona) throws IOException {
personaRepository.save(persona);
return "forward:/index.html";
}
}
Conexión a la base de datos
com.pablomonteserin.prueba.application.properties
#debug=true
#server.port=8080
#spring.mail.host=smtp.gmail.com
#spring.mail.username=
spring.datasource.url=jdbc:mysql://localhost:3306/persona?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=update
Modelo
com.pablomonteserin.prueba.persistence.repository.PersonaRepository
public interface PersonaRepository extends CrudRepository<Persona, Integer> {
}
Redireccionando desde un método del controlador a otro método del controlador
@GetMapping("/")
public String selectLibros(Model model) {
// ...
return "consulta";
}
@GetMapping("/create-libro")
public String createLibro(@ModelAttribute("libro") Libro libro) {
// ...
return "redirect:/";
}
Añadiendo la clase Servicio para la lógica de negocio
com.pablomonteserin.prueba.services.PersonaService
public interface PersonaService {
void save(Persona persona);
}
com.pablomonteserin.prueba.services.impl.PersonaServiceImpl
//@Transactional
@Service
public class PersonaServiceImpl implements PersonaService {
@Autowired
private PersonaRepository personaRepository;
@Override
public void save(Persona persona) {
personaRepository.save(persona);
}
}
Usando Thymeleaf
Cuando estamos en fase de desarrollo, probablemente querramos desactivar la caché de thymeleaf para que los cambios en los HTML se actualicen automáticamnte.
src/main/resources/application.properties
spring.thymeleaf.cache=false
Si quieres que un método del controlador no cargue una plantilla de thymeleaf y redireccione directamente a un html ubicado en webapp, usaremos:
return "forward:index.html";
Cargar una imagen
Las imágenes deben estar ubicadas en la carpeta src/main/resources/static.
Carga de una imagen proveniente de una variable dinámica y ubicada en la raíz del servidor:
<img th:src="@{|${equipo.foto_escudo}}|" />
Recuperando datos
Recuperando un parámetro de un enlace del tipo https://example.com/equipo/5
<a th:href="@{|/equipo/${equipo.equipo_cod}|}">
@GetMapping("/equipo/{equipo_cod}")
public String selectEquipo(@PathVariable Integer equipo_cod, Model model) {
// ...
return "equipo";
}
Recuperando parámetros de un formulario enviado por get
public String createPaciente(@RequestParam("nombre") String nombre, @RequestParam("apellidos") String apellidos,
@RequestParam("fecha_alta") String fechaAlta) {
Leer una colección de datos en la vista
com.pablomonteserin.prueba.controller
@GetMapping("/consultaInvitados")
public String selectInvitados( Model model) {
List<Invitado> invitados = invitadoRepository.findAll();
model.addAttribute("invitados", invitados);
return "consulta";
}
src/main/resources/templates/consulta.html
<div th:each="invitado : ${invitados}">
<td th:text="${invitado.id}"></td>
<td th:text="${invitado.nombre}"></td>
<td th:text="${invitado.descripcion}"></td>
</div>
Parsear una fecha
<input type="date" name="fecha_alta" th:value="${#dates.format(paciente.fecha_alta, 'yyyy-MM-dd')}" />
Definiendo nuevos métodos en el modelo
public interface EquipoRepository extends CrudRepository<Equipo, Integer> {
@Query("SELECT e FROM Equipo e WHERE e.equipo_cod=:id")
Equipo findEquipoByEquipoCod(@Param("id")int id);
List<Equipo> findAll();
}