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