Назад к вопросам
Middle
71
questionbank

Как Dispatcher Servlet определяет, какой метод необходимо вызвать?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

DispatcherServlet использует механизмы сопоставления запросов (Request Mapping) для определения обработчика (Controller) и метода внутри него, который должен обработать входящий HTTP-запрос.

Ключевые шаги:

  1. Получение запроса: DispatcherServlet перехватывает все входящие HTTP-запросы.
  2. Поиск HandlerMapping: DispatcherServlet обращается к зарегистрированным HandlerMapping-объектам (например, RequestMappingHandlerMapping).
  3. Сопоставление URI и HTTP-метода: HandlerMapping анализирует URI и HTTP-метод запроса (GET, POST и т.д.) и сравнивает их с аннотациями @RequestMapping (или @GetMapping, @PostMapping и др.) в контроллерах.
  4. Определение HandlerExecutionChain: При нахождении подходящего контроллера и метода, HandlerMapping возвращает HandlerExecutionChain, который включает в себя сам обработчик (Handler), а также список Interceptors, которые должны быть выполнены до и/или после выполнения обработчика.
  5. Передача HandlerExecutionChain: DispatcherServlet передает HandlerExecutionChain соответствующему HandlerAdapter (например, RequestMappingHandlerAdapter).
  6. Выполнение Handler: HandlerAdapter вызывает найденный метод контроллера.

Примеры аннотаций, используемых для сопоставления:

  • @RequestMapping: Основная аннотация для сопоставления запросов.
    // Java
    @Controller
    @RequestMapping("/users")
    public class UserController {
    
        @RequestMapping(method = RequestMethod.GET) // Совпадает с GET /users
        public String getAllUsers() {
            return "users";
        }
    
        @RequestMapping(value = "/{id}", method = RequestMethod.GET) // Совпадает с GET /users/{id}
        public String getUserById(@PathVariable Long id) {
            return "user";
        }
    }
    
  • @GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping: Сокращенные аннотации для сопоставления с конкретными HTTP-методами.
    // Java
    @Controller
    @RequestMapping("/products")
    public class ProductController {
    
        @GetMapping // Совпадает с GET /products
        public String getAllProducts() {
            return "products";
        }
    
        @PostMapping // Совпадает с POST /products
        public String createProduct() {
            return "product_created";
        }
    }
    

DispatcherServlet использует механизм рефлексии для вызова конкретного метода с соответствующими аргументами, преобразовав параметры запроса (например, из URL, тела запроса, заголовков) в типы аргументов метода контроллера.