Saltar a contenido

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}

press

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 tener th:*, 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:

<link rel="stylesheet" th:href="@{/css/styles.css}">
<script th:src="@{/js/script.js}"></script>
src/main/resources/static/css/styles.css src/main/resources/static/js/script.js

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

<header th:fragment="header">
  <!-- navbar / título / links -->
</header>
templates/fragments/footer.html
<footer th:fragment="footer">
  <!-- info / copyright -->
</footer>

5.2 Reutilizarlos en cada vista

templates/fragments/views/entities.html

<div th:replace="~{fragments/header :: header}"></div>

<main>
  <!-- contenido propio de entities -->
</main>

<div th:replace="~{fragments/footer :: footer}"></div>