Какие способы передачи нескольких параметров в HTTP-запросе поддерживает Spring MVC?

«Какие способы передачи нескольких параметров в HTTP-запросе поддерживает Spring MVC?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Spring MVC предоставляет несколько аннотаций для работы с параметрами HTTP-запросов, выбор зависит от типа запроса (GET/POST) и структуры данных.

Основные способы:

  1. @RequestParam для отдельных параметров: Идеально для простых GET-запросов с небольшим количеством параметров.

    @GetMapping("/search")
    public String search(@RequestParam("q") String query,
                         @RequestParam(defaultValue = "1") int page,
                         @RequestParam(required = false) String sort) {
        // Обработка параметров query, page, sort
    }
    // URL: /search?q=java&page=2&sort=name
  2. @RequestParam Map для динамических параметров: Если имена или количество параметров неизвестны на этапе компиляции.

    @GetMapping("/filter")
    public String filter(@RequestParam Map<String, String> allParams) {
        // allParams содержит все переданные параметры
    }
  3. @ModelAttribute для привязки к объекту: Стандартный способ для HTML-форм (POST). Параметры запроса автоматически связываются с полями объекта.

    @PostMapping("/register")
    public String submitForm(@ModelAttribute("user") UserDto userDto) {
        // Поля userDto заполнены значениями из формы
    }
    // Класс UserDto должен иметь сеттеры для полей, совпадающих с именами параметров.
  4. @RequestBody для сложных структур (JSON/XML): Основной способ для REST API. Тело запроса десериализуется в объект.

    @PostMapping("/api/search")
    public ResponseEntity<SearchResult> search(@RequestBody SearchRequest request) {
        // request — сложный объект с вложенными полями
    }
    // Тело запроса (JSON): {"query": "java", "filters": {"type": "book"}, "page": 1}

Краткое руководство по выбору:

  • REST API (JSON): Используйте @RequestBody с DTO-объектами.
  • Веб-формы (HTML): Используйте @ModelAttribute.
  • Простые GET-запросы (ссылки, фильтры): Используйте @RequestParam.
  • Динамические фильтры: Используйте @RequestParam Map.