- Écrire les templates en format
.jtedans le dossiersrc/main/views/du projet.
Exemple :src/main/views/superPage.jte
Après avoir créé un fichier .jte dans le dossier src/main/views/, on peut écrire
du HTML agrémenté de Java, avec plusieurs façons de le faire.
Fortement recommendé : Installer le plugin JTE sur IntelliJ.
Pour recevoir des objets Java du contrôleur, on utilise :
@import: Importe des classes Java (commeimporten Java justement)@param: Définit les paramètres reçus depuis le contrôleur
<!-- Importations de classes Java -->
@import fr.domotique.model.User
@import java.util.List
<!-- viewArg("utilisateur", monUser); -->
@param User utilisateur
<!-- viewArg("messages", maListe); -->
@param List<String> messages
<!-- viewArg("estConnecte", true); -->
@param boolean estConnecte = false <!-- paramètre optionnel avec valeur par défaut -->Pour cet exemple, la section peut ressembler à :
// Dans une classe qui hérite de Section
Future<Void> discussions(RoutingContext context) {
// Création d'un utilisateur
User utilisateur = new User("Jean", "jean@example.com");
// Création d'une liste de messages
List<String> messages = List.of("Bonjour", "Bonsoir", "Au revoir");
// Rendu du template avec les paramètres
return view(context, "monTemplate",
viewArg("utilisateur", utilisateur), // -> @param User utilisateur
viewArg("messages", messages), // -> @param List<String> messages
viewArg("estConnecte", true) // -> @param boolean estConnecte
);
}Pour afficher des données dans un template, on utilise ${}:
@import fr.domotique.data.User
@param User utilisateur
<p>Age: ${utilisateur.getAge()}</p> <!-- Affichage d'un int -->
<p>Actif: ${utilisateur.isActif()}</p> <!-- Affichage d'un booléen -->
<p>Email: ${utilisateur.getEmail()}</p> <!-- Affichage d'un string -->@if(utilisateur.isAdmin())
<p>Bienvenue, administrateur!</p>
@elseif(utilisateur.isPremium())
<p>Bienvenue, utilisateur premium!</p>
@else
<p>Bienvenue!</p>
@endif<!-- Boucle for classique -->
@for(Produit produit : panier.getProduits())
<li>${produit.getNom()} - ${produit.getPrix()}€</li>
@endfor
<!-- Avec var (Java 10+) -->
@for(var produit : panier.getProduits())
<li>${produit.getNom()} - ${produit.getPrix()}€</li>
@endfor
<!-- Boucle for avec compteur -->
@for(int i = 0; i < produits.size(); i++)
<li>Produit numéro ${i+1} : ${produits.get(i).getNom()}</li>
@endfor@for(var produit : panier.getProduits())
<li>${produit.nom}</li>
@else
<li>Votre panier est vide</li>
@endforLes commentaires ne sont pas inclus dans le HTML généré !
<%-- Ceci est un commentaire qui ne sera pas rendu --%>
<p>Contenu visible</p>Les templates peuvent être réutilisés et appelés depuis d'autres templates:
Dans le fichier components/produit.jte :
@import fr.domotique.model.Produit
@param Produit produit
<div class="produit">
<h3>${produit.nom}</h3>
<p>${produit.description}</p>
<span class="prix">${produit.prix}€</span>
</div>Pour l'appeler depuis un autre template:
@import fr.domotique.model.Panier
@param Panier panier
<div class="liste-produits">
@for(var produit : panier.getProduits())
@template.components.produit(produit = produit)
@endfor
</div><!-- Dans components/alert.jte -->
@param String message
@param String type = "info"
<div class="alert alert-${type}">
${message}
</div>
<!-- Utilisation -->
@template.components.alert(message = "Opération réussie")
@template.components.alert(message = "Attention!", type = "warning")Le type Content permet de passer des blocs de contenu à d'autres templates:
<!-- Dans layouts/base.jte -->
@import gg.jte.Content
@param String titre
@param Content contenu
@param Content footer = null
<!DOCTYPE html>
<html>
<head>
<title>${titre}</title>
</head>
<body>
<main>
${contenu}
</main>
@if(footer != null)
<footer>
${footer}
</footer>
@endif
</body>
</html>Utilisation:
@template.layouts.base(
titre = "Ma page d'accueil",
contenu = @`
<h1>Bienvenue sur notre site</h1>
<p>Découvrez nos produits et services.</p>
`,
footer = @`
<p>© 2023 - Ma Société</p>
`
)Déclarez des variables locales avec !{}:
!{var total = 0;}
@for(var produit : panier.getProduits())
!{total += produit.getPrix();}
<li>${produit.nom}</li>
@endfor
<p>Total: ${total}€</p>Par défaut, JTE n'échappe pas le HTML.
C'est-à-dire qu'une variable avec la valeur <b>Salut</b> sera affichée en gras.
Il faut donc faire gaffe à bien échapper le contenu des utilisateurs, sinon quelqu'un pourrait mettre du HTML malicieux.
<!-- Échappé -->
${gg.jte.html.HtmlUtils.escape(utilisateur.description)}
<!-- Non-échappé (comportement par défaut) -->
${utilisateur.descriptionHtml}!{
String greeting;
if (utilisateur.isVip()) {
greeting = "Bienvenue cher VIP!";
} else {
greeting = "Bienvenue!";
}
}
<p>${greeting}</p>