Criando novas rotas

Até agora vimos como subir um servidor HTTP e como responder uma requisição com uma resposta HTML na rota padrão da aplicação, ou seja, na rota /. Se seu site fosse o Google, a rota padrão seria https://www.google.com.br/. Mas e se você quisesse criar uma rota para a página de pesquisa, por exemplo, https://www.google.com.br/search. Como fazer isso?

Primeiro é importante ter em mente que uma rota é um caminho que o usuário pode percorrer para chegar a um recurso. Por exemplo, a rota / é o caminho que o usuário percorre para chegar ao recurso que é a página inicial do site, no caso do Spring Boot, o recurso é o arquivo index.html. Essa é uma configuração feita pelo servidor HTTP, que é o Tomcat no caso do Spring Boot.

Para adicionarmos novas rotas em uma aplicação Spring Boot, precisamos criar um classe conhecida como controlador. Essa classe é responsável pelo mapeamento entre as rotas e os métodos que serão executados quando uma requisição for feita pelo usuário. Por exemplo, se você acessar a rota http://localhost:8080/home atualmente na aplicação, você receberá um erro, pois não existe nenhuma rota mapeada para /home. Para mapear essa rota, precisamos criar um controlador que mapeie a rota /home para um método que será executado quando essa rota for acessada.

Não se preocupe tanto com o termo controlador agora, iremos explorar ele em mais detalhes mais pra frente. Porém perceba que o nome já possui uma convenção a ser seguida, que é o sufixo Controller.

Para criar um controlador, crie uma classe chamada HomeController na pasta src/main/java/{group}/{artifact} - Lembre-se, o group e o artifact são os valores que você definiu quando criou o projeto - com o seguinte conteúdo:

HomeController.java
1
package {group}.{artifact};
2
3
import org.springframework.stereotype.Controller;
4
import org.springframework.web.bind.annotation.GetMapping;
5
import org.springframework.web.bind.annotation.ResponseBody;
6
7
@Controller
8
public class HomeController {
9
10
@GetMapping("/home")
11
public String home() {
12
System.out.println("rota /home");
13
return "";
14
}
15
}

Aqui temos algumas novidades. A principio temos uma classe com o nome HomeController que possui um método chamado home(). Até ai nada de mais, porém temos algumas anotações que não vimos antes.

As anotações são uma forma de adicionar metadados a uma classe ou método. Você pode entender metadados como informações complementares ao código fonte. São nas anotações que muito da “mágica” do Spring Boot acontece.

Por exemplo, com a anotação @GetMapping(“/home”) estamos dizendo ao spring que quando o usuário acessar essa rota em seu navegador (http://localhost:8080/home), o método home() deve ser executado. Como isso é feito, ou seja, como o Spring fica ouvindo as requisições, compara que a resquisição é para a rota /home e não outra rota qualquer, encontra a classe HomeController e executa o método home() não sabemos, pois toda essa lógica e código está abstraído na anotação.

Isso acaba simplificando o desenvolvimento, pois não precisamos nos preocupar com esses detalhes, apenas precisamos saber que a anotação @GetMapping("/home") mapeia a rota /home para o método home().

Além da anotação @GetMapping("/home"), temos também a anotação @Controller, como o nome sugere essa anotação converte a classe para um tipo especial conhecido como Controlador. Essa classe é o ponto de entrada para qualquer requisição feita pelo cliente.

Já a anotação @GetMapping("/hello"), como vimos indica que o método hello() será chamado quando uma requisição GET for feita para a rota /hello.

Para testar a aplicação, suba o servidor HTTP e acesse a rota /hello no navegador. Você deve ver a mensagem “Rota /hello” no terminal.

Retornando HTML

Até agora vimos como mapear uma rota a um método Java. Porém, como vimos anteriormente, o HTML é a linguagem utilizada para criar páginas web. Então, como retornar uma resposta HTML?

Em aulas anteriores criamos um arquivo HTML simples para retornar como resposta quando o cliente acessasse a rota / usando a convenção do SpringBoot de armazenar tal arquivo na pasta src/main/resources/static.

Vamos criar um segundo arquivo, nessa mesma pasta, chamado home.html com o seguinte conteúdo:

home.html
1
<!DOCTYPE html>
2
<html lang="pt-br">
3
<head>
4
<meta charset="UTF-8">
5
<title>Home</title>
6
</head>
7
<body>
8
<h1>Home</h1>
9
</body>
10
</html>

Novamente, um arquivo HTML bem simples. Agora, vamos alterar o método home() da classe HomeController para retornar esse arquivo HTML. Para isso, basta alterar o retorno do método para return "home.html";

Se você acessar novamente a aplicação no navegador, você verá a mesma mensagem “Home” escrita na tela, porém ao inspecionar o código fonte da página, você verá que o código HTML foi retornado. Ou seja, o Spring Boot foi capaz de encontrar o arquivo home.html e retorná-lo como resposta para o cliente.

IMPORTANTE: a rota @GetMapping("/hello"), no caso do exemplo /home é única, ou seja, não pode existir duas rotas com o mesmo nome