Como passar um objeto para a view
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.
Criando a Classe do Objeto
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:
public class Product {
private String name;
private String description;
private double price;
public Product() {} // Construtor vazio (obrigatório para o Spring)
// Construtor com parâmetros
public Product(String name, String description, double price) {
this.name = name;
this.description = description;
this.price = price;
}
// Getters e Setters (métodos de acesso)
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getDescription() { return description; }
public void setDescription(String description) { this.description = description; }
public double getPrice() { return price; }
public void setPrice(double price) { this.price = price; }
}
Essa classe representa um produto e será usada para armazenar e transportar dados entre o controller e a view.
Criando o Controller
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:
@Controller
public class ProductController {
@RequestMapping("/products")
public String index(Model model) {
Product product = new Product("Notebook", "Notebook Dell", 3500.00); // Criando um produto de exemplo
model.addAttribute("product", product); // Adicionando o objeto ao Model
return "product.html"; // Retornando o nome da view (arquivo HTML)
}
}
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
Criando a View com Thymeleaf
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:
<!--Omitimos aqui o HTML completo-->
<h1>Produto:</h1>
<p th:text="${product.name}">Nome do produto</p>
<p th:text="${product.description}">Descrição do produto</p>
<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:
<body>
<h1>Produto:</h1>
<p>[[${product.name}]]</p>
<p>[[${product.description}]]</p>
<p>[[${product.price}]]</p>
</body>
Quando usar cada uma?
- Use
th:textquando quiser substituir totalmente o conteúdo de um elemento. - Prefira
[[${}]]para inserir valores em meio a textos estáticos ou em atributos HTML. Por exemplo:<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.
O que está acontecendo debaixo do capô?
Quando você acessa a URL /products, o Spring Boot executa os seguintes passos:
- O método
indexdoProductControlleré chamado. - Um objeto
Producté instanciado e adicionado aoModel. - O Spring Boot renderiza o template
product.htmle substitui as expressões Thymeleaf pelos valores do objeto. - O HTML final é enviado ao navegador, exibindo os dados dinâmicos.
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.