Пример аннотации Spring MVC @RequestMapping с контроллером, методами, заголовками, параметрами, @RequestParam, @PathVariable

@RequestMapping – одна из самых широко используемых аннотаций Spring MVC. Аннотация org.springframework.web.bind.annotation.RequestMapping используется для сопоставления веб-запросов с определенными классами обработчиков и/или методами обработчиков. @RequestMapping может применяться как к классу контроллера, так и к методам. Сегодня мы рассмотрим различные способы использования этой аннотации с примерами и другими аннотациями @PathVariable и @RequestParam.

Spring @RequestMapping

  1. @RequestMapping с классом: Мы можем использовать его с определением класса для создания базового URI. Например:

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

    Теперь /home – это URI, для которого будет использоваться этот контроллер. Этот концепт очень похож на контекст сервлета в веб-приложении.

  2. @RequestMapping с Методом: Мы можем использовать его с методом, чтобы предоставить шаблон URI, для которого будет использоваться метод обработчика. Например:

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

    Вышеуказанную аннотацию также можно записать как @RequestMapping("/method0"). Кстати, я использую @ResponseBody для отправки строкового ответа для этого веб-запроса, это сделано для упрощения примера. Как я всегда делаю, я буду использовать эти методы в приложении Spring MVC и тестировать их с помощью простой программы или скрипта.

  3. @RequestMapping с несколькими URI: Мы можем использовать один метод для обработки нескольких URI, например:

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

    Если вы посмотрите на исходный код аннотации RequestMapping, вы увидите, что все ее переменные являются массивами. Мы можем создать массив строк для URI-сопоставления метода обработчика.

  4. @RequestMapping с методом HTTP: Иногда нам нужно выполнять различные операции в зависимости от используемого метода HTTP, даже если URI запроса остается тем же. Мы можем использовать переменную метода @RequestMapping, чтобы ограничить методы HTTP, для которых этот метод будет вызываться. Например:

    @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 с заголовками: Мы можем указать заголовки, которые должны присутствовать для вызова метода обработчика. Например:

    @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 с Produces и Consumes: Мы можем использовать заголовок Content-Type и Accept, чтобы определить содержимое запроса и какое MIME-сообщение он хочет получить в ответ. Для ясности @RequestMapping предоставляет переменные produces и consumes, где мы можем указать тип содержимого запроса, для которого будет вызван метод, и тип содержимого ответа. Например:

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

    Вышеуказанный метод может обрабатывать сообщение только с Content-Type как text/html и может производить сообщения типа application/json и application/xml.

Spring @PathVariable

  1. @RequestMapping с @PathVariable: Аннотация RequestMapping может использоваться для обработки динамических URI, где одно или несколько значений URI работают как параметр. Мы можем даже указать регулярное выражение для динамического параметра URI, чтобы принимать только определенный тип ввода. Она работает с аннотацией @PathVariable, через которую мы можем сопоставить переменную URI с одним из аргументов метода. Например:

    @RequestMapping(value="/method7/{id}")
    @ResponseBody
    public String method7(@PathVariable("id") int id){
    	return "method7 с id="+id;
    }
    	
    @RequestMapping(value="/method8/{id:[\\d]+}/{name}")
    @ResponseBody
    public String method8(@PathVariable("id") long id, @PathVariable("name") String name){
    	return "method8 с id= "+id+" и именем="+name;
    }
    

Spring @RequestParam

  1. @RequestMapping с @RequestParam для параметров URL: Иногда мы получаем параметры в URL-запросе, в основном в GET-запросах. Мы можем использовать @RequestMapping с аннотацией @RequestParam, чтобы извлечь параметр URL и сопоставить его с аргументом метода. Например:
```
@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 метод по умолчанию: Если значение отсутствует для метода, он работает как метод по умолчанию для класса контроллера. Например:
```
@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 метод резервного вызова: Мы можем создать метод резервного вызова для класса контроллера, чтобы убедиться, что мы перехватываем все запросы клиента, даже если нет соответствующих методов обработчика. Это полезно для отправки пользовательских страниц с ответами 404, когда нет методов обработчика для запроса.
```
@RequestMapping("*")
@ResponseBody
public String fallbackMethod(){
	return "fallback method";
}
```

Программа тестирования Spring RestMapping

Мы можем использовать Spring RestTemplate для тестирования различных вышеуказанных методов, но сегодня я буду использовать команды cURL для тестирования этих методов, потому что они просты и вокруг них не много данных. Я создал простой сценарий командной оболочки springTest.sh, чтобы вызвать все вышеуказанные методы и вывести их результаты. Это выглядит следующим образом.

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

Обратите внимание, что я развернул свое веб-приложение на Tomcat-7, и оно работает на порту 9090. SpringRequestMappingExample – это контекст сервлета приложения. Теперь, когда я выполняю этот сценарий через командную строку, я получаю следующий результат.

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$ 

Большинство из них самоочевидны, хотя вам может захотеться проверить методы по умолчанию и резервные варианты. Вот и все для Пример запроса Spring Mapping, надеюсь, это поможет вам понять эту аннотацию и её различные возможности. Вы можете загрузить образец проекта по ссылке ниже и попробовать разные сценарии для дальнейшего изучения.

Загрузить проект Spring MVC RequestMapping

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