Freemarker: template engine basato su Java

23 giugno 2014

Freemarker è un template engine basato su Java utilizzabile sia in modalità stand-alone che in un ambiente Web, esso prevede un Template file che contiene l’output da visualizzare associato a dei place-holder riguardanti eventuali parti che vogliamo fornire dinamicamente.

<html>
<body>
<h1>${title}</h1>
</body>
</html>

Nell’esempio ${title} indica una variabile che verrà fornita al template in maniera dinamica. Questo verrà fatto da Java, sarà infatti Freemarker che permetterà di fornire al template i valori dinamici da visualizzare. Tale modalità permette un disaccoppiamento tra la View e la parte back-end, questo perché chi realizza il template potrebbe anche non conoscere cosa rappresenta ${title} ma, più semplicemente, aspettarsi che il valore venga fornito a runtime.

Installazione

Scarichiamo la libreria Freemarker dalla sezione download che troviamo all’indirizzo http://freemarker.org/freemarkerdownload.html e memorizziamola in una directory a parte, ci servirà successivamente:

Figura 1. Download libreria freemarker.

Download libreria freemarker

Ora apriamo Eclipse, nel nostro caso abbiamo utilizzato Kepler, ed installiamo il plugin per Freemarker selezionando in eclipse la voce “help/Install New Software” e, inserendo l’url http://download.jboss.org/jbosstools/updates/stable/kepler/, selezioniamo il Freemarker IDE per entrambe le checkbox come in figura:

Figura 2. Scelta del freemarker IDE per Eclipse.

Scelta del freemarker IDE per Eclipse

Un primo esempio di utilizzo in Eclipse

In Eclipse creiamo un progetto Java, chiamato per esempio “FreemarkerProject”, e il template mytemplate.ftl sotto la cartella templates:

Figura 3. Il template file.

Il template file

Creiamo quindi anche il seguente Bean:

package com.freemarker; public class Developer {
private String name;
private String project;

	public Developer(String name, String project) {
		this.name = name;
		this.project = project;
	}

	public String getName() {
		return name;
	}

	public String getProject() {
		return project;
	}
}

Come nomi, i due campi del Bean hanno “name” e “project”, vedremo successivamente come ciò non sia un caso. Creiamo ora una classe di test che dovrà caricare il template ed effettuare il binding dei valori con quelli che il template si aspetta di ricevere:

package com.freemarker.test; 

.. imports 

public class TestOutput {

public static void main(String[] args) {
	// configuration object di Freemarker
	Configuration cfg = new Configuration();


	// definiamo la classe che carica il template
	cfg.setClassForTemplateLoading(TestOutput.class, "templates");

	// impostazioni raccomandate
	cfg.setIncompatibleImprovements(new Version(2, 3, 20));
	cfg.setDefaultEncoding("UTF-8");
	cfg.setLocale(Locale.US);
	cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);


	// caricamento del template
	try {
	// path assoluto al template
		cfg.setDirectoryForTemplateLoading(new File("C:/Users/g.astarita/Desktop/Work/WS Articoli/FreemarkerProject/templates"));

		// generazione del data-model
		Map data = new HashMap();
		String title = "Freemaker example";
		data.put("title", title);
		Developer developer = new Developer("giuseppe","Progetto Telecom");
		data.put("developer", developer);

		Template template = cfg.getTemplate("mytemplate.ftl");

		// Console output
		Writer out = new OutputStreamWriter(System.out);
		template.process(data, out);
		out.flush();

		// File output
		Writer file = new FileWriter (new File("freemarkerOutput.txt"));
		template.process(data, file);
		file.flush();
		file.close();
		} catch (IOException e) {		
			e.printStackTrace();
		} catch (TemplateException e) {
			 e.printStackTrace();
	}

}

}

La funzionalità di questa classe è quella di caricare il template e di effettuare il binding; nell’Hashmap data inseriamo prima la stringa “title”, fatto questo il codice creerà un Bean con due campi, developer.name e developer.project, proprio le due variabili rimanenti che il template si aspetta. Infine il codice scriverà l’output su console e in un file:

Figura 4. Il risultato su console.

Il risultato su console
Se vuoi aggiornamenti su Freemarker: template engine basato su Java inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su Freemarker: template engine basato su Java

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento di cui al punto 3 dell'informativa sulla privacy