• Spring Web Annotations (текуща статия) • Spring Boot Annotations
• Анотации за пролетно планиране
• Пролетни анотации на данни
• Анотации на пролетен боб
1. Общ преглед
В този урок ще изследваме пролетните уеб анотации от пакета org.springframework.web.bind.annotation .
2. @RequestMapping
Казано по-просто, @RequestMapping марка по заявките методи вътре @Controller класове; може да се конфигурира с помощта на:
- path или неговите псевдоними, име и стойност: към кой URL адрес е съотнесен методът
- метод: съвместими HTTP методи
- params: филтрира заявки въз основа на присъствие, отсъствие или стойност на 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 не намери или е празна стойност в заявката. За да постигнем това, трябва да зададем аргумента defaultValue .
Осигуряване на стойност по подразбиране по подразбиране моделите изисква да невярно:
@RequestMapping("/buy") Car buyCar(@RequestParam(defaultValue = "5") int seatCount) { // ... }
Освен параметри, има и други части на HTTP заявки, до които имаме достъп: бисквитки и заглавки . Можем да получим достъп до тях с анотациите @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
We can specify the desired HTTP status of the response if we annotate a request handler method with this annotation. We can declare the status code with the code argument, or its alias, the value argument.
Also, we can provide a reason using the reason argument.
We also can use it along with @ExceptionHandler:
@ExceptionHandler(IllegalArgumentException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) void onIllegalArgumentException(IllegalArgumentException exception) { // ... }
For more information about HTTP response status, please visit this article.
7. Other Web Annotations
Some annotations don't manage HTTP requests or responses directly. In the next sections, we'll introduce the most common ones.
7.1. @Controller
We can define a Spring MVC controller with @Controller. For more information, please visit our article about Spring Bean Annotations.
7.2. @RestController
The @RestControllercombines @Controller and @ResponseBody.
Therefore, the following declarations are equivalent:
@Controller @ResponseBody class VehicleRestController { // ... }
@RestController class VehicleRestController { // ... }
7.3. @ModelAttribute
With this annotation we can access elements that are already in the model of an MVC @Controller, by providing the model key:
@PostMapping("/assemble") void assembleVehicle(@ModelAttribute("vehicle") Vehicle vehicleInModel) { // ... }
Like with @PathVariable and @RequestParam, we don't have to specify the model key if the argument has the same name:
@PostMapping("/assemble") void assembleVehicle(@ModelAttribute Vehicle vehicle) { // ... }
Besides, @ModelAttribute has another use: if we annotate a method with it, Spring will automatically add the method's return value to the model:
@ModelAttribute("vehicle") Vehicle getVehicle() { // ... }
Like before, we don't have to specify the model key, Spring uses the method's name by default:
@ModelAttribute Vehicle vehicle() { // ... }
Before Spring calls a request handler method, it invokes all @ModelAttribute annotated methods in the class.
More information about @ModelAttribute can be found in this article.
7.4. @CrossOrigin
@CrossOriginenables cross-domain communication for the annotated request handler methods:
@CrossOrigin @RequestMapping("/hello") String hello() { return "Hello World!"; }
If we mark a class with it, it applies to all request handler methods in it.
We can fine-tune CORS behavior with this annotation's arguments.
За повече подробности, моля, посетете тази статия.
8. Заключение
В тази статия видяхме как можем да обработваме HTTP заявки и отговори с Spring MVC.
Както обикновено, примерите са достъпни в GitHub.
Напред » Пролетни стартиращи анотации « Предишни пролетни основни пояснения