Travailler avec des fragments de thymeleaf
1. Vue d'ensemble
Dans ce didacticiel, nous allons montrer commentmake use of Thymeleaf Fragments to reuse some common parts of a site. Après avoir configuré un projet Spring MVC très simple, nous nous concentrerons sur les vues.
Si vous êtes nouveau sur Thymeleaf, vous pouvez consulter d'autres articles sur ce site commethis introduction, ainsi quethis one about the 3.0 version du moteur.
2. Dépendances Maven
Nous aurons besoin de quelques dépendances pour activer Thymeleaf:
org.thymeleaf
thymeleaf
3.0.9.RELEASE
org.thymeleaf
thymeleaf-spring5
3.0.9.RELEASE
La dernière version dethymeleaf etthymeleaf-spring5 est disponible sur Maven Central.
3. Projet de printemps
3.1. Configuration Spring MVC
Pour activer Thymeleaf et définir le suffixe du modèle, nous avons besoin deconfigure MVC with a view resolver and template resolver.
Nous allons également définir le répertoire de certaines ressources statiques:
@Bean
public ViewResolver htmlViewResolver() {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(templateEngine(htmlTemplateResolver()));
resolver.setContentType("text/html");
resolver.setCharacterEncoding("UTF-8");
resolver.setViewNames(ArrayUtil.array("*.html"));
return resolver;
}
private ITemplateResolver htmlTemplateResolver() {
SpringResourceTemplateResolver resolver
= new SpringResourceTemplateResolver();
resolver.setApplicationContext(applicationContext);
resolver.setPrefix("/WEB-INF/views/");
resolver.setCacheable(false);
resolver.setTemplateMode(TemplateMode.HTML);
return resolver;
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**", "/css/**")
.addResourceLocations("/WEB-INF/resources/", "/WEB-INF/css/");
}
Notez que si nous utilisons Spring Boot, cette configuration peut ne pas être nécessaire, sauf si nous devons appliquer nos propres personnalisations.
3.2. Le controlle
Dans ce cas, le contrôleur n'est qu'un véhicule pour les vues. Chaque vue présente un scénario d'utilisation de fragment différent.
Le dernier charge certaines données transmises par le modèle à afficher dans la vue:
@Controller
public class FragmentsController {
@GetMapping("/fragments")
public String getHome() {
return "fragments.html";
}
@GetMapping("/markup")
public String markupPage() {
return "markup.html";
}
@GetMapping("/params")
public String paramsPage() {
return "params.html";
}
@GetMapping("/other")
public String otherPage(Model model) {
model.addAttribute("data", StudentUtils.buildStudents());
return "other.html";
}
}
Note that the view names must contain the “.html” suffix because of the way we configured our resolver. Nous allons également spécifier le suffixe lorsque nous nous référons aux noms de fragments.
4. Les vues
4.1. Inclusion de fragments simples
Tout d’abord, nous utiliserons la réutilisation des parties communes dans nos pages.
Nous pouvons définir ces parties sous forme de fragments, soit dans des fichiers isolés, soit dans une page commune. Dans ce projet, ces pièces réutilisables sont définies dans un dossier nomméfragments.
Il existe trois méthodes de base pour inclure du contenu à partir d'un fragment:
-
insert – insère du contenu dans la balise
-
replace – remplace la balise courante par la balise définissant le fragment
-
include – ceci est obsolète mais il peut toujours apparaître dans un ancien code
L'exemple suivant,fragments.html, montre l'utilisation des trois méthodes. Ce modèle Thymeleaf ajoute des fragments dans la tête et le corps du document:
Thymeleaf Fragments: home
Go to the next page to see fragments in action
Now, let’s take a look at a page that holds some fragments. Cela s'appellegeneral.html, et c'est comme une page entière avec certaines parties définies comme des fragments prêts à être utilisés:
Thymeleaf Fragments sample
Go to the next page to see fragments in action
This is another sidebar
La section<head> contient juste une feuille de style, mais nous pourrions appliquer d'autres outils tels que Bootstrap, jQuery ou Foundation, soit directement, soit à l'aide de Webjars.
Notez que toutes les balises réutilisables de ce modèle ont l'attributth:fragment, mais nous verrons ensuite comment inclure toute autre partie de la page.
Après le rendu et l'inclusion des fragments, le contenu renvoyé est le suivant:
Thymeleaf Fragments: home
Thymeleaf Fragments sample
Go to the next page to see fragments in action
4.2. Sélecteurs de balisage pour les fragments
L'un des grands avantages des fragments Thymeleaf est quewe can also grab any part of a template just using the simple selectors, via des classes, des identifiants ou simplement des balises.
Cette page, par exemple, comprend certains composants du fichiergeneral.html: un blocaside et le blocdiv.another:
4.3. Fragments paramétrés
Nous pouvons passer des paramètres à un sfragment afin d'en changer une partie spécifique. Pour ce faire, le fragment doit être défini comme un appel de fonction, où nous devons déclarer une liste de paramètres.
Dans cet exemple, nous définissons un fragment pour un champ de formulaire générique:
Et voici une utilisation simple de ce fragment où nous lui passons des paramètres:
Et voici à quoi ressemblera le champ retourné:
4.4. Expressions d'inclusion de fragments
Les fragments Thymeleaf offrent d'autres options intéressantes telles que la prise en charge deconditional expressions to determine whether to include a fragment.
En utilisant l'opérateurElvis avec l'une des expressions fournies par Thymeleaf (sécurité, chaînes et collections par exemple), nous sommes en mesure de charger différents fragments.
Par exemple, nous pouvons définir ce fragment avec du contenu que nous afficherons en fonction d’une condition donnée. Cela pourrait être un fichier contenant différents types de blocs:
Data received
No data
Et voici comment nous pourrions les charger avec une expression:
Pour en savoir plus sur les expressions Thymeleaf, consultez notre articlehere.
4.5. Dispositions flexibles
L'exemple suivant montre également deux autres utilisations intéressantes de fragments àrender a table with data. Il s'agit du fragment de table réutilisable, avec deux parties importantes: un en-tête de table pouvant être modifié et le corps où les données sont rendues:
0
Name
Lorsque nous voulons utiliser cette table, nous pouvons passer notre propre en-tête de table en utilisant la fonctionfields. L'en-tête est référencé avec la classemyFields. Le corps de la table est chargé en passant des données en tant que paramètre à la fonctiontableBody:
Id
Name
Et voici à quoi ressemblera la dernière page:
Thymeleaf Fragments sample
Data received
Id
Name
1001
John Smith
1002
Jane Williams
5. Conclusion
Dans cet article, nous avons montré comment réutiliser des composants de vue à l'aide de Thymeleaf Fragments, un outil puissant qui peut faciliter la gestion des modèles.
Nous avons également présenté d'autres fonctionnalités intéressantes qui vont au-delà des bases. Nous devrions en tenir compte lorsque nous choisissons Thymeleaf comme moteur de rendu de vue.
Si vous souhaitez en savoir plus sur les autres fonctionnalités de Thymeleaf, vous devez absolument consulter notre article surLayout Dialects.
Comme toujours, le code d'implémentation complet de l'exemple est disponibleover on GitHub.