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:
1public 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@Controller2public 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 objetoproduct
que foi adicionado ao model e vai chamar o métodogetName()
para retornar o valor do atributoname
.
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.