欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring MVC 請(qǐng)求處理流程步驟詳解

 更新時(shí)間:2025年04月15日 09:48:21   作者:云之兕  
這篇文章主要介紹了Spring MVC 請(qǐng)求處理流程詳解,本文分步驟結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧

步驟1:用戶(hù)發(fā)起請(qǐng)求

  • 所有請(qǐng)求首先被 DispatcherServlet前端控制器)攔截,它是整個(gè)流程的入口。
  • DispatcherServlet 繼承自 HttpServlet,通過(guò) web.xml 或 WebApplicationInitializer 配置映射路徑(如 /)。

步驟2:請(qǐng)求映射(Handler Mapping)

  • HandlerMapping 根據(jù)請(qǐng)求的 URL、參數(shù)、Header 等信息,找到對(duì)應(yīng)的 處理器(Handler)
    • 處理器 可以是 @Controller 注解的類(lèi)中的方法,或?qū)崿F(xiàn) Controller 接口的類(lèi)。
    • 關(guān)鍵接口RequestMappingHandlerMapping(處理 @RequestMapping 注解)。
  • 匹配規(guī)則
@Controller
public class UserController {
    @GetMapping("/users/{id}")
    public String getUser(@PathVariable Long id, Model model) {
        // 業(yè)務(wù)邏輯
    }
}

步驟3:處理器適配(Handler Adapter)

  • HandlerAdapter 負(fù)責(zé)調(diào)用處理器方法,并處理參數(shù)綁定、返回值轉(zhuǎn)換。
  • 關(guān)鍵實(shí)現(xiàn)類(lèi)RequestMappingHandlerAdapter(支持 @RequestMapping 方法)。
  • 適配過(guò)程
    • 解析方法參數(shù)(如 @RequestParam、@RequestBody)。
    • 執(zhí)行方法邏輯。
    • 處理返回值(如 ModelAndView、JSON 數(shù)據(jù))。

步驟4:執(zhí)行攔截器(Interceptor)

  • HandlerInterceptor 在處理器執(zhí)行前后插入邏輯:
    • preHandle:在處理器方法執(zhí)行前調(diào)用(如權(quán)限校驗(yàn))。
    • postHandle:在處理器方法執(zhí)行后、視圖渲染前調(diào)用。
    • afterCompletion:在請(qǐng)求完成后調(diào)用(資源清理)。

步驟5:業(yè)務(wù)邏輯處理

  • 控制器方法執(zhí)行業(yè)務(wù)邏輯,可能涉及:
    • 調(diào)用 Service 層處理數(shù)據(jù)。
    • 操作 Model 對(duì)象向視圖傳遞數(shù)據(jù)。
@GetMapping("/users")
public String listUsers(Model model) {
    List<User> users = userService.findAll();
    model.addAttribute("users", users); // 數(shù)據(jù)傳遞到視圖
    return "user/list"; // 視圖名稱(chēng)
}

步驟6:視圖解析(View Resolver)

  • ViewResolver 將控制器返回的視圖名稱(chēng)解析為具體的 View 對(duì)象。
  • 常見(jiàn)實(shí)現(xiàn)
    • InternalResourceViewResolver:解析 JSP 頁(yè)面(如 /WEB-INF/views/user/list.jsp)。
    • ThymeleafViewResolver:解析 Thymeleaf 模板。
  • 配置示例
@Bean
public ViewResolver viewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".jsp");
    return resolver;
}

步驟7:視圖渲染(View Rendering)

  • View 對(duì)象將模型數(shù)據(jù)渲染到響應(yīng)中(如生成 HTML、JSON)。
  • 渲染方式
    • JSP:使用 JSTL 或 EL 表達(dá)式填充數(shù)據(jù)。
    • REST API:通過(guò) HttpMessageConverter 將返回值序列化為 JSON(如 @ResponseBody)。

步驟8:返回響應(yīng)

渲染后的響應(yīng)通過(guò) DispatcherServlet 返回給客戶(hù)端。

 關(guān)鍵組件與接口

組件職責(zé)
DispatcherServlet前端控制器,統(tǒng)一調(diào)度請(qǐng)求處理流程。
HandlerMapping映射請(qǐng)求到處理器(Controller 方法)。
HandlerAdapter調(diào)用處理器方法,處理參數(shù)綁定與返回值。
ViewResolver解析視圖名稱(chēng)到具體視圖實(shí)現(xiàn)(如 JSP、Thymeleaf)。
HandlerInterceptor攔截請(qǐng)求,實(shí)現(xiàn)預(yù)處理和后處理邏輯(如日志、權(quán)限校驗(yàn))。
HttpMessageConverter處理請(qǐng)求/響應(yīng)的數(shù)據(jù)轉(zhuǎn)換(如 JSON ↔ Java 對(duì)象)。

異常處理機(jī)制

@ExceptionHandler:在 Controller 內(nèi)處理特定異常。

@ExceptionHandler(UserNotFoundException.class)
public ResponseEntity<String> handleUserNotFound(UserNotFoundException ex) {
    return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
}
  • HandlerExceptionResolver:全局異常解析器,自定義異常響應(yīng)。
  • @ControllerAdvice:定義全局異常處理類(lèi)。
@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public ModelAndView handleAllExceptions(Exception ex) {
        ModelAndView mav = new ModelAndView("error");
        mav.addObject("message", ex.getMessage());
        return mav;
    }
}

 RESTful 請(qǐng)求處理

@RestController:組合 @Controller 和 @ResponseBody,直接返回?cái)?shù)據(jù)。

@RestController
@RequestMapping("/api/users")
public class UserApiController {
    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        return userService.findById(id);
    }
}
  • 內(nèi)容協(xié)商:根據(jù)請(qǐng)求的 Accept Header 返回 JSON/XML 等格式(通過(guò) HttpMessageConverter)。

源碼級(jí)流程解析(簡(jiǎn)化版)

DispatcherServlet.doDispatch()

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    HandlerExecutionChain mappedHandler = getHandler(request); // 獲取處理器鏈
    HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
    ModelAndView mv = ha.handle(request, response, mappedHandler.getHandler());
    processDispatchResult(request, response, mappedHandler, mv, dispatchException);
}

    2.參數(shù)解析:通過(guò) HandlerMethodArgumentResolver 解析方法參數(shù)。

    3.返回值處理:通過(guò) HandlerMethodReturnValueHandler 處理返回值。

總結(jié)

  • 核心流程:DispatcherServlet → HandlerMapping → HandlerAdapter → Interceptor → ViewResolver。
  • 擴(kuò)展點(diǎn):攔截器、異常處理器、自定義參數(shù)解析器。
  • 設(shè)計(jì)思想:職責(zé)分離、組件化、高度可定制。

到此這篇關(guān)于Spring MVC 請(qǐng)求處理流程詳解的文章就介紹到這了,更多相關(guān)Spring MVC 請(qǐng)求處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • IntelliJ?IDEA運(yùn)行SpringBoot項(xiàng)目的詳細(xì)步驟

    IntelliJ?IDEA運(yùn)行SpringBoot項(xiàng)目的詳細(xì)步驟

    這篇文章主要介紹了IntelliJ?IDEA如何運(yùn)行SpringBoot項(xiàng)目,步驟一配置maven,步驟二配置JDK環(huán)境,緊接著通過(guò)步驟三檢查數(shù)據(jù)庫(kù)的配置,最后一步數(shù)據(jù)庫(kù)連接,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • Java中求最大值的4種方法實(shí)例代碼

    Java中求最大值的4種方法實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于Java中求最大值的4種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Java獲取Excel中圖片所在的行和列坐標(biāo)位置

    Java獲取Excel中圖片所在的行和列坐標(biāo)位置

    這篇文章主要介紹了Java獲取Excel中圖片所在的行和列坐標(biāo)位置,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-08-08
  • IDEA?Eval?Reset?使用方法匯總

    IDEA?Eval?Reset?使用方法匯總

    本文給大家介紹了IDEA?Eval?Reset?使用方法,安裝插件包括離線安裝方式和在線安裝方式,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • 解決jpa查詢(xún)語(yǔ)句自動(dòng)變成了update的問(wèn)題

    解決jpa查詢(xún)語(yǔ)句自動(dòng)變成了update的問(wèn)題

    這篇文章主要介紹了解決jpa查詢(xún)語(yǔ)句自動(dòng)變成了update的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 在IDEA中實(shí)現(xiàn)生成Maven依賴(lài)關(guān)系圖

    在IDEA中實(shí)現(xiàn)生成Maven依賴(lài)關(guān)系圖

    這篇文章主要介紹了在IDEA中實(shí)現(xiàn)生成Maven依賴(lài)關(guān)系圖方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • java二叉樹(shù)面試題詳解

    java二叉樹(shù)面試題詳解

    下面小編就為大家?guī)?lái)一篇java二叉樹(shù)的幾道面試題詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-07-07
  • java合并多個(gè)文件的兩種方法

    java合并多個(gè)文件的兩種方法

    這篇文章主要為大家詳細(xì)介紹了java合并多個(gè)文件的兩種方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • java 實(shí)現(xiàn)Comparable接口排序,升序、降序、倒敘

    java 實(shí)現(xiàn)Comparable接口排序,升序、降序、倒敘

    這篇文章主要介紹了java 實(shí)現(xiàn)Comparable接口排序,升序、降序、倒敘,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • Centos6.5下Jdk+Tomcat+Mysql環(huán)境安裝圖文教程

    Centos6.5下Jdk+Tomcat+Mysql環(huán)境安裝圖文教程

    這篇文章主要為大家詳細(xì)介紹了Centos6.5系統(tǒng)下Jdk+Tomcat+Mysql環(huán)境安裝過(guò)程,感興趣的小伙伴們可以參考一下
    2016-05-05

最新評(píng)論