O FreeMarker é muito utilizado por alguns frameworks Web MVC como a principal tecnologia utilizada na camada de apresentação, substituindo o JSP, que é o caso por exemplo do framework WebWork.

Embora muitos utilizem o FreeMarker no lugar do JSP, o seu principal objetivo é ser um simples e rápido framework de templates, o qual pode ser utilizado para automatizar a geração de determinado código. Um exemplo de aplicação que utiliza o FreeMarker com esta finalidade é o HibernateTools, ferramenta bem conhecida dos usuários do Hibernate..

Neste artigo será apresentado como escrever um simples template em FreeMarker, e separar a lógica de negócios do “design” do seu template.

FreeMarker

Para rodar o exemplo deste artigo, faça o download do FreeMarker 2.3.8 clicando aqui. Após fazer o download, coloque o arquivo freemarker.jar no classpath do seu projeto.

Utilizando o FreeMarker

A classe abaixo demonstra como utilizar o FreeMarker. O método parseTemplate recebe um Map com os parâmetros e o nome do template. O resultado é uma String (texto) com o template processado.

É recomendado que seja criado somente uma instância da classe Configuration, e para isto uma variável privada e estática foi declarada na classe.

Note que a constante TEMPLATES_FOLDER define o local onde estão os templates. O valor da constante está fixa no código para facilitar o exemplo.


 import java.io.File;
 import java.io.IOException;
 import java.io.StringWriter;
 import java.util.Map;
 
 import freemarker.template.Configuration;
 import freemarker.template.DefaultObjectWrapper;
 import freemarker.template.Template;
 import freemarker.template.TemplateException;
 
 public class FreemarkerUtils {
 
  private static Configuration cfg = new Configuration();
 
  private static final String TEMPLATES_FOLDER = "templates";
  
  public static final String parseTemplate(Map map,String templateName) 
  throws TemplateException, IOException {
 
  //diretório onde estão templates
  cfg.setDirectoryForTemplateLoading(new File(TEMPLATES_FOLDER));
 
  cfg.setObjectWrapper(new DefaultObjectWrapper());
 
  //recupera o template
  Template t = cfg.getTemplate(templateName);
 
  StringWriter writer = new StringWriter();
 
  /** Freemarker **/
  t.process(map, writer);
 
  writer.flush();
  writer.close();
 
  return writer.toString();
  }
 }

Exemplo

Para utilizar a classe anterior, vamos criar um arquivo de template chamado teste.ftl na pasta “templates”. Se você estiver usando o Eclipse, a pasta “templates” pode ser criada na raiz do seu projeto:


teste.ftl
 ${data?string("dd/MM/yyyy")}
 
 Prezado ${usuario}, segue a lista de produtos:
 
 <#list produtos as p>
  - ${p.nome} - R${p.preco}

O template acima demonstra como construir um “email” para enviar aos usuários de um sistema. No template, a data atual e o nome do usuário são exibidos, e também uma possível lista de produtos selecionados para este usuário.

Para rodar o exemplo crie a classe Produto, conforme abaixo:


public class Produto {
  private String nome;
  private double preco;
  public Produto(String nome, double preco) {
  super();
  this.nome = nome;
  this.preco = preco;
  }
  public String getNome() {
  return nome;
  }
  public double getPreco() {
  return preco;
  }
 }

E finalmente, uma pequena classe que executa o template teste.ftl, passando os parâmetros necessários:


  public class HelloTemplate {
  public static void main(String[] args) throws IOException,TemplateException {
 
  Map map = new HashMap();
  map.put("data", new Date());
  map.put("usuario", "Ricardo");
  
  List produtos = new ArrayList();
  produtos.add(new Produto("Produto A1",300.14));
  produtos.add(new Produto("Produto B2",401.56));
  produtos.add(new Produto("Produto C3",555.77));
  map.put("produtos", produtos);
 
  String s = FreeMarkerUtils.parseTemplate(map, "teste.ftl");
  System.out.println(s);
  }
 }

A saída do programa pode ser visualizada abaixo:



 13/11/2006
 
 Prezado Ricardo, segue a lista de produtos:
 
  - Produto A1 - R$300.14
  - Produto B2 - R$401.56
  - Produto C3 - R$555.77

Conclusão

O template construído neste artigo, poderia ser um “email” enviado a uma lista de usuários de um sistema. Tente criar um template, onde a saída seja um arquivo HTML, e enviá-lo por email com a API Commons-email descrita neste artigo.

O FreeMarker é sem dúvida muito simples, sendo possível utilizá-lo para gerar código, ou até mesmo em aplicações Web, substituindo o JSP na camada de visualização.

Referências: