Coletando dados do usuário

Nos artigos anteriores vimos como exibir dados para o usuário que está acessando a nossa aplicação. Nesse contexto o usuário fica bastante limitado visto que só consegue consumir informações exibidas pela aplicação. Para tornar a aplicação mais interativa, é necessário que o usuário possa também enviar dados para a aplicação, e a forma mais comum de entrada de dados em aplicações Web são os formulários.

Exibindo o formulário

Os formulários possuem dois atributos importantes que serão utilizados para a comunicação com a aplicação sendo eles, os atributos method e action:

Outra informação importante dos formulário é o atributo name de cada campo que obrigatoriamente deve ser definido. Esse atributo serve como referência para o envio dos dados e a recuperação deles na aplicação - como se você estivesse nomeando uma variável. Veja o exemplo abaixo de formulário com os atributos method, action e name nos campos.

1
<form th:method="POST" th:action="@{/somar}">
2
<input type="number" th:name="primeiroNumero" />
3
<input type="number" th:name="segundoNumero" />
4
<button type="submit">Send</button>
5
</form>

IMPORTANTE: Perceba que os atributos estão acompanhados do prefixo th e a URL do action está sendo gerada com a sintaxe @{}. Ambos são recursos do Thymeleaf.

Tendo o formulário pronto em uma visão (um arquivo HTML) precisamos dizer ao Spring para exibi-lo em uma rota. A titulo de exemplo crie um controlador chamado SomadorController.java. Nele crie um método chamado soma e faça o mapeamento desse método para a rota soma.

1
@Controller
2
public class SomadorController {
3
4
@GetMapping("/soma")
5
public String somaForm() {
6
return "somaForm.html";
7
}
8
9
}

Submetendo o formulário

Se você testar a aplicação nesse momento verá que o formulário está enviando os dados porém como não configuramos a nossa aplicação para receber esses dados o Spring está exibindo a página padrão Whitelabel Error Page. Para resolver esse problema será necessário criar um novo método mapeado para a rota que foi definida no atributo action do formulário.

1
@PostMapping("/somar")
2
public String somar(@RequestParam int primeiroNumero, @RequestParam int segundoNumero, Model model) {
3
int total = primeiroNumero + segundoNumero;
4
model.addAttribute("total", total);
5
return "somar.html";
6
}

Aqui temos alguma diferenças importantes. Primeiramente estamos utilizando uma anotação diferente, a PostMapping. Como o nome da anotação já sugere, estamos mapeando agora uma rota que espera receber uma requisição do tipo POST - uma requisição feita via formulário configurada com o method="POST". A segunda alteração é a adição da anotação @RequestParam como parâmetros do método somar. Essa anotação faz a ligação entre os campos do formulário com as variáveis Java para serem utilizadas dentro do método. A partir desse ponto apenas fazemos um processamento simples realizando a soma dos valores e enviando esses dados para a visão como já visto anteriormente.

Mapeamento entre visão e controlador

A Figura abaixo ilustra o mapeamento entre a visão e o controlador. Fique atento pois os nomes devem ser os mesmos para que a comunicação entre eles funcione corretamente.

Conexão entre visão e controlador

Observe que temos: