Pages

Thursday, August 28, 2008

Java, Moteur de template : Freemarker

Voici un moteur de template efficace : Freemarker

Le concept et de concevoir un template (un modèle contenant des "variables") :
inputTemplate.ftl :
<html>
<head>
<title>les Contacts</title>
</head>
<body>
<div>
</div>
Les contacts de ${carnet.proprietaire.prenom} ${carnet.proprietaire.nom}
<div>
<table>
<tr>
<td>nom</td>
<td>prenom</td>
</tr>
<#list carnet.lesContacts as unContact>
<tr>
<td>${unContact.nom}</td>
<td>${unContact.prenom}</td>
</tr>
</#list>
</table>
</div>
</body>
</html>
Construire une structure objet contenant les valeurs des variables à remplacer dans le template :
  Map root = new HashMap();

/* structure agenda */
Map agenda = new HashMap();
root.put("carnet", agenda);

/* structure proprietaire (dans agenda) */
Map proprietaire = new HashMap();
agenda.put("proprietaire", proprietaire);

/* remplissage de la structure proprietaire */
proprietaire.put("nom", "Dupont");
proprietaire.put("prenom", "Jean");

/* structure contacts (dans agenda */
List lesContacts = new ArrayList();
agenda.put("lesContacts", lesContacts);

/* remplissage des contacts */
Map unContact = new HashMap();
lesContacts.add(unContact);
unContact.put("nom", "Bond");
unContact.put("prenom", "James");

unContact = new HashMap();
lesContacts.add(unContact);
unContact.put("nom", "Woman");
unContact.put("prenom", "Cat");
Fusionner le template et la structure objet dans un fichier de destination :
   InputStreamReader fileTemplate = new InputStreamReader(ClassLoader
.getSystemResourceAsStream("inputTemplate.ftl"));
Configuration cfg = new Configuration();
cfg.setObjectWrapper(new DefaultObjectWrapper());
Template temp = new Template("inputTemplate.ftl", fileTemplate, cfg);

Writer out = new OutputStreamWriter(System.out);
temp.process(root, out);
out.flush();
out.close();
C'est évidemment un exemple assez simple mais les possibilités offertes par Freemarker sont très larges.

Pour plus d'informations : http://freemarker.sourceforge.net/

1 comment:

Mathieu said...

Merci pour cette découverte, je vais étudier cela de plus près ;-)