步驟1:用戶發起請求
-
所有請求首先被?
DispatcherServlet
(前端控制器)攔截,它是整個流程的入口。 -
DispatcherServlet
?繼承自?HttpServlet
,通過?web.xml
?或?WebApplicationInitializer
?配置映射路徑(如?/
)。
步驟2:請求映射(Handler Mapping)
-
HandlerMapping
?根據請求的 URL、參數、Header 等信息,找到對應的?處理器(Handler)。-
處理器?可以是?
@Controller
?注解的類中的方法,或實現?Controller
?接口的類。 -
關鍵接口:
RequestMappingHandlerMapping
(處理?@RequestMapping
?注解)。
-
-
匹配規則:
@Controller public class UserController {@GetMapping("/users/{id}")public String getUser(@PathVariable Long id, Model model) {// 業務邏輯} }
步驟3:處理器適配(Handler Adapter)
-
HandlerAdapter
?負責調用處理器方法,并處理參數綁定、返回值轉換。-
關鍵實現類:
RequestMappingHandlerAdapter
(支持?@RequestMapping
?方法)。 -
適配過程:
-
解析方法參數(如?
@RequestParam
、@RequestBody
)。 -
執行方法邏輯。
-
處理返回值(如?
ModelAndView
、JSON 數據)。
-
-
步驟4:執行攔截器(Interceptor)
-
HandlerInterceptor
?在處理器執行前后插入邏輯:-
preHandle:在處理器方法執行前調用(如權限校驗)。
-
postHandle:在處理器方法執行后、視圖渲染前調用。
-
afterCompletion:在請求完成后調用(資源清理)。
-
步驟5:業務邏輯處理
-
控制器方法執行業務邏輯,可能涉及:
-
調用 Service 層處理數據。
-
操作 Model 對象向視圖傳遞數據。
@GetMapping("/users") public String listUsers(Model model) {List<User> users = userService.findAll();model.addAttribute("users", users); // 數據傳遞到視圖return "user/list"; // 視圖名稱 }
-
步驟6:視圖解析(View Resolver)
-
ViewResolver
?將控制器返回的視圖名稱解析為具體的?View
?對象。-
常見實現:
-
InternalResourceViewResolver
:解析 JSP 頁面(如?/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
?對象將模型數據渲染到響應中(如生成 HTML、JSON)。-
渲染方式:
-
JSP:使用 JSTL 或 EL 表達式填充數據。
-
REST API:通過?
HttpMessageConverter
?將返回值序列化為 JSON(如?@ResponseBody
)。
-
-
步驟8:返回響應
-
渲染后的響應通過?
DispatcherServlet
?返回給客戶端。
?
?關鍵組件與接口
組件 | 職責 |
---|---|
DispatcherServlet | 前端控制器,統一調度請求處理流程。 |
HandlerMapping | 映射請求到處理器(Controller 方法)。 |
HandlerAdapter | 調用處理器方法,處理參數綁定與返回值。 |
ViewResolver | 解析視圖名稱到具體視圖實現(如 JSP、Thymeleaf)。 |
HandlerInterceptor | 攔截請求,實現預處理和后處理邏輯(如日志、權限校驗)。 |
HttpMessageConverter | 處理請求/響應的數據轉換(如 JSON ? Java 對象)。 |
異常處理機制
-
@ExceptionHandler
:在 Controller 內處理特定異常。@ExceptionHandler(UserNotFoundException.class) public ResponseEntity<String> handleUserNotFound(UserNotFoundException ex) {return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage()); }
-
HandlerExceptionResolver
:全局異常解析器,自定義異常響應。 -
@ControllerAdvice
:定義全局異常處理類。@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 請求處理
-
@RestController
:組合?@Controller
?和?@ResponseBody
,直接返回數據。@RestController @RequestMapping("/api/users") public class UserApiController {@GetMapping("/{id}")public User getUser(@PathVariable Long id) {return userService.findById(id);} }
-
內容協商:根據請求的?
Accept
?Header 返回 JSON/XML 等格式(通過?HttpMessageConverter
)。
源碼級流程解析(簡化版)
-
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.參數解析:通過?HandlerMethodArgumentResolver
?解析方法參數。
? ? 3.返回值處理:通過?HandlerMethodReturnValueHandler
?處理返回值。
總結
-
核心流程:DispatcherServlet → HandlerMapping → HandlerAdapter → Interceptor → ViewResolver。
-
擴展點:攔截器、異常處理器、自定義參數解析器。
-
設計思想:職責分離、組件化、高度可定制。