@RequestMapping é uma das anotações mais amplamente utilizadas do Spring MVC. A anotação org.springframework.web.bind.annotation.RequestMapping
é usada para mapear solicitações da web para classes de manipulador específicas e/ou métodos de manipulador. A anotação
@RequestMapping
pode ser aplicada à classe do controlador, bem como aos métodos. Hoje, vamos explorar vários usos desta anotação com exemplos e outras anotações como @PathVariable
e @RequestParam
.
Spring @RequestMapping
-
@RequestMapping com Classe: Podemos usá-lo com a definição de classe para criar o URI base. Por exemplo:
@Controller @RequestMapping("/home") public class HomeController { }
Agora, /home é o URI para o qual este controlador será utilizado. Este conceito é muito semelhante ao contexto de servlet de uma aplicação web.
-
@RequestMapping com Método: Podemos usá-lo com o método para fornecer o padrão URI para o qual o método manipulador será usado. Por exemplo:
@RequestMapping(value="/method0") @ResponseBody public String method0(){ return "method0"; }
A anotação acima também pode ser escrita como
@RequestMapping("/method0")
. Em uma nota lateral, estou usando @ResponseBody para enviar a resposta de String para esta solicitação da web, isso é feito para manter o exemplo simples. Como sempre faço, usarei esses métodos em uma aplicação Spring MVC e os testarei com um programa ou script simples. -
@RequestMapping com Múltiplos URI: Podemos usar um único método para lidar com vários URIs, por exemplo:
@RequestMapping(value={"/method1","/method1/second"}) @ResponseBody public String method1(){ return "method1"; }
Se você olhar o código-fonte da anotação RequestMapping, verá que todas as suas variáveis são arrays. Podemos criar um array de String para os mapeamentos de URI para o método de manipulador.
-
@RequestMapping com Método HTTP: Às vezes queremos realizar operações diferentes com base no método HTTP usado, mesmo que o URI da solicitação permaneça o mesmo. Podemos usar a variável de método @RequestMapping para restringir os métodos HTTP para os quais este método será invocado. Por exemplo:
@RequestMapping(value="/metodo2", method=RequestMethod.POST) @ResponseBody public String metodo2(){ return "metodo2"; } @RequestMapping(value="/metodo3", method={RequestMethod.POST,RequestMethod.GET}) @ResponseBody public String metodo3(){ return "metodo3"; }
-
@RequestMapping com Cabeçalhos: Podemos especificar os cabeçalhos que devem estar presentes para invocar o método do manipulador. Por exemplo:
@RequestMapping(value="/metodo4", headers="nome=pankaj") @ResponseBody public String metodo4(){ return "metodo4"; } @RequestMapping(value="/metodo5", headers={"nome=pankaj", "id=1"}) @ResponseBody public String metodo5(){ return "metodo5"; }
-
@RequestMapping com Produces e Consumes: Podemos usar os cabeçalhos
Content-Type
eAccept
para descobrir os conteúdos da solicitação e qual é a mensagem MIME desejada na resposta. Para maior clareza, @RequestMapping fornece as variáveis produces e consumes onde podemos especificar o tipo de conteúdo da solicitação para o qual o método será invocado e o tipo de conteúdo da resposta. Por exemplo:@RequestMapping(value="/method6", produces={"application/json","application/xml"}, consumes="text/html") @ResponseBody public String method6(){ return "method6"; }
O método acima só pode consumir mensagens com Content-Type como text/html e é capaz de produzir mensagens dos tipos application/json e application/xml.
Spring @PathVariable
-
@RequestMapping com @PathVariable: A anotação RequestMapping pode ser usada para lidar com URIs dinâmicas, onde um ou mais valores da URI funcionam como parâmetros. Podemos até mesmo especificar uma Expressão Regular para o parâmetro dinâmico da URI, a fim de aceitar apenas um tipo específico de entrada. Isso funciona com a anotação @PathVariable, através da qual podemos mapear a variável da URI para um dos argumentos do método. Por exemplo:
@RequestMapping(value="/metodo7/{id}") @ResponseBody public String metodo7(@PathVariable("id") int id){ return "metodo7 com id="+id; } @RequestMapping(value="/metodo8/{id:[\\d]+}/{nome}") @ResponseBody public String metodo8(@PathVariable("id") long id, @PathVariable("nome") String nome){ return "metodo8 com id= "+id+" e nome="+nome; }
Spring @RequestParam
- @RequestMapping com @RequestParam para parâmetros de URL: Às vezes, recebemos parâmetros na URL da solicitação, principalmente em solicitações GET. Podemos usar @RequestMapping com a anotação @RequestParam para recuperar o parâmetro da URL e mapeá-lo para o argumento do método. Por exemplo:
```
@RequestMapping(value="/method9")
@ResponseBody
public String method9(@RequestParam("id") int id){
return "method9 with id= "+id;
}
```
For this method to work, the parameter name should be "id" and it should be of type int.
- @RequestMapping método padrão: Se o valor estiver vazio para um método, ele funciona como método padrão para a classe do controlador. Por exemplo:
```
@RequestMapping()
@ResponseBody
public String defaultMethod(){
return "default method";
}
```
As you have seen above that we have mapped `/home` to `HomeController`, this method will be used for the default URI requests.
- @RequestMapping método de fallback: Podemos criar um método de fallback para a classe do controlador para garantir que estejamos capturando todas as solicitações do cliente mesmo que não haja métodos de manipulador correspondentes. É útil para enviar páginas de resposta 404 personalizadas para os usuários quando não houver métodos de manipulador para a solicitação.
```
@RequestMapping("*")
@ResponseBody
public String fallbackMethod(){
return "fallback method";
}
```
Programa de Teste Spring RestMapping
Podemos usar Spring RestTemplate para testar os diferentes métodos acima, mas hoje usarei comandos cURL para testar esses métodos porque são simples e não há muitos dados circulando. Eu criei um script de shell simples springTest.sh para invocar todos os métodos acima e imprimir sua saída. Parece o seguinte.
#!/bin/bash
echo "curl https://localhost:9090/SpringRequestMappingExample/home/method0";
curl https://localhost:9090/SpringRequestMappingExample/home/method0;
printf "\n\n*****\n\n";
echo "curl https://localhost:9090/SpringRequestMappingExample/home";
curl https://localhost:9090/SpringRequestMappingExample/home;
printf "\n\n*****\n\n";
echo "curl https://localhost:9090/SpringRequestMappingExample/home/xyz";
curl https://localhost:9090/SpringRequestMappingExample/home/xyz;
printf "\n\n*****\n\n";
echo "curl https://localhost:9090/SpringRequestMappingExample/home/method1";
curl https://localhost:9090/SpringRequestMappingExample/home/method1;
printf "\n\n*****\n\n";
echo "curl https://localhost:9090/SpringRequestMappingExample/home/method1/second";
curl https://localhost:9090/SpringRequestMappingExample/home/method1/second;
printf "\n\n*****\n\n";
echo "curl -X POST https://localhost:9090/SpringRequestMappingExample/home/method2";
curl -X POST https://localhost:9090/SpringRequestMappingExample/home/method2;
printf "\n\n*****\n\n";
echo "curl -X POST https://localhost:9090/SpringRequestMappingExample/home/method3";
curl -X POST https://localhost:9090/SpringRequestMappingExample/home/method3;
printf "\n\n*****\n\n";
echo "curl -X GET https://localhost:9090/SpringRequestMappingExample/home/method3";
curl -X GET https://localhost:9090/SpringRequestMappingExample/home/method3;
printf "\n\n*****\n\n";
echo "curl -H "name:pankaj" https://localhost:9090/SpringRequestMappingExample/home/method4";
curl -H "name:pankaj" https://localhost:9090/SpringRequestMappingExample/home/method4;
printf "\n\n*****\n\n";
echo "curl -H "name:pankaj" -H "id:1" https://localhost:9090/SpringRequestMappingExample/home/method5";
curl -H "name:pankaj" -H "id:1" https://localhost:9090/SpringRequestMappingExample/home/method5;
printf "\n\n*****\n\n";
echo "curl -H "Content-Type:text/html" https://localhost:9090/SpringRequestMappingExample/home/method6";
curl -H "Content-Type:text/html" https://localhost:9090/SpringRequestMappingExample/home/method6;
printf "\n\n*****\n\n";
echo "curl https://localhost:9090/SpringRequestMappingExample/home/method6";
curl https://localhost:9090/SpringRequestMappingExample/home/method6;
printf "\n\n*****\n\n";
echo "curl -H "Content-Type:text/html" -H "Accept:application/json" -i https://localhost:9090/SpringRequestMappingExample/home/method6";
curl -H "Content-Type:text/html" -H "Accept:application/json" -i https://localhost:9090/SpringRequestMappingExample/home/method6;
printf "\n\n*****\n\n";
echo "curl -H "Content-Type:text/html" -H "Accept:application/xml" -i https://localhost:9090/SpringRequestMappingExample/home/method6";
curl -H "Content-Type:text/html" -H "Accept:application/xml" -i https://localhost:9090/SpringRequestMappingExample/home/method6;
printf "\n\n*****\n\n";
echo "curl https://localhost:9090/SpringRequestMappingExample/home/method7/1";
curl https://localhost:9090/SpringRequestMappingExample/home/method7/1;
printf "\n\n*****\n\n";
echo "curl https://localhost:9090/SpringRequestMappingExample/home/method8/10/Lisa";
curl https://localhost:9090/SpringRequestMappingExample/home/method8/10/Lisa;
printf "\n\n*****\n\n";
echo "curl https://localhost:9090/SpringRequestMappingExample/home/method9?id=20";
curl https://localhost:9090/SpringRequestMappingExample/home/method9?id=20;
printf "\n\n*****DONE*****\n\n";
Observe que eu implantei minha aplicação web no Tomcat-7 e ela está sendo executada na porta 9090. SpringRequestMappingExample é o contexto do servlet da aplicação. Agora, quando executo este script através da linha de comando, obtenho a seguinte saída.
pankaj:~ pankaj$ ./springTest.sh
curl https://localhost:9090/SpringRequestMappingExample/home/method0
method0
*****
curl https://localhost:9090/SpringRequestMappingExample/home
default method
*****
curl https://localhost:9090/SpringRequestMappingExample/home/xyz
fallback method
*****
curl https://localhost:9090/SpringRequestMappingExample/home/method1
method1
*****
curl https://localhost:9090/SpringRequestMappingExample/home/method1/second
method1
*****
curl -X POST https://localhost:9090/SpringRequestMappingExample/home/method2
method2
*****
curl -X POST https://localhost:9090/SpringRequestMappingExample/home/method3
method3
*****
curl -X GET https://localhost:9090/SpringRequestMappingExample/home/method3
method3
*****
curl -H name:pankaj https://localhost:9090/SpringRequestMappingExample/home/method4
method4
*****
curl -H name:pankaj -H id:1 https://localhost:9090/SpringRequestMappingExample/home/method5
method5
*****
curl -H Content-Type:text/html https://localhost:9090/SpringRequestMappingExample/home/method6
method6
*****
curl https://localhost:9090/SpringRequestMappingExample/home/method6
fallback method
*****
curl -H Content-Type:text/html -H Accept:application/json -i https://localhost:9090/SpringRequestMappingExample/home/method6
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: application/json
Content-Length: 7
Date: Thu, 03 Jul 2014 18:14:10 GMT
method6
*****
curl -H Content-Type:text/html -H Accept:application/xml -i https://localhost:9090/SpringRequestMappingExample/home/method6
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: application/xml
Content-Length: 7
Date: Thu, 03 Jul 2014 18:14:10 GMT
method6
*****
curl https://localhost:9090/SpringRequestMappingExample/home/method7/1
method7 with id=1
*****
curl https://localhost:9090/SpringRequestMappingExample/home/method8/10/Lisa
method8 with id= 10 and name=Lisa
*****
curl https://localhost:9090/SpringRequestMappingExample/home/method9?id=20
method9 with id= 20
*****DONE*****
pankaj:~ pankaj$
A maioria desses são autoexplicativos, embora você possa querer verificar os métodos padrão e de fallback. Isso é tudo para Exemplo de Mapeamento de Solicitação Spring, espero que isso ajude você a entender esta anotação e suas várias características. Você deve baixar o projeto de exemplo no link abaixo e tentar diferentes cenários para explorá-lo mais a fundo.