@RequestMapping est l’une des annotations les plus largement utilisées dans Spring MVC. L’annotation org.springframework.web.bind.annotation.RequestMapping
est utilisée pour mapper les requêtes web sur des classes de gestionnaires spécifiques et/ou des méthodes de gestionnaires.
@RequestMapping
peut être appliqué à la classe du contrôleur ainsi qu’aux méthodes. Aujourd’hui, nous examinerons divers usages de cette annotation avec des exemples et d’autres annotations telles que @PathVariable
et @RequestParam
.
Spring @RequestMapping
-
@RequestMapping avec la Classe: Nous pouvons l’utiliser avec la définition de classe pour créer l’URI de base. Par exemple:
@Controller @RequestMapping("/home") public class HomeController { }
Maintenant /home est l’URI pour lequel ce contrôleur sera utilisé. Ce concept est très similaire au contexte de servlet d’une application web.
-
@RequestMapping avec la méthode: Nous pouvons l’utiliser avec la méthode pour fournir le modèle d’URI pour lequel la méthode du gestionnaire sera utilisée. Par exemple:
@RequestMapping(value="/method0") @ResponseBody public String method0(){ return "method0"; }
Cette annotation ci-dessus peut également être écrite comme
@RequestMapping("/method0")
. En passant, j’utilise @ResponseBody pour envoyer la réponse String pour cette requête web, c’est fait pour garder l’exemple simple. Comme je le fais toujours, j’utiliserai ces méthodes dans une application Spring MVC et les testerai avec un programme ou un script simple. -
@RequestMapping avec plusieurs URI : Nous pouvons utiliser une seule méthode pour gérer plusieurs URI, par exemple :
@RequestMapping(value={"/method1","/method1/second"}) @ResponseBody public String method1(){ return "method1"; }
Si vous regardez le code source de l’annotation RequestMapping, vous verrez que toutes ses variables sont des tableaux. Nous pouvons créer un tableau de chaînes de caractères pour les mappages d’URI de la méthode de gestionnaire.
-
@RequestMapping avec la méthode HTTP: Parfois, nous voulons effectuer différentes opérations en fonction de la méthode HTTP utilisée, même si l’URI de la requête reste le même. Nous pouvons utiliser la variable de méthode @RequestMapping pour restreindre les méthodes HTTP pour lesquelles cette méthode sera invoquée. Par exemple:
@RequestMapping(value="/method2", method=RequestMethod.POST) @ResponseBody public String method2(){ return "method2"; } @RequestMapping(value="/method3", method={RequestMethod.POST,RequestMethod.GET}) @ResponseBody public String method3(){ return "method3"; }
-
@RequestMapping avec les en-têtes: Nous pouvons spécifier les en-têtes qui doivent être présents pour invoquer la méthode du gestionnaire. Par exemple:
@RequestMapping(value="/method4", headers="name=pankaj") @ResponseBody public String method4(){ return "method4"; } @RequestMapping(value="/method5", headers={"name=pankaj", "id=1"}) @ResponseBody public String method5(){ return "method5"; }
-
@RequestMapping avec Produits et Consommations: Nous pouvons utiliser l’en-tête
Content-Type
etAccept
pour savoir les contenus de la demande et quel est le message MIME qu’il veut en réponse. Pour plus de clarté, @RequestMapping fournit des variables produces et consumes où nous pouvons spécifier le type de contenu de la demande pour lequel la méthode sera invoquée et le type de contenu de la réponse. Par exemple:@RequestMapping(value="/method6", produces={"application/json","application/xml"}, consumes="text/html") @ResponseBody public String method6(){ return "method6"; }
La méthode ci-dessus ne peut consommer que des messages avec Content-Type en tant que text/html et peut produire des messages de type application/json et application/xml.
Spring @PathVariable
-
@RequestMapping avec @PathVariable: L’annotation RequestMapping peut être utilisée pour gérer des URI dynamiques où une ou plusieurs des valeurs de l’URI fonctionnent comme un paramètre. Nous pouvons même spécifier une Expression Régulière pour le paramètre dynamique de l’URI afin d’accepter uniquement un type spécifique d’entrée. Cela fonctionne avec l’annotation @PathVariable à travers laquelle nous pouvons mapper la variable d’URI à l’un des arguments de la méthode. Par exemple :
@RequestMapping(value="/method7/{id}") @ResponseBody public String method7(@PathVariable("id") int id){ return "method7 avec id="+id; } @RequestMapping(value="/method8/{id:[\\d]+}/{name}") @ResponseBody public String method8(@PathVariable("id") long id, @PathVariable("name") String name){ return "method8 avec id= "+id+" et nom="+name; }
Spring @RequestParam
- @RequestMapping avec @RequestParam pour les paramètres d’URL: Parfois, nous obtenons des paramètres dans l’URL de la requête, principalement dans les requêtes GET. Nous pouvons utiliser @RequestMapping avec l’annotation @RequestParam pour récupérer le paramètre d’URL et le mapper à l’argument de la méthode. Par exemple :
```
@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éthode par défaut: Si la valeur est vide pour une méthode, elle fonctionne comme méthode par défaut pour la classe du contrôleur. Par exemple :
```
@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éthode de secours: Nous pouvons créer une méthode de secours pour la classe du contrôleur pour nous assurer que nous interceptons toutes les demandes des clients même s’il n’y a pas de méthodes de traitement correspondantes. C’est utile pour envoyer des pages de réponse 404 personnalisées aux utilisateurs lorsqu’il n’y a pas de méthodes de traitement pour la demande.
```
@RequestMapping("*")
@ResponseBody
public String fallbackMethod(){
return "fallback method";
}
```
Programme de test Spring RestMapping
Nous pouvons utiliser Spring RestTemplate pour tester les différentes méthodes ci-dessus, mais aujourd’hui je vais utiliser des commandes cURL pour tester ces méthodes car elles sont simples et qu’il n’y a pas beaucoup de données en circulation. J’ai créé un simple script shell springTest.sh pour appeler toutes les méthodes ci-dessus et afficher leur sortie. Il ressemble à ce qui suit.
#!/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";
Notez que j’ai déployé mon application web sur Tomcat-7 et qu’elle fonctionne sur le port 9090. SpringRequestMappingExample est le contexte du servlet de l’application. Maintenant, lorsque j’exécute ce script via la ligne de commande, j’obtiens la sortie suivante.
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$
La plupart de ces éléments sont auto-explicatifs, bien que vous devriez vérifier les méthodes par défaut et de secours. C’est tout pour Exemple de mappage de requête Spring, j’espère que cela vous aidera à comprendre cette annotation et ses différentes fonctionnalités. Vous devriez télécharger le projet exemple depuis le lien ci-dessous et essayer différents scénarios pour l’explorer davantage.