首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring MVC 框架流程與原理深度解析:從 DispatcherServlet 到視圖渲染

     編輯:Java 綜合教學

Spring MVC 框架流程與原理深度解析:從 DispatcherServlet 到視圖渲染

請求處理全流程

Spring MVC 處理流程圖

  1. 用戶發送請求 → DispatcherServlet(前端控制器)
  2. DispatcherServlet 根據 URL 選擇 HandlerMapping → 獲取 HandlerExecutionChain(Handler + Interceptors)
  3. 通過 HandlerAdapter 適配 Handler → 執行預處理攔截器
  4. HandlerAdapter 調用 Controller 業務方法 → 返回 ModelAndView
  5. DispatcherServlet 根據邏輯視圖名 → ViewResolver 解析具體 View
  6. View 渲染模型數據 → 返回響應給用戶

核心架構組件

Spring MVC 架構圖

DispatcherServlet 核心源碼解析

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) {
    // 1. 檢查 multipart(文件上傳)
    processedRequest = checkMultipart(request);

    // 2. HandlerMapping 獲取 HandlerExecutionChain
    mappedHandler = getHandler(processedRequest);
    if (mappedHandler == null) { noHandlerFound(...); return; }

    // 3. HandlerAdapter 適配
    HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

    // 4. 執行預處理攔截器
    if (!mappedHandler.applyPreHandle(processedRequest, response)) return;

    // 5. 執行 Handler(Controller)
    mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

    // 6. 執行後處理攔截器
    mappedHandler.applyPostHandle(processedRequest, response, mv);

    // 7. 處理結果:視圖解析與渲染
    processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
}

關鍵策略模式應用

組件策略接口作用
HandlerMappinggetHandler(request)請求 → Handler 映射,支援多種映射策略
HandlerAdaptersupports(handler)/handle()適配不同類型 Handler(Controller、HttpRequestHandler 等)
ViewResolverresolveViewName(name, locale)邏輯視圖名 → 具體 View 實現,支援 JSP、Velocity、Thymeleaf 等

視圖渲染源碼

protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) {
    Locale locale = localeResolver.resolveLocale(request);
    response.setLocale(locale);

    View view;
    if (mv.isReference()) {
        // 邏輯視圖名 → 解析 View
        view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request);
    } else {
        view = mv.getView();
    }
    // 渲染:將 Model 數據傳入 View
    view.render(mv.getModelInternal(), request, response);
}

核心開發步驟總結

  1. web.xml 配置 DispatcherServlet
  2. 配置 HandlerMapping(或採用 @RequestMapping 註解)
  3. 配置 HandlerAdapter(通常自動註冊)
  4. 配置 ViewResolver(如 InternalResourceViewResolver)
  5. 編寫 Controller 處理業務,返回 ModelAndView

開發步驟圖


附錄:Spring IOC 與 AOP 核心概念回顧

IOC(控制反轉)

  • 依賴注入 (DI):Setter 注入、構造器注入
  • 依賴查找 (DL)
  • 容器負責組件裝配,業務代碼與依賴配置分離

AOP(面向切面編程)

  • 預編譯 + 運行期動態代理
  • 隔離橫切關注點(事務、日誌、權限),降低耦合,提高復用

參考資源

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved