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.