Перейти к основному содержимому

Весенние веб-аннотации

· 6 мин. чтения

Задача: Медиана двух отсортированных массивов

Даны два отсортированных массива размерами n и m. Найдите медиану слияния этих двух массивов.
Временная сложность решения должна быть O(log(m + n)) ...

ANDROMEDA

1. Обзор

В этом руководстве мы рассмотрим аннотации Spring Web из пакета org.springframework.web.bind.annotation .

2. @RequestMapping

Проще говоря, @RequestMapping помечает методы обработчика запросов внутри классов @Controller ; его можно настроить с помощью:

  • путь или его псевдонимы, имя и значение: какой 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 соответственно.

Они доступны с момента выпуска 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 .