No artigo anterior, você aprendeu a enviar dados simples, como uma String, para uma view usando Thymeleaf. Mas e se quisermos enviar um objeto completo, como um produto com nome, descrição e preço? Vamos explorar como fazer isso de forma prática e entender os conceitos por trás do processo.
Primeiro, precisamos definir a estrutura do objeto que será passado para a view. Vamos criar uma classe Product
com atributos básicos e métodos getters e setters:
1public class Product {2 private String name;3 private String description;4 private double price;5
6 public Product() {} // Construtor vazio (obrigatório para o Spring)7
8 // Construtor com parâmetros9 public Product(String name, String description, double price) {10 this.name = name;11 this.description = description;12 this.price = price;13 }14
15 // Getters e Setters (métodos de acesso)16 public String getName() { return name; }17 public void setName(String name) { this.name = name; }18
19 public String getDescription() { return description; }20 public void setDescription(String description) { this.description = description; }21
22 public double getPrice() { return price; }23 public void setPrice(double price) { this.price = price; }24}
Essa classe representa um produto e será usada para armazenar e transportar dados entre o controller e a view.
Agora, vamos criar um ProductController
responsável por preparar o objeto e enviá-lo para a view. O Spring Boot usa a interface Model
para adicionar atributos que serão acessíveis no template Thymeleaf:
1@Controller2public class ProductController {3
4 @RequestMapping("/products")5 public String index(Model model) {6 Product product = new Product("Notebook", "Notebook Dell", 3500.00); // Criando um produto de exemplo7
8 model.addAttribute("product", product); // Adicionando o objeto ao Model9
10 return "product.html"; // Retornando o nome da view (arquivo HTML)11 }12}
Aqui, o método index
cria um objeto Product
, adiciona-o ao Model
usando model.addAttribute("product", product)
, e retorna a view product.html
- que deve estar dentro da pasta templates
A view é o arquivo HTML que exibirá os dados do objeto. Usando Thymeleaf, podemos acessar os atributos do objeto com a sintaxe ${objeto.atributo}
. Veja como ficaria:
1<!--Omitimos aqui o HTML completo-->2<h1>Produto:</h1>3<p th:text="${product.name}">Nome do produto</p>4<p th:text="${product.description}">Descrição do produto</p>5<p th:text="${product.price}">Preço do produto</p>
Cada th:text
substitui o conteúdo estático do HTML pelo valor correspondente do objeto product
. Por exemplo, ${product.name}
chama o método getName()
do objeto, a diretiva ${product.description}
chama o método getDescription()
.
Além da sintaxe tradicional com th:text
, o Thymeleaf oferece uma alternativa mais direta para exibir valores no HTML: a sintaxe de inlining [[${objeto.atributo}]]
. Essa abordagem permite inserir valores diretamente no conteúdo do elemento, sem a necessidade do atributo th:text
. Veja como ficaria:
1<body>2 <h1>Produto:</h1>3 <p>[[${product.name}]]</p>4 <p>[[${product.description}]]</p>5 <p>[[${product.price}]]</p>6</body>
Quando usar cada uma?
th:text
quando quiser substituir totalmente o conteúdo de um elemento.[[${}]]
para inserir valores em meio a textos estáticos ou em atributos HTML. Por exemplo:
1<p>Preço: <span>[[${product.price}]]</span> à vista.</p>
Ambas as formas funcionam, mas a escolha depende do contexto e da legibilidade que você deseja para o seu template.
Quando você acessa a URL /products
, o Spring Boot executa os seguintes passos:
index
do ProductController
é chamado.Product
é instanciado e adicionado ao Model
.product.html
e substitui as expressões Thymeleaf pelos valores do objeto.Se você cometer um erro de digitação no nome do atributo (por exemplo, escrever ${prodcut.description}
em vez de ${product.description}
), o Thymeleaf ignorará a expressão e manterá o texto estático padrão, mas não lançará um erro. Por isso, atenção aos detalhes!
Após criar a view product.html
na pasta resources/templates
, reinicie o servidor e acesse http://localhost:8080/products
. Você verá os dados do produto exibidos corretamente, graças à integração entre o Spring Boot e o Thymeleaf.