Formulários com Spring Boot e Thymeleaf
Definição
Formulários HTML permitem que os usuários enviem informações para uma aplicação web, como dados de cadastro, pesquisa e edição.
Em aplicações desenvolvidas com Spring Boot e Thymeleaf, os formulários podem ser integrados aos controllers para receber, processar e apresentar os dados enviados pelo usuário.
O Thymeleaf disponibiliza atributos como th:action, th:object e th:field, que facilitam a associação entre os campos HTML e os objetos Java.
Criando a classe de domínio
Para demonstrar o funcionamento de um formulário, será utilizado o cadastro de países.
Crie a classe Pais com os atributos nome e capital.
public class Pais {
private String nome;
private String capital;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getCapital() {
return capital;
}
public void setCapital(String capital) {
this.capital = capital;
}
}Os métodos getters e setters permitem que o Spring e o Thymeleaf acessem e atualizem os atributos do objeto.
Criando o Controller
O Controller será responsável por apresentar o formulário e receber os dados enviados pelo usuário.
Crie a classe PaisController:
@Controller
@RequestMapping("/paises")
public class PaisController {
@GetMapping("/novo")
public ModelAndView novo() {
ModelAndView mv = new ModelAndView("pais-form");
mv.addObject("pais", new Pais());
return mv;
}
@PostMapping
public ModelAndView salvar(@ModelAttribute Pais pais) {
ModelAndView mv = new ModelAndView("pais-resultado");
mv.addObject("pais", pais);
return mv;
}
}O método novo() responde a uma requisição HTTP GET para /paises/novo. Ele disponibiliza um objeto Pais vazio para preencher o formulário.
O método salvar() responde a uma requisição HTTP POST para /paises. O Spring utiliza os dados enviados pelo formulário para preencher o objeto Pais, recebido pelo parâmetro anotado com @ModelAttribute.
Neste exemplo, os dados são apenas recebidos e apresentados na resposta. O cadastro ainda não é persistido em um banco de dados.
Criando o formulário HTML
Crie o arquivo pais-form.html na pasta src/main/resources/templates.
<!DOCTYPE html>
<html lang="pt-BR" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Cadastro de país</title>
</head>
<body>
<h1>Cadastro de país</h1>
<form th:action="@{/paises}"
th:object="${pais}"
method="post">
<label for="nome">Nome:</label>
<input type="text"
id="nome"
th:field="*{nome}"
required>
<label for="capital">Capital:</label>
<input type="text"
id="capital"
th:field="*{capital}"
required>
<button type="submit">Salvar</button>
</form>
</body>
</html>O formulário utiliza três atributos importantes do Thymeleaf:
th:action="@{/paises}": define o endereço para o qual os dados serão enviados.th:object="${pais}": associa o formulário ao objetopaisdisponibilizado pelo Controller.th:field="*{nome}"eth:field="*{capital}": associam os campos HTML aos atributos do objeto.
A expressão *{...} acessa propriedades do objeto definido em th:object. Dessa forma, *{nome} corresponde à propriedade nome do objeto pais.
O atributo method="post" indica que o formulário enviará os dados por meio de uma requisição HTTP POST.
Exibindo os dados enviados
Após o envio do formulário, o Controller disponibiliza o objeto preenchido para a página pais-resultado.html.
Crie o arquivo em src/main/resources/templates/pais-resultado.html:
<!DOCTYPE html>
<html lang="pt-BR" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>País cadastrado</title>
</head>
<body>
<h1>Dados recebidos</h1>
<p>
País:
<span th:text="${pais.nome}"></span>
</p>
<p>
Capital:
<span th:text="${pais.capital}"></span>
</p>
<a th:href="@{/paises/novo}">Cadastrar outro país</a>
</body>
</html>O atributo th:text apresenta os valores recebidos do Controller. Como o Thymeleaf escapa caracteres HTML especiais por padrão nessa expressão, os valores são exibidos como texto, em vez de serem interpretados como marcação HTML.
Testando a aplicação
Execute a aplicação Spring Boot e acesse o endereço:
http://localhost:8080/paises/novo
Preencha os campos com o nome de um país e sua capital e clique em Salvar.
O navegador enviará uma requisição POST para /paises. O Spring preencherá o objeto Pais com os valores informados e o Controller retornará a página com os dados recebidos.
Resumo
Neste exemplo, foram utilizados os seguintes recursos:
@GetMapping: disponibiliza a página do formulário.@PostMapping: recebe os dados enviados pelo formulário.@ModelAttribute: associa os dados da requisição a um objeto Java.th:action: define o destino do formulário.th:object: associa o formulário a um objeto.th:field: associa os campos do formulário às propriedades do objeto.th:text: apresenta os dados na página HTML.
Essa integração permite criar formulários dinâmicos com HTML e Thymeleaf, processando as requisições com Spring Boot. Em uma aplicação real, o próximo passo seria adicionar validação dos dados e persistência em um banco de dados.