1. Обзор
В этом руководстве мы рассмотрим аннотации Spring Web из пакета org.springframework.web.bind.annotation
.
2. @RequestMapping
Проще говоря, @RequestMapping
помечает методы обработчика запросов внутри классов @Controller
; его можно настроить с помощью:
путь
или его псевдонимы,имя
изначение:
какой URL-адрес сопоставлен методуметод:
совместимые методы HTTPparams:
фильтрует запросы на основе наличия, отсутствия или значения параметров HTTP.заголовки:
фильтрует запросы на основе наличия, отсутствия или значения заголовков HTTP.потребляет:
какие типы мультимедиа метод может использовать в теле запроса HTTPпроизводит:
какие типы мультимедиа метод может создавать в теле ответа HTTP
Вот краткий пример того, как это выглядит:
@Controller
class VehicleController {
@RequestMapping(value = "/vehicles/home", method = RequestMethod.GET)
String home() {
return "home";
}
}
Мы можем предоставить настройки по умолчанию для всех методов обработчика в классе @Controller
, если применим эту аннотацию на уровне класса. Единственным исключением является URL-адрес, который Spring не переопределяет с помощью настроек уровня метода, а добавляет две части пути.
Например, следующая конфигурация имеет тот же эффект, что и приведенная выше:
@Controller
@RequestMapping(value = "/vehicles", method = RequestMethod.GET)
class VehicleController {
@RequestMapping("/home")
String home() {
return "home";
}
}
Кроме того, @GetMapping
, @PostMapping
, @PutMapping
, @DeleteMapping
и @PatchMapping
являются различными вариантами @RequestMapping
с методом HTTP, уже установленным на GET, POST, PUT, DELETE и PATCH соответственно.
Они доступны с момента выпуска Spring 4.3.
3. @RequestBody
Давайте перейдем к @RequestBody
, который сопоставляет тело HTTP-запроса с объектом :
@PostMapping("/save")
void saveVehicle(@RequestBody Vehicle vehicle) {
// ...
}
Десериализация выполняется автоматически и зависит от типа содержимого запроса.
4. @PathVariable
Далее поговорим о @PathVariable
.
Эта аннотация указывает, что аргумент метода привязан к переменной шаблона URI . Мы можем указать шаблон URI с помощью аннотации @RequestMapping
и привязать аргумент метода к одной из частей шаблона с помощью @PathVariable
.
Мы можем добиться этого с помощью имени
или его псевдонима, аргумента значения :
@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable("id") long id) {
// ...
}
Если имя детали в шаблоне совпадает с именем аргумента метода, то его можно не указывать в аннотации:
@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable long id) {
// ...
}
Более того, мы можем пометить переменную пути как необязательную, установив для требуемого
аргумента значение false:
@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable(required = false) long id) {
// ...
}
5. @RequestParam
Мы используем @RequestParam
для доступа к параметрам HTTP-запроса :
@RequestMapping
Vehicle getVehicleByParam(@RequestParam("id") long id) {
// ...
}
Он имеет те же параметры конфигурации, что и аннотация @PathVariable
.
В дополнение к этим настройкам с помощью @RequestParam
мы можем указать введенное значение, когда Spring не находит пустое значение в запросе. Для этого мы должны установить аргумент defaultValue
.
Предоставление значения по умолчанию неявно устанавливает для параметра required
значение false:
@RequestMapping("/buy")
Car buyCar(@RequestParam(defaultValue = "5") int seatCount) {
// ...
}
Помимо параметров, есть и другие части HTTP-запроса, к которым мы можем получить доступ: файлы cookie и заголовки . Мы можем получить к ним доступ с помощью аннотаций @CookieValue
и @RequestHeader
соответственно.
Мы можем настроить их так же, как @RequestParam
.
6. Аннотации обработки ответов
В следующих разделах мы увидим наиболее распространенные аннотации для управления HTTP-ответами в Spring MVC.
6.1. @ResponseBody
Если мы пометим метод обработчика запроса с помощью @ResponseBody ,
Spring будет рассматривать результат метода как сам ответ :
@ResponseBody
@RequestMapping("/hello")
String hello() {
return "Hello World!";
}
Если мы аннотируем класс @Controller
этой аннотацией, все методы обработчика запросов будут использовать ее.
6.2. @ExceptionHandler
С помощью этой аннотации мы можем объявить собственный метод обработчика ошибок . Spring вызывает этот метод, когда метод обработчика запросов выдает любое из указанных исключений.
Пойманное исключение можно передать методу в качестве аргумента:
@ExceptionHandler(IllegalArgumentException.class)
void onIllegalArgumentException(IllegalArgumentException exception) {
// ...
}
6.3. @ResponseStatus
Мы можем указать желаемый HTTP-статус ответа , если мы аннотируем метод обработчика запроса этой аннотацией. Мы можем объявить код состояния с аргументом кода
или его псевдонимом, аргументом значения .
Кроме того, мы можем указать причину, используя аргумент
Reason.
Мы также можем использовать его вместе с @ExceptionHandler
:
@ExceptionHandler(IllegalArgumentException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
void onIllegalArgumentException(IllegalArgumentException exception) {
// ...
}
Дополнительные сведения о статусе ответа HTTP см . в этой статье .
7. Другие веб-аннотации
Некоторые аннотации не управляют HTTP-запросами или ответами напрямую. В следующих разделах мы представим наиболее распространенные из них.
7.1. @контроллер
Мы можем определить контроллер Spring MVC с помощью @Controller
. Для получения дополнительной информации, пожалуйста, посетите нашу статью об аннотациях Spring Bean .
7.2. @RestController
@RestController
объединяет @Controller
и @ResponseBody
. _
Таким образом, следующие объявления эквивалентны:
@Controller
@ResponseBody
class VehicleRestController {
// ...
}
@RestController
class VehicleRestController {
// ...
}
7.3. @ModelAttribute
С помощью этой аннотации мы можем получить доступ к элементам, которые уже находятся в модели MVC @Controller,
предоставив ключ модели:
@PostMapping("/assemble")
void assembleVehicle(@ModelAttribute("vehicle") Vehicle vehicleInModel) {
// ...
}
Как и в случае с @PathVariable
и @RequestParam
, нам не нужно указывать ключ модели, если аргумент имеет такое же имя:
@PostMapping("/assemble")
void assembleVehicle(@ModelAttribute Vehicle vehicle) {
// ...
}
Кроме того, @ModelAttribute
имеет еще одно применение: если мы аннотируем им метод, Spring автоматически добавит возвращаемое значение метода в модель :
@ModelAttribute("vehicle")
Vehicle getVehicle() {
// ...
}
Как и раньше, нам не нужно указывать ключ модели, Spring по умолчанию использует имя метода:
@ModelAttribute
Vehicle vehicle() {
// ...
}
Прежде чем Spring вызовет метод обработчика запросов, он вызывает все аннотированные методы @ModelAttribute
в классе.
Более подробную информацию о @ModelAttribute
можно найти в этой статье .
7.4. @CrossOrigin
@CrossOrigin
обеспечивает междоменную связь для аннотированных методов обработчика запросов:
@CrossOrigin
@RequestMapping("/hello")
String hello() {
return "Hello World!";
}
Если мы помечаем им класс, он применяется ко всем методам обработчика запросов в нем.
Мы можем точно настроить поведение CORS с помощью аргументов этой аннотации.
Для получения более подробной информации посетите эту статью .
8. Заключение
В этой статье мы увидели, как мы можем обрабатывать HTTP-запросы и ответы с помощью Spring MVC.
Как обычно, примеры доступны на GitHub .