# Thymeleaf

Thymeleaf es una biblioteca Java que implementa un motor de plantillas de XML/XHTML/HTML5 (también extensible a otros formatos) que puede ser utilizado tanto en modo web como en otros entornos no web. Se acopla muy bien para trabajar en la capa vista del MVC de aplicaciones web, pero puede procesar cualquier archivo XML, incluso en entornos desconectados.
Proporciona un módulo opcional para la integración con Spring MVC, por lo que se puede utilizar para reemplazar completamente a los archivos JSP en tus aplicaciones construidas con esta tecnología.
El objetivo principal de Thymeleaf es permitir la creación de plantillas de una manera elegante y un código bien formateado. Sus dialectos Standard y SpringStandard permiten crear potentes plantillas naturales que se pueden visualizar correctamente en los navegadores de Internet, por lo que también funcionan como prototipos estáticos. Thymeleaf también puede extenderse desarrollando tus propios dialectos.

## Características

Las características que se visualizan en el página web del proyecto son:

### Características importantes

* Motor de plantillas Java para XML, XHTML y HTML5. Extensible para otros formatos.
* Trabaja en entornos web y no web (desconectados). No existe dependencia fuerte con el API Servlet.
* Basado en conjunto de características modulares llamadas Dialectos.
** Las características del Dialecto (por ejemplo: evaluación, iteración, etc.) son aplicadas para relacionarlos con las etiquetas de las plantillas y/o atributos.
** Dos dialectos disponibles listos para ser utilizados: Standard y SpringStandard (para aplicaciones Spring MVC, la misma sintaxis que para Standard).
** Los desarrolladores pueden extender y crear sus dialectos personalizados.
* Muchas plantillas listas para ser utilizadas (extensibles):
** XML: validando otra vez o no un DTD.
** XHTML 1.0 y 1.1: validando otra vez o no el estándar DTD.
** HTML5: código XML y basado en HTML5. El código no XML es automáticamente eliminado y convertido en formato XML.
* Soporte completo (y extensible) a la internacionalización.
* Configurable, alto rendimiento del caché del analizador de plantillas que reduce al mínimo las entradas/salidas.
* Traducción automática DOCTYPE —de plantilla DTD a resultado DTD— para validaciones (opcional) de plantillas y código resultante.
* Extremadamente extensible: puede ser utilizado como un framework de motor de plantillas si es necesario.
* Documentación completa incluyendo varias aplicaciones de ejemplo.

### Dialectos Standard y SpringStandard

* Soporta XML, XHTML 1.0, XHTML 1.1 y HTML5.
* Sustituye completamente tecnologías de la capa vista tales como JSP.
* Fácil de usar, sintaxis elegante basada solamente en atributos (estos dialectos incluyen no-etiquetas).
** Magnífico para plantillas web: <input type="text" th:field="*{name}" /> en vez de <mylib:text field="name" />.
* Plantilla natural para un prototipado fácil: puedes visualizar tus plantillas estáticas en un navegador (sin que tenga que estar corriendo en un servidor).
* Evaluación de expresiones: OGNL (Standard) y Spring Expression Language (SpringStandard).
* Integración completa con Spring MVC (SpringStandard): form binding, editor de propiedades, internacionalización, etc.
* Soporte para Spring WebFlow support (incluye eventos AJAX).
* Lógica de plantilla con todas las características: iteración, evaluación condicional, contexto de la declaración de la variable, etc.
* Muchas opciones para la capa (patrón Composite View):
** Un mecanismo incorporado (inclusión de fragmento nativo de Thymeleaf).
** Integración con Specific Apache Tiles (a través de paquetes extras).
** Puede ser utilizado junto con SiteMesh.
* Soporte de internacionalización: fácil inclusión de mensajes externos dentro de las plantillas.
* Capacidad de reescritura de URL para agregar información de contexto y sesión a las direcciones URL.
* JavaScript y Dart inlining: evaluación inteligente de expresiones de código JavaScript/Dart.
* Soporte de validación de plantillas para XML, XHTML 1.0 y XHTML 1.1.

## Ejemplo

El siguiente ejemplo produce una tabla HTML5 con registros por cada elemento de una variable List<Producto> llamada listaProductos.
Esta pieza de código incluye:
* Expresiones de internacionalización: #{ ... }
* Expresiones de evaluación Variable/model-attribute: ${ ... }
* Funciones: #numbers.formatDecimal( ... )
Además, este fragmento de código (X)HTML puede ser visualizado perfectamente desde un navegador de Internet como un prototipo, sin haber ejecutado la aplicación completa: a esto se le llama una plantilla natural.