Voorbeeld van Spring MVC @RequestMapping-annotatie met Controller, Methoden, Headers, Params, @RequestParam, @PathVariable

@RequestMapping is een van de meest gebruikte Spring MVC annotaties. De org.springframework.web.bind.annotation.RequestMapping annotatie wordt gebruikt om webverzoeken toe te wijzen aan specifieke handlerklassen en/of handlermethoden. @RequestMapping kan worden toegepast op de controllerklasse en ook op methoden. Vandaag zullen we kijken naar verschillende toepassingen van deze annotatie met voorbeelden en andere annotaties zoals @PathVariable en @RequestParam.

Spring @RequestMapping

  1. @RequestMapping met Klasse: We kunnen het gebruiken bij de klasse-definitie om de basis-URI te maken. Bijvoorbeeld:

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

    Nu is /home de URI waarvoor deze controller zal worden gebruikt. Dit concept is zeer vergelijkbaar met de servletcontext van een webtoepassing.

  2. @RequestMapping met Methode: We kunnen het gebruiken met de methode om het URI-patroon op te geven waarvoor de handlermethode zal worden gebruikt. Bijvoorbeeld:

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

    Bovenstaande annotatie kan ook worden geschreven als @RequestMapping("/method0"). Terzijde, ik gebruik @ResponseBody om de String-respons voor dit webverzoek te verzenden, dit wordt gedaan om het voorbeeld eenvoudig te houden. Zoals altijd zal ik deze methoden gebruiken in een Spring MVC-toepassing en ze testen met een eenvoudig programma of script.

  3. @RequestMapping met meerdere URI’s: We kunnen een enkele methode gebruiken voor het afhandelen van meerdere URI’s, bijvoorbeeld:

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

    Als je naar de broncode van RequestMapping-annotatie kijkt, zul je zien dat al zijn variabelen arrays zijn. We kunnen een String-array maken voor de URI-mappingen voor de handler-methode.

  4. @RequestMapping met HTTP-methode: Soms willen we verschillende bewerkingen uitvoeren op basis van de gebruikte HTTP-methode, ook al blijft de aanvraag-URI hetzelfde. We kunnen de @RequestMapping methodevariabele gebruiken om de HTTP-methoden te beperken waarvoor deze methode zal worden aangeroepen. Bijvoorbeeld:

    @RequestMapping(value="/methode2", method=RequestMethod.POST)
    @ResponseBody
    public String methode2(){
    	return "methode2";
    }
    	
    @RequestMapping(value="/methode3", method={RequestMethod.POST,RequestMethod.GET})
    @ResponseBody
    public String methode3(){
    	return "methode3";
    }
    
  5. @RequestMapping met Headers: We kunnen de headers specificeren die aanwezig moeten zijn om de handlermethode aan te roepen. Bijvoorbeeld:

    @RequestMapping(value="/methode4", headers="naam=pankaj")
    @ResponseBody
    public String methode4(){
    	return "methode4";
    }
    	
    @RequestMapping(value="/methode5", headers={"naam=pankaj", "id=1"})
    @ResponseBody
    public String methode5(){
    	return "methode5";
    }
    
  6. @RequestMapping met Produces en Consumes: We kunnen gebruikmaken van de kop ‘Content-Type’ en ‘Accept’ om uit te vinden welke inhoud het verzoek heeft en wat de mime-boodschap is die het als reactie wil hebben. Voor duidelijkheid biedt @RequestMapping de variabelen produces en consumes waarin we het request-content-type kunnen specificeren waarvoor de methode wordt aangeroepen en het response-content-type. Bijvoorbeeld:

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

    Bovenstaande methode kan alleen berichten consumeren met Content-Type als text/html en kan berichten produceren van het type application/json en application/xml.

Spring @PathVariable

  1. @RequestMapping met @PathVariable: De RequestMapping-annotatie kan worden gebruikt om dynamische URI’s te verwerken waarbij een of meer van de URI-waarden als parameters fungeren. We kunnen zelfs een reguliere expressie specificeren voor de URI-dynamische parameter om alleen een specifiek type invoer te accepteren. Het werkt met de @PathVariable-annotatie, waarmee we de URI-variabele aan een van de methode-argumenten kunnen koppelen. Bijvoorbeeld:

    @RequestMapping(value="/methode7/{id}")
    @ResponseBody
    public String methode7(@PathVariable("id") int id){
    	return "methode7 met id="+id;
    }
    	
    @RequestMapping(value="/methode8/{id:[\\d]+}/{naam}")
    @ResponseBody
    public String methode8(@PathVariable("id") long id, @PathVariable("naam") String naam){
    	return "methode8 met id= "+id+" en naam="+naam;
    }
    

Spring @RequestParam

  1. @RequestMapping met @RequestParam voor URL-parameters: Soms krijgen we parameters in de request-URL, meestal in GET-verzoeken. We kunnen @RequestMapping gebruiken met de @RequestParam-annotatie om de URL-parameter op te halen en toe te wijzen aan het methodenargument. Bijvoorbeeld:
```
@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 standaardmethode: Als de waarde leeg is voor een methode, fungeert het als de standaardmethode voor de controllerklasse. Bijvoorbeeld:
```
@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 fallback-methode: We kunnen een fallback-methode maken voor de controllerklasse om ervoor te zorgen dat we alle clientverzoeken opvangen, zelfs als er geen overeenkomende verwerkermethoden zijn. Het is handig om aangepaste 404-reactiepagina’s naar gebruikers te sturen wanneer er geen verwerkermethoden zijn voor het verzoek.
```
@RequestMapping("*")
@ResponseBody
public String fallbackMethod(){
	return "fallback method";
}
```

Spring RestMapping Test Programma

We kunnen Spring RestTemplate gebruiken om de verschillende bovenstaande methoden te testen, maar vandaag zal ik cURL-commando’s gebruiken om deze methoden te testen omdat deze eenvoudig zijn en er niet veel gegevens rondgaan. Ik heb een eenvoudig shellscript gemaakt springTest.sh om alle bovenstaande methoden aan te roepen en hun uitvoer af te drukken. Het ziet er als volgt uit.

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

Merk op dat ik mijn webapplicatie heb ingezet op Tomcat-7 en dat deze draait op poort 9090. SpringRequestMappingExample is de servletcontext van de applicatie. Nu, wanneer ik dit script uitvoer via de opdrachtregel, krijg ik de volgende uitvoer.

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$ 

De meeste hiervan zijn vanzelfsprekend, hoewel je misschien de standaard- en fallback-methoden wilt controleren. Dat is alles voor Spring RequestMapping Example, ik hoop dat het je zal helpen bij het begrijpen van deze annotatie en de verschillende functies ervan. Je kunt het voorbeeldproject downloaden via onderstaande link en verschillende scenario’s uitproberen om het verder te verkennen.

Download Spring MVC RequestMapping Project

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