Prof. Me. Danilo Bueno
String html = "<h1>Cardápio</h1><ul>";for (String item : itens) { html += "<li>" + item + "</li>";}html += "</ul>";
O navegador nunca vê a marcação do template, só recebe o HTML já pronto.
O mesmo padrão se repete em praticamente toda linguagem usada no servidor.
O FreeMarker adota a segunda filosofia: por isso existem diretivas como <#list> e <#if>.
<#list>
<#if>
Nenhuma opção é definitivamente melhor: são escolhas diferentes de sintaxe e filosofia.
${}
th:each
th:if
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId></dependency>
src/main/resources/templates/
.ftlh
<!-- cardapio.ftlh --><h1>Cardápio</h1><p>Confira as opções do dia no balcão.</p>
Por enquanto, um arquivo HTML comum: nada de dinâmico ainda.
@Controllerpublic class CardapioController { @GetMapping("/cardapio") public String cardapio() { return "cardapio"; }}
O retorno é o nome do template, não o corpo da resposta.
@RestController
@Controller
Métodos que devem devolver texto cru precisam de @ResponseBody.
@ResponseBody
<!-- cardapio.ftlh --><h1>Cardápio</h1><p>Sugestão do dia: ${itemDoDia}</p>
${nome} imprime uma variável; falta o controller enviar esse valor.
${nome}
@GetMapping("/cardapio")public String cardapio(Model model) { model.addAttribute("itemDoDia", "Cappuccino"); return "cardapio";}
O nome usado em addAttribute precisa bater com o nome usado no template.
addAttribute
<#-- Esta linha some do HTML final --><h1>Cardápio</h1><p>Sugestão do dia: ${itemDoDia}</p>
Diferente do comentário HTML (<!-- -->), que é enviado ao navegador.
<!-- -->
<h1>Cardápio</h1><ul><#list bebidas as bebida> <li>${bebida.nome}: R$ ${bebida.preco}</li></#list></ul>
Repete o bloco interno para cada elemento da coleção; falta o controller enviar bebidas.
bebidas
model.addAttribute("bebidas", repositorio.listarTodas());
Uma List Java vira, no template, uma coleção percorrível com <#list>.
List
?c
${totalVendas}<!-- 12,345 ou 12.345, conforme o idioma do navegador -->${totalVendas?c}<!-- 12345, sempre no mesmo formato -->
Por padrão, o FreeMarker formata números pela localização do navegador; ?c evita isso, inclusive em ${bebida.preco?c}.
${bebida.preco?c}
<#if bebidas?size == 0> <p>Nenhuma bebida cadastrada.</p><#else> <ul> <#list bebidas as bebida> <li>${bebida.nome}: R$ ${bebida.preco?c}</li> </#list> </ul></#if>
?size é um built-in: consulta uma propriedade do valor à esquerda.
?size
<#include>
<!-- cabecalho.ftlh --><header><h1>Cafeteria Central</h1></header>
<!-- cardapio.ftlh --><#include "cabecalho.ftlh"><p>Sugestão do dia: ${itemDoDia}</p>
Insere o conteúdo de outro template no ponto indicado.
Prof. Me. Danilo Bueno [email protected]