Estructura de carpetas (Thymeleaf + Spring Boot) — Repositorio docsjaveriana/thymeleaf¶
Este proyecto es una demo con Spring Boot 3 + Thymeleaf para un “dashboard” con dos vistas principales (/dashboard/entities y /dashboard/mine) y reutilización de componentes mediante fragmentos (header/footer), además de CSS/JS servidos como recursos estáticos. :contentReference[oaicite:0]{index=0}
1. ¿Por qué existen templates/ y static/?¶
En una app Spring Boot con Thymeleaf se suelen separar los recursos así:
templates/: HTML procesado en servidor por Thymeleaf (puede tenerth:*, expresiones${...}, etc.).static/: archivos servidos tal cual (CSS, JS, imágenes). No pasan por Thymeleaf; el navegador los descarga directamente como recursos estáticos. :contentReference[oaicite:1]{index=1}
En este repositorio esa estructura está explícita así: templates/ para vistas y static/ para css/ y js/. :contentReference[oaicite:2]{index=2}
2. Estructura de carpetas del repositorio (en tabla)¶
Basado en la estructura documentada en el README del repositorio. :contentReference[oaicite:3]{index=3}
| Ruta (carpeta/archivo) | ¿Qué contiene? | ¿Para qué sirve? | Ejemplo dentro del repo |
|---|---|---|---|
src/main/java/co/javeriana/dw/thymeleaf/ |
Código Java (Spring Boot) | Arranque de la app y capas (controller/service/repositorio) | ThymeleafApplication.java, DashboardController.java, DashboardService.java :contentReference[oaicite:4]{index=4} |
src/main/resources/application.properties |
Configuración de Spring Boot | Puertos, logs, Thymeleaf, datasource, etc. | application.properties :contentReference[oaicite:5]{index=5} |
src/main/resources/templates/ |
Vistas Thymeleaf (HTML) | Renderizar páginas/plantillas desde el servidor | index.html :contentReference[oaicite:6]{index=6} |
src/main/resources/templates/fragments/ |
Fragmentos reutilizables | Reutilizar “pedazos” (header/footer) en varias páginas | header.html, footer.html :contentReference[oaicite:7]{index=7} |
src/main/resources/templates/fragments/views/ |
Vistas de la app (secciones) | Páginas específicas del dashboard | mine.html, entities.html :contentReference[oaicite:8]{index=8} |
src/main/resources/static/ |
Recursos estáticos | Publicar CSS/JS para el navegador | css/styles.css, js/script.js :contentReference[oaicite:9]{index=9} |
3. ¿Cómo se “conectan” templates/ con static/?¶
En una plantilla Thymeleaf (dentro de templates/) es común referenciar CSS/JS usando @{...} para construir rutas correctas:
4. Fragmentos en Thymeleaf: cortar/reutilizar HTML¶
Thymeleaf permite definir fragmentos (porciones reutilizables) con th:fragment, y luego “armar” páginas incluyendo esos fragmentos con th:insert o th:replace.
En este repositorio, el README indica que los componentes reutilizables (encabezado/footer) están en templates/fragments/.
Tabla de atributos clave para fragmentos (lo mínimo necesario)¶
| Atributo | Rol | ¿Cuándo usarlo? | Mini-ejemplo (aplícalo en archivos del repo) |
|---|---|---|---|
th:fragment |
Define un fragmento con nombre (opcionalmente con parámetros) | Para “marcar” un bloque como reutilizable (header, footer, menú, etc.) | En templates/fragments/header.html: <header th:fragment="header">...</header> |
th:replace |
Reemplaza el tag actual por el fragmento | Cuando el contenedor no debe existir en el HTML final (lo sustituye) | En una vista: <div th:replace="~{fragments/header :: header}"></div> |
th:insert |
Inserta el fragmento dentro del tag actual | Cuando quieres conservar el contenedor (clases/estructura) y meter el fragmento adentro | <div class="wrap" th:insert="~{fragments/footer :: footer}"></div> |
th:include (legado) |
Similar a insert, pero desaconsejado en versiones modernas |
Solo si te toca mantener código antiguo | Mejor usar th:insert |
5. Patrón recomendado para este repo (header/footer + vistas)¶
Dado que el repo separa:
Fragmentos: templates/fragments/header.html, templates/fragments/footer.html
Vistas: templates/fragments/views/mine.html, templates/fragments/views/entities.html
Un patrón típico (y académico) para mantener orden sería:
5.1 Definir fragmentos¶
templates/fragments/header.html
templates/fragments/footer.html5.2 Reutilizarlos en cada vista
templates/fragments/views/entities.html