Passando um objeto para a visão

No artigo anterior vimos como enviar dados para a visão, porém vimos somente como mandar uma String simples. E se quisermos mandar um objeto? Como fazemos?

Para isso, vamos criar uma classe chamada Product que vai representar um produto. Ela vai ter os seguintes atributos, juntamente com seus respectivos getters e setters:

1
public class Product {
2
private String name;
3
private String description;
4
private double price;
5
6
public Product(String name, String description, double price) {
7
this.name = name;
8
this.description = description;
9
this.price = price;
10
}
11
12
public Product() { }
13
14
public String getName() {
15
return name;
16
}
17
18
public String getDescription() {
19
return description;
20
}
21
22
public double getPrice() {
23
return price;
24
}
25
26
public void setName(String name) {
27
this.name = name;
28
}
29
30
public void setDescription(String description) {
31
this.description = description;
32
}
33
34
public void setPrice(double price){
35
this.price = price;
36
}
37
}

Vamos criar um novo Controller chamado ProductController e vamos criar um método que vai retornar um objeto do tipo Product:

1
@Controller
2
public class ProductController {
3
4
@RequestMapping("/products")
5
public String index(Model model) {
6
Product product = new Product("Notebook", "Notebook Dell", 3500.00);
7
model.addAttribute("product", product);
8
return "product";
9
}
10
}

Já vimos anteriormente como criar o controller e também como usar as anotações para falar ao SpringBoot a responsabilidade dessa classe.

Agora vamos ver o que mudou. Primeiro, criamos um objeto do tipo Product e setamos os valores dos atributos para um exemplo qualquer. Depois, usamos o método addAttribute do objeto model para adicionar o objeto product à visão. O primeiro parâmetro é o nome que vamos usar para acessar o objeto na visão, e o segundo é o objeto em si. Por fim, no método return chamamos a visão list.

Se tentarmos rodar o código teremos um erro já que a visão list não existe, logo vamos criar ela também.

1
<!--O resto do código foi omitido-->
2
<body>
3
<h1>Product:</h1>
4
<p th:text="${product.name}"></p>
5
<p th:text="${prodcut.description}"></p>
6
<p th:text="${product.price}"></p>
7
</body>

Se olharmos para a expressão de variável, estamos usando o objeto product e acessando seus atributos name, description e price através da sintaxe ${object.attribute}.

O que está acontecendo por debaixo dos panos é que ao acessar a expressão de variável ${product.name}, o SpringBoot vai procurar o objeto product que foi adicionado ao model e vai chamar o método getName() para retornar o valor do atributo name.

Reinicie novamente o servidor e acesse a URL /products, vamos ver que o objeto foi passado para a visão e os valores dos atributos foram exibidos.