Até então mandamos um arquivo HTML como resposta para o cliente que fez a requisição. Porém esse HTML é um arquivo fixo, ou seja, sempre que o cliente acessar a rota /home
o mesmo arquivo HTML será retornado.
Mas e se quisermos manipular o HTML antes de enviar a resposta? Por exemplo, se quisermos retornar um HTML com o nome do usuário logado, ou com o nome de um produto que o usuário pesquisou, ou com uma lista de produtos que o usuário comprou, etc.
Para isso, precisamos enviar dados para a visão. No Spring Boot, precisaremos adicionar um novo parâmetro ao método a ser chamado. Esse parâmetro será do tipo Model
, que é uma classe do Spring Boot que representa o modelo de dados a ser enviado para a visão.
Imagine o Model como sendo a cola entre o controlador e a visão. Esse modelo é o container que guarda os dados a serem usados na visão. Qualquer método dentro do controller pode acessar o Model.
Agora, para enviar dados para a visão, basta adicionar um atributo ao Model. O método addAttribute()
recebe dois parâmetros, o primeiro é o nome do atributo e o segundo é o valor do atributo.
Até aqui estamos armazenando os dados que gostariamos de exibir na visão nessa classe Model. Porém, como acessar esses dados na visão?
Para isso, precisamos de mais uma peça do quebra-cabeça, o Thymeleaf. O Thymeleaf é um motor de templates que permite que o desenvolvedor crie páginas HTML dinâmicas.
Para utilizar o Thymeleaf, precisamos adicionar a dependência no arquivo pom.xml
:
A versão do Thymeleaf deve ser a mesma versão do Spring Boot.
Após adicionar a dependência ao seu projeto o VSCode deve tentar baixar e sincronizar a dependência automaticamente. Caso isso não aconteça, você pode executar o comando manualmente através do terminal:
Feita a instalação suba novamente o servidor e acesse a rota /home
no navegador. Você deve perceber que ela não está mais funcionando. Isso porque ao adicionar o Thymeleaf ao projeto o Spring Boot passa a procurar os arquivos HTML na pasta src/main/resources/templates
e não mais na pasta src/main/resources/static
. Mova o arquivo para a respectiva pasta e tente novamente. Dessa vez você deve ver o arquivo HTML sendo retornado como resposta.
Você pode omitir .html ao retornar o nome do arquivo. Por exemplo,
return "home";
é o mesmo quereturn "home.html";
Agora que o Thymeleaf está configurado podemos acessar os dados guardados na classe especial Model que definimos no método do controlador.
O Thymeleaf usa um conceito chamado Variable Expression para acessar os dados do Model. A sintaxe das expressões variáveis são compostas de 3 pedaços: sinal de cifrão ($
), chaves ({}
) e o nome do atributo do Model. Por exemplo, para acessar o atributo nome
do Model, basta escrever ${nome}
.
As expressões de variáveis devem ser acompanhadas de um dialeto definido pelo Thymeleaf. Esse dialeto adiciona atributos as tags HTML para que o Thymeleaf possa interpretar as expressões variáveis.
Vamos começar adicionando o dialeto mais simples, para exibir algum texto. Para isso vamos usar o dialeto th:text
. Combinando o dialeto th:text
com a expressão variável ${nome}
temos o seguinte código (o resto do código foi omitido para focarmos na parte importante):
Agora, ao acessar a rota /home
no navegador, você deve ver a mensagem “Ola Mundo” - definida na classe Java do controlador - aparecer na tela.
Para realizar os exercícos abaixo crie um novo projeto chamado controlador-para-visao
usando o start.spring.io
. Adicione a dependência do motor de template thymeleaf
. Crie um controlador chamado EnviandoStringController.java
e nele:
/enviaum
usuario
com o valor lisa@maria.com.br
mostrar-um.html
addAttribute()
da classe org.springframework.ui.Model
th:text
.h1
./enviaum
/enviavarios
nome
, prontuario
e email
com os valores Lisa
, 201234
e lisa@maria.com.br
.addAttribute()
da classe org.springframework.ui.Model
mostrar-varios.html
th:text
do Thymeleaf.h1
, o prontuário e o email cada um dentro de um parágrafo diferente (p
).Para os exercícios a seguir crie um novo controller chamado EnviandoObjetoController.java
.
Pessoa.java
com três atributos: nome
, sobrenome
e idade
.getters
e setters
da classe Pessoa.java
;/enviapessoa
;Pessoa
com os o nome Lisa
, sobrenome Maria
e idade 19
;mostrar-pessoa.html
;h1
, o sobrenome e a idade em parágrafos separados p
.Carro.java
com três atributos: nome
, marca
e cor
.getters
e setters
da classe Carro.java
/enviacarro
Carro
com os dados: Uno, FIAT e verde;mostrar-carro.html
;h1
, a marca e a cor em parágrafos separados p
.