Spring MVC @RequestMapping Annotation Beispiel mit Controller, Methoden, Headers, Params, @RequestParam, @PathVariable

@RequestMapping ist eine der am weitesten verbreiteten Spring MVC-Annotationen. Die Annotation org.springframework.web.bind.annotation.RequestMapping wird verwendet, um Webanfragen auf spezifische Handler-Klassen und/oder -Methoden abzubilden. @RequestMapping kann sowohl auf die Controller-Klasse als auch auf Methoden angewendet werden. Heute werden wir uns verschiedene Verwendungen dieser Annotation mit Beispielen und anderen Annotationen wie @PathVariable und @RequestParam ansehen.

Spring @RequestMapping

  1. @RequestMapping mit Klasse: Wir können es mit der Klassendefinition verwenden, um die Basis-URI zu erstellen. Zum Beispiel:

    @Controller
    @RequestMapping("/home")
    public class HomeController {
    
    }
    

    Jetzt ist /home die URI, für die dieser Controller verwendet wird. Dieses Konzept ähnelt sehr dem Servlet-Context einer Webanwendung.

  2. @RequestMapping mit Methode: Wir können es mit der Methode verwenden, um das URI-Muster anzugeben, für das die Handler-Methode verwendet wird. Zum Beispiel:

    @RequestMapping(value="/methode0")
    @ResponseBody
    public String methode0(){
    	return "methode0";
    }
    

    Diese Annotation kann auch als @RequestMapping("/methode0") geschrieben werden. Als Randnotiz verwende ich @ResponseBody, um die String-Antwort für diese Webanfrage zu senden, dies wird gemacht, um das Beispiel einfach zu halten. Wie immer werde ich diese Methoden in einer Spring MVC-Anwendung verwenden und sie mit einem einfachen Programm oder Skript testen.

  3. @RequestMapping mit mehreren URIs: Wir können eine einzige Methode verwenden, um mehrere URIs zu verarbeiten, zum Beispiel:

    @RequestMapping(value={"/method1","/method1/second"})
    @ResponseBody
    public String method1(){
    	return "method1";
    }
    

    Wenn Sie den Quellcode der RequestMapping-Annotation betrachten, werden Sie feststellen, dass alle Variablen Arrays sind. Wir können ein String-Array für die URI-Zuordnungen für die Handler-Methode erstellen.

  4. @RequestMapping mit HTTP-Methode: Manchmal möchten wir unterschiedliche Operationen basierend auf der verwendeten HTTP-Methode durchführen, auch wenn die Anforderungs-URI dieselbe bleibt. Wir können die @RequestMapping-Methodenvariable verwenden, um die HTTP-Methoden einzuschränken, für die diese Methode aufgerufen wird. Zum Beispiel:

    @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";
    }
    
  5. @RequestMapping mit Headern: Wir können die Header angeben, die vorhanden sein sollten, um die Handler-Methode aufzurufen. Zum Beispiel:

    @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";
    }
    
  6. @RequestMapping mit Produces und Consumes: Wir können die Header Content-Type und Accept verwenden, um den Inhalt des Requests zu bestimmen und welche MIME-Nachricht als Antwort gewünscht ist. Zur Klarstellung stellt @RequestMapping die Variablen produces und consumes bereit, in denen wir den Request-Content-Type angeben können, für den die Methode aufgerufen wird, sowie den Response-Content-Type. Zum Beispiel:

    @RequestMapping(value="/method6", produces={"application/json","application/xml"}, consumes="text/html")
    @ResponseBody
    public String method6(){
        return "method6";
    }
    

    Die oben genannte Methode kann nur Nachrichten mit Content-Type als text/html verarbeiten und kann Nachrichten vom Typ application/json und application/xml produzieren.

Spring @PathVariable

  1. @RequestMapping mit @PathVariable: Die RequestMapping-Annotation kann verwendet werden, um dynamische URIs zu behandeln, bei denen einer oder mehrere der URI-Werte als Parameter fungieren. Wir können sogar Reguläre Ausdrücke für dynamische URI-Parameter angeben, um nur einen bestimmten Typ von Eingaben zu akzeptieren. Es funktioniert mit der @PathVariable-Annotation, durch die wir die URI-Variable einem der Methodenargumente zuordnen können. Zum Beispiel:

    @RequestMapping(value="/methode7/{id}")
    @ResponseBody
    public String methode7(@PathVariable("id") int id){
    	return "Methode7 mit id="+id;
    }
    	
    @RequestMapping(value="/methode8/{id:[\\d]+}/{name}")
    @ResponseBody
    public String methode8(@PathVariable("id") long id, @PathVariable("name") String name){
    	return "Methode8 mit id= "+id+" und Name="+name;
    }
    

Spring @RequestParam

  1. @RequestMapping mit @RequestParam für URL-Parameter: Manchmal erhalten wir Parameter in der Anfrage-URL, meistens bei GET-Anfragen. Wir können @RequestMapping mit der @RequestParam-Annotation verwenden, um den URL-Parameter abzurufen und ihm das Methodenargument zuzuordnen. Zum Beispiel:
```
@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.
  1. @RequestMapping Standardmethode: Wenn der Wert für eine Methode leer ist, fungiert sie als Standardmethode für die Controller-Klasse. Zum Beispiel:
```
@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.
  1. @RequestMapping Ausweichmethode: Wir können eine Ausweichmethode für die Controller-Klasse erstellen, um sicherzustellen, dass wir alle Clientanfragen abfangen, auch wenn es keine passenden Handlermethoden gibt. Es ist nützlich, benutzerdefinierte 404-Antwortseiten an Benutzer zu senden, wenn keine Handlermethoden für die Anfrage vorhanden sind.
```
@RequestMapping("*")
@ResponseBody
public String fallbackMethod(){
	return "fallback method";
}
```

Spring RestMapping Testprogramm

Wir können Spring RestTemplate verwenden, um die oben genannten Methoden zu testen, aber heute werde ich cURL-Befehle verwenden, um diese Methoden zu testen, weil sie einfach sind und nicht viel Daten fließen. Ich habe ein einfaches Shell-Skript springTest.sh erstellt, um alle oben genannten Methoden aufzurufen und ihre Ausgabe zu drucken. Es sieht wie folgt aus.

#!/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";

Beachten Sie, dass ich meine Webanwendung auf Tomcat-7 bereitgestellt habe und sie auf Port 9090 läuft. SpringRequestMappingBeispiel ist der Servlet-Kontext der Anwendung. Wenn ich dieses Skript nun über die Befehlszeile ausführe, erhalte ich folgende Ausgabe.

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$ 

Die meisten davon sind selbsterklärend, obwohl Sie die Standard- und Ausweichmethoden überprüfen möchten. Das ist alles für das Spring RequestMapping-Beispiel. Ich hoffe, es wird Ihnen helfen, diese Annotation und ihre verschiedenen Funktionen zu verstehen. Sie sollten das Beispielsprojekt über den untenstehenden Link herunterladen und verschiedene Szenarien ausprobieren, um es weiter zu erkunden.

Spring MVC RequestMapping-Projekt herunterladen

Source:
https://www.digitalocean.com/community/tutorials/spring-requestmapping-requestparam-pathvariable-example