Автор оригинала: 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 .