FreeMarker - Présentation

Qu'est ce que FreeMarker

FreeMarker est, comme vous l'avez deviné, un moteur de modèle. Plus spécifiquement, cet outil génère du texte à partir d'un document modèle (template FreeMarker) et de données (java, XML).

Les grands atouts de FreeMarker sont son implémentation, qui a été totalement réalisé dans le language java, et sa structure, qui permet une séparation du traitement des données et de leur représentation. Ceci le rend extrêmement adapté à la génération de page Web HTML, particulièrement dans les applications J2EE ayant une structure en MVC (Model View Controller). Au final, l'utilisation de FreeMarker permet de garder ce découpage architectural qui laisse une cassure entre la représention et le préparation des données.

Comment ça marche ?

FreeMarker est donc basé sur le concept que les designers et les programmers sont des personnes différentes lors de développement. Les designers ont la charge de créer les pages HTML, les images ou tout autre élément visuel, tandis que les programmers ont à leur charge la préparation des données qui seront afficher plus tard. De façon plus précise, les designers vont fabriquer les templates tandis que les developpers vont créer le programme java structurant l'ensemble des données.

Ce concept implique donc que lors d'une transformation, 2 éléments sources soit nécessaire :

Lors de cette transformation, le template va recevoir les données à afficher, puis va exécuter son code d'impression comme le montre le schéma suivant (principe du tampon et de l'encre). Ce code peut être composé d'un language balisaire (de type XML) fournit avec FreeMarker et que nous détaillerons par la suite.



Un développement en 2 parties

Dans cette partie, nous allons voir plus en détails quelles sont les possibiltés d'action qu'ont les 2 corps de métier définis précédemment.

La préparation des données : La partie programmer

Le programmer a donc la fonction de créer une structure d'objet java encapsulant l'ensemble des données à afficher. FreeMarker impose que cette struture soit sous forme d'arbre.

Pour une meilleur compréhension, essayons de définir la stucture de donnée suivante :


	

Map root = new HashMap(); root.put("user", "Big Joe"); Map latest = new HashMap(); root.put("latestProduct", latest); latest.put("url", "products/greenmouse.html"); latest.put("name", "green mouse");

On remarque que la construction d'une structure de ce type est relativement simple à implémenter. Pour pimenter les choses, le programmer se propose d'écrire aussi un petit programme permettant cette transformation. Pour ce faire, il dispose de l'API java fournit par FreeMarker (freemarker.jar). On constatera que sans le travail de récupération des données, l'implémentation de la transformation est implémenté en quelques lignes.

Analysons ce code de génération :

Tout d'abord, il est nécessaire de créer un objet de configuration qui stoquera l'ensemble des paramètres nécessaire à la transformation comme le répertoire où sont stoqués les fichiers templates :


	

Configuration cfg = new Configuration(); cfg.setDirectoryForTemplateLoading(new File("/where/you/store/templates")); cfg.setObjectWrapper(new DefaultObjectWrapper());

Ensuite, un objet Template est créé. C'est objet représente le template précis à appliquer :


	

Template temp = cfg.getTemplate("test.ftl");

Enfin, nous exécutions la transformation et affichons le résultat sur la sortie standard :


	

Writer out = new OutputStreamWriter(System.out); temp.process(root, out); out.flush();

L'affichage des données : La partie designer

Le designer a pour tâche la réalisation de toute la partie visible. Et pour ce faire, une seule solution, la création de fichier template FreeMarker. Voyons un exemple de ce type de fichier :


	

<html> <head> <title>Welcome!</title> </head> <body> <h1>Welcome ${user}!</h1> <p>We have these animals: <ul> <#list animals as being> <li>${being.name} for ${being.price} Euros </#list> </ul> </p> </body> </html>

Nous pouvons constater plusieurs choses :

En plus de ces fonctionnalités, nous disposons de plusieurs autres :