Sobes.tech
Middle

Dispatcher Servlet қандай әдісті шақыру керектігін қалай анықтайды?

sobes.tech AI

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, сұрау денесі, тақырыптар) әдіс аргументтеріне түрлендіреді.