«1. Обзор
В этом руководстве мы рассмотрим аннотации Spring Web из пакета org.springframework.web.bind.annotation.
2. @RequestMapping
Проще говоря, @RequestMapping помечает методы обработчика запросов внутри классов @Controller; его можно настроить, используя:
-
путь или его псевдонимы, имя и значение: какой URL-адрес метода сопоставлен с методом: параметры совместимых методов HTTP: фильтрует запросы на основе наличия, отсутствия или значения параметров HTTP заголовки: фильтры запросы, основанные на наличии, отсутствии или значении HTTP-заголовков. выглядит так:
Мы можем предоставить настройки по умолчанию для всех методов обработчика в классе @Controller, если применим эту аннотацию на уровне класса. Единственным исключением является URL-адрес, который Spring не переопределяет с помощью настроек уровня метода, а добавляет две части пути.
@Controller
class VehicleController {
@RequestMapping(value = "/vehicles/home", method = RequestMethod.GET)
String home() {
return "home";
}
}
Например, следующая конфигурация имеет тот же эффект, что и предыдущая:
Более того, @GetMapping, @PostMapping, @PutMapping, @DeleteMapping и @PatchMapping — это разные варианты @RequestMapping с HTTP уже установлен метод GET, POST, PUT, DELETE и PATCH соответственно.
@Controller
@RequestMapping(value = "/vehicles", method = RequestMethod.GET)
class VehicleController {
@RequestMapping("/home")
String home() {
return "home";
}
}
Они доступны начиная с выпуска 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) {
// ...
}
Кроме того, мы можем пометить переменную пути как необязательную, установив для аргумента required значение false:
@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable long id) {
// ...
}
5. @RequestParam
@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable(required = false) long id) {
// ...
}
Мы используем @RequestParam для доступа к параметрам HTTP-запроса: ~ ~~
Он имеет те же параметры конфигурации, что и аннотация @PathVariable.
@RequestMapping
Vehicle getVehicleByParam(@RequestParam("id") long id) {
// ...
}
В дополнение к этим настройкам, с помощью @RequestParam мы можем указать введенное значение, когда Spring не находит пустое значение в запросе. Для этого мы должны установить аргумент defaultValue.
Предоставление значения по умолчанию неявно устанавливает для required значение false:
Помимо параметров, есть и другие части HTTP-запроса, к которым мы можем получить доступ: файлы cookie и заголовки. Мы можем получить к ним доступ с помощью аннотаций @CookieValue и @RequestHeader соответственно.
@RequestMapping("/buy")
Car buyCar(@RequestParam(defaultValue = "5") int seatCount) {
// ...
}
Мы можем настроить их так же, как @RequestParam.
6. Аннотации обработки ответов
В следующих разделах мы увидим наиболее распространенные аннотации для управления HTTP-ответами в Spring MVC.
6.1. @ResponseBody
Если мы пометим метод обработчика запросов с помощью @ResponseBody, Spring обрабатывает результат метода как сам ответ:
Если мы аннотируем класс @Controller этой аннотацией, все методы обработчика запросов будут используй это.
@ResponseBody
@RequestMapping("/hello")
String hello() {
return "Hello World!";
}
6.2. @ExceptionHandler
С помощью этой аннотации мы можем объявить собственный метод обработчика ошибок. Spring вызывает этот метод, когда метод обработчика запросов выдает любое из указанных исключений.
Перехваченное исключение можно передать методу в качестве аргумента:
6.3. @ResponseStatus
@ExceptionHandler(IllegalArgumentException.class)
void onIllegalArgumentException(IllegalArgumentException exception) {
// ...
}
Мы можем указать желаемый HTTP-статус ответа, если аннотируем метод обработчика запроса этой аннотацией. Мы можем объявить код состояния с аргументом кода или его псевдонимом, аргументом значения.
Кроме того, мы можем указать причину, используя аргумент Reason.
Мы также можем использовать его вместе с @ExceptionHandler:
Для получения дополнительной информации о статусе ответа HTTP, пожалуйста, посетите эту статью.
@ExceptionHandler(IllegalArgumentException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
void onIllegalArgumentException(IllegalArgumentException exception) {
// ...
}
7. Другие веб-аннотации
«Некоторые аннотации не управляют HTTP-запросами или ответами напрямую. В следующих разделах мы представим наиболее распространенные из них.
7.1. @Controller
Мы можем определить контроллер 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.