Gerando código com o FreeMarker

Neste artigo será apresentado o FreeMarker, um poderoso framework de templates, similiar ao famoso Velocity da Jakarta.

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 $, 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:

Artigos relacionados