Thymeleaf
Thymeleaf
com/site/walidzeddini/cours
Walid ZEDDINI
Enseignant Expert J2EE – Institut supérieur d’Informatique (ISI)
Directeur de Projets IT- Tunisie TradeNet (TTN)
[email protected]
[email protected]
Contenu
Qu’est ce que Thymeleaf
Le dialecte SpringStandard
Le formulaire:
• Gestion de l'objet de commande
• Input/entrée
Walid ZEDDINI, Programmation Web Avancée
Préalables
Programmation Orientée Objet (Java)
Initiation aux Technologies Web (Html / Css / JavaScript)
Technologies internet 2
02/12/2019
Préface
NOTA
Il est important de noter que Thymeleaf possède des intégrations pour les versions
3.x et 4.x du Framework Spring, fournies par deux bibliothèques distinctes appelées
thymeleaf-spring3 et thymeleaf-spring4.
Ces bibliothèques sont regroupées dans des fichiers .jar distincts (thymeleaf-
spring3- {version} .jar et thymeleaf-spring4- {version} .jar) et doivent être ajoutées à
votre chemin de classe (classpath) pour pouvoir utiliser les intégrations Spring de
Thymeleaf dans votre application.
Walid ZEDDINI, Programmation Web Avancée
3
02/12/2019
Qu’est ce que Thymeleaf
Thymeleaf propose un ensemble d’intégrations Spring qui vous permettent de
l’utiliser comme substitut complet du logiciel JSP dans les applications Spring MVC.
Transférer les méthodes mappées de vos objets Spring MVC @Controller vers
les modèles gérés par Thymeleaf, exactement comme vous le faites avec les
JSP.
Utilisez Spring Expression Language (Spring EL) au lieu de OGNL dans vos
Walid ZEDDINI, Programmation Web Avancée
modèles.
Créer des formulaires dans vos modèles qui soient complètement intégrés à
vos beans de sauvegarde de formulaire et à vos liaisons de résultats, y compris
l'utilisation d'éditeurs de propriétés, de services de conversion et du
traitement des erreurs de validation.
Notez que pour bien comprendre ce chapitre, vous devez d'abord avoir suivi les
chapitres précédents relatives au Framework Spring.
4
Spring
Le dialecte SpringStandard
Afin de réaliser une meilleure intégration et plus facile, Thymeleaf fournit un dialecte qui
implémente spécifiquement toutes les fonctionnalités nécessaires pour fonctionner
correctement avec Spring.
Ce dialecte spécifique est basé sur le dialecte standard Thymeleaf et est implémenté
dans une classe appelée org.thymeleaf.spring4.dialect.SpringStandardDialect, qui
Walid ZEDDINI, Programmation Web Avancée
Outre toutes les fonctionnalités déjà présentes dans le dialecte standard - et donc
héritées -, le dialect SpringStandard introduit les fonctionnalités spécifiques suivantes:
Utilisez Spring Expression Language (Spring EL) comme langage d’expression
variable au lieu de OGNL. Par conséquent, toutes les expressions $ {...} et * {...}
seront évaluées par le moteur de Spring Expression Language.
Nouvelles DTD pour la validation, y compris ces nouveaux attributs, ainsi que les
nouvelles règles de traduction DOCTYPE correspondantes.
02/12/2019 7
Le formulaire
Gestion de l'objet de commande
L'objet de commande est le nom que Spring MVC donne aux beans de sauvegarde de
formulaire ( form-backing beans):
Walid ZEDDINI, Programmation Web Avancée
C'est-à-dire aux objets qui modélisent les champs d'un formulaire et fournissent des
méthodes de lecture et de définition (getter et setter) qui seront utilisées par le framework
pour établir et obtenir les valeurs saisies par l'utilisateur dans le navigateur.
02/12/2019 8
Le formulaire
Gestion de l'objet de commande
Ceci est cohérent avec d’autres utilisations de th: object,
Les valeurs pour les attributs th: object dans les balises de formulaire doivent
être des expressions variables ($ {...}) spécifiant uniquement le nom d'un
attribut de modèle, sans navigation de propriété. Cela signifie qu'une expression
comme $ {produitForm} est valide, mais que $ {produitForm.puProduit} ne le
serait pas.
Une fois dans la balise <form>, aucun autre attribut th: object ne peut être
spécifié. Cela est cohérent avec le fait que les formulaires HTML ne peuvent
pas être imbriqués.
02/12/2019 9
Le formulaire
Input/entrée
Voyons maintenant comment ajouter une entrée à notre formulaire:
Comme vous pouvez le constater, nous introduisons ici un nouvel attribut th:field. Il
s’agit d’une fonctionnalité très importante pour l’intégration de Spring MVC, car elle
permet de lier votre entrée à une propriété du bean de sauvegarde de formulaire.
Vous pouvez le voir comme un équivalent de l’attribut path dans une balise de la
bibliothèque de balises JSP de Spring MVC.
L'attribut th:field se comporte différemment selon qu'il est associé à une balise
<input>, <select> ou <textarea> (et également en fonction du type spécifique de
balise <input>).
02/12/2019 10
Le formulaire
Input / entrée
<input type="text" id="puProduit" name="puProduit" th:value="*{puProduit}" />
Les valeurs des attributs th:field doivent être des expressions de sélection * {...}
Walid ZEDDINI, Programmation Web Avancée
Ce qui est logique étant donné qu'elles seront évaluées sur le bean de sauvegarde de
formulaire et non sur les variables de contexte (ou les attributs de modèle dans le
jargon Spring MVC).
Contrairement à celles de th:object , ces expressions peuvent inclure la navigation
dans les propriétés (toute expression autorisée pour l'attribut path d'une balise JSP
<form: input> sera autorisée ici).
Notez que th:field comprend également les nouveaux types d’élément <input>
introduits par HTML5, tels que <input type = "datetime" ... />, <input type = "color"
... />, etc., ajoutant effectivement compléter le support HTML5 pour Spring MVC.
02/12/2019 11
Le formulaire
Checkbox fields / Champs de case à cocher
Le th:field nous permet également de définir les entrées de case à cocher.
Voyons un exemple :
<div>
<label th:for="${#ids.next('covered')}" th:text="#{seedstarter.covered}">Covered</label>
Walid ZEDDINI, Programmation Web Avancée
<ul>
<li th:each="feat : ${allFeatures}">
<input type="checkbox" th:field="*{features}" th:value="${feat}" />
<label th:for="${#ids.prev('features')}" th:text="#{${'seedstarter.feature.' + feat}}">Heating</label>
</li>
</ul>
Notez que nous avons ajouté un attribut th:value cette fois-ci, car le champ features
n’est pas un booléen comme le fut covered, mais plutôt un tableau de valeurs.
Nous pouvons voir ici comment un suffixe de séquence est ajouté à l’attribut id de
chaque entrée et comment la fonction # ids.prev (...) nous permet de récupérer la
dernière valeur de séquence générée pour un identifiant d’entrée spécifique.
02/12/2019 14
Le formulaire
Checkbox fields / Champs de case à cocher
Ne vous inquiétez pas des entrées masquées avec name ="_features" : elles sont
automatiquement ajoutées afin d'éviter des problèmes avec les navigateurs n'envoyant
pas de valeurs de case à cocher non cochées au serveur lors de la soumission du
formulaire.
02/12/2019 15
Le formulaire
Radio Button fields / Champs du bouton radio
Les champs de boutons radio sont spécifiés d'une manière similaire aux cases à cocher
non booléennes (à valeurs multiples) - à l'exception du fait qu'elles ne sont pas à
valeurs multiples, bien sûr:
<ul>
<li th:each="ty : ${allTypes}"> <input type="radio" th:field="*{type}" th:value="${ty}" />
<label th:for="${#ids.prev('type')}" th:text="#{${'seedstarter.type.' + ty}}">Wireframe</label>
</li>
</ul>
02/12/2019 16
Le formulaire
Dropdown/List selectors: Sélection / liste déroulante
Les champs de sélection comportent deux parties: la balise <select> et ses balises
<option> imbriquées.
Lors de la création de ce type de champ, seule la balise <select> doit inclure un attribut
th:field, mais les attributs th:value des balises <option> imbriquées seront très
importants car ils permettront de connaître le type de champ (option) actuellement
sélectionnée (de la même manière que les cases à cocher et les boutons radio non
booléens).
Exemple:
<select th:field="*{type}">
<option th:each="type : ${allTypes}" th:value="${type}" th:text="#{${'seedstarter.type.' + type}}">
Wireframe</option>
</select>
18