Java Template Engine - Pebble
Template engine tem por objetivo gerar saídas de texto (páginas da web HTML, e-mails, arquivos de configurações, código fonte, etc.) com base em modelos e dados variáveis.
Pebble é um Template Engine escrito em Java inspirado no Twig e também no Jinja. Ele possui modelos de herança, suporte integrado para internacionalização, conta com uma sintaxe fácil de ler, dentre tantas outras funcionalidades.
Exemplo
Nesse exemplo vamos utilizar o Pebble
gerar saida de um código html.
Chega de concatenar strings
para gerar um código html que será utilizado para envio de e-mail.
Primeiramente vamos adicionar a dependência em nosso projeto.
<dependency>
<groupId>io.pebbletemplates</groupId>
<artifactId>pebble</artifactId>
<version>3.1.5</version>
</dependency>
O próximo passo é criar os templates.
Vamos construir um template que será base para os demais, ele vai ser nomeado como base.html
. Já o template que vamos enviar por e-mail vai herdar o template base e adicionar seu conteúdo customizado, vamos nomear este template como oferta.html
.
Os templates devem ficar no diretório resources
. Mas para deixar um pouco mais organizado, crie uma pasta chamada template e deixá-los lá dentro.
O código do template base fica logo abaixo, nele adicionamos algumas expressões block
para que possamos incluir código html de outro template diretamente dentro dele.
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<title>{% block title %}My Website{% endblock %}</title>
</head>
<body>
<div id="content">
{% block content %}{% endblock %}
</div>
<div id="footer">
{% block footer %}
Não responda este e-mail
{% endblock %}
</div>
</body>
</html>
Em nosso template de ofertas, herdamos o template base e adicionamos nosso código html customizado. Repare que tudo isso é feito dentro das expressões de block
que criamos no template anterior. Se atente ao fato de que estamos utilizando algumas variáveis pois vamos injetar um conteúdo dinâmico para elas, mas tenha calma, tudo isso será feito em nossa classe Java.
{% extends "templates/base.html" %}
{% block title %} {{ name | title }} temos uma oferta fresquinha para você {% endblock %}
{% block content %}
<h1> MEGA OFERTA!!! </h1>
<p>
Utilizando o cupom <strong>{{ cupom }}</strong>
você tem direito a <span style="color: red">{{ desconto }}%</span>
de desconto nas compras acima de <u>R$ {{ valor }}</u>.
</p>
<div style="background-color: yellow; padding: 20px">
Lembre-se temos <u><strong>FRETE GRATIS</strong></u> para leitores do blog.
</div>
<p>
Confira uma lista com nossos produtos mais vendidos...
</p>
<hr/>
<p>
Caso você não queira mais receber nossas ofertas por email, clique <a href="#">aqui</a>.
</p>
{% endblock %}
Agora segue a implementação da nossa classe Java que irá, consumir os templates criados acima.
package com.gasparbarancelli.emailtemplate;
import com.mitchellbosecke.pebble.PebbleEngine;
import com.mitchellbosecke.pebble.template.PebbleTemplate;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
public class TemplateCompra {
public static void main(String[] args) throws IOException {
PebbleEngine engine = new PebbleEngine.Builder().build();
PebbleTemplate compiledTemplate = engine.getTemplate("templates/oferta.html");
Map<String, Object> context = new HashMap<>();
context.put("name", "Gaspar Barancelli");
context.put("cupom", "1234");
context.put("desconto", "30");
context.put("valor", "1.000,00");
Writer writer = new StringWriter();
compiledTemplate.evaluate(writer, context);
String output = writer.toString();
System.out.println(output);
}
}
Resumindo a implementação da nossa classe acima, ela fez o uso da lib Pebble
, criando os objetos responsáveis por gerar uma saída html com base em nosso template de ofertas. Também criou objeto do tipo map, que contém todas váriveis utilizadas no templates e seus valores, que por fim processou o template e deu saída a seguinte string.
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<title> Gaspar Barancelli temos uma oferta fresquinha para você </title>
</head>
<body>
<div id="content">
<h1> MEGA OFERTA!!! </h1>
<p>
Utilizando o cupom <strong>1234</strong>
você tem direito a <span style="color: red">30%</span>
de desconto nas compras acima de <u>R$ 1.000,00</u>.
</p>
<div style="background-color: yellow; padding: 20px">
Lembre-se temos <u><strong>FRETE GRATIS</strong></u> para leitores do blog.
</div>
<p>
Confira uma lista com nossos produtos mais vendidos...
</p>
<hr/>
<p>
Caso você não queira mais receber nossas ofertas por email, clique <a href="#">aqui</a>.
</p>
</div>
<div id="footer">
Não responda este e-mail
</div>
</body>
</html>
Ao abrirmos o navegador agora temos o nosso HTML renderizado.
Conclusão
No post tivemos uma breve explicação sobre template engines, e um exemplo simples de um código html gerado dinamicamente.
O código fonte do exemplo que construimos esta neste repositório no github.