Sobes.tech
Back to questions
Middle
114
questionbank

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

Answer from AI

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, тела запроса, заголовков) в типы аргументов метода контроллера.