Spring MVC 請求處理流程步驟詳解
步驟1:用戶發(fā)起請求
- 所有請求首先被
DispatcherServlet(前端控制器)攔截,它是整個流程的入口。 DispatcherServlet繼承自HttpServlet,通過web.xml或WebApplicationInitializer配置映射路徑(如/)。
步驟2:請求映射(Handler Mapping)
HandlerMapping根據(jù)請求的 URL、參數(shù)、Header 等信息,找到對應的 處理器(Handler)。- 處理器 可以是
@Controller注解的類中的方法,或?qū)崿F(xiàn)Controller接口的類。 - 關鍵接口:
RequestMappingHandlerMapping(處理@RequestMapping注解)。
- 處理器 可以是
- 匹配規(guī)則:
@Controller
public class UserController {
@GetMapping("/users/{id}")
public String getUser(@PathVariable Long id, Model model) {
// 業(yè)務邏輯
}
}步驟3:處理器適配(Handler Adapter)
HandlerAdapter負責調(diào)用處理器方法,并處理參數(shù)綁定、返回值轉(zhuǎn)換。- 關鍵實現(xiàn)類:
RequestMappingHandlerAdapter(支持@RequestMapping方法)。 - 適配過程:
- 解析方法參數(shù)(如
@RequestParam、@RequestBody)。 - 執(zhí)行方法邏輯。
- 處理返回值(如
ModelAndView、JSON 數(shù)據(jù))。
- 解析方法參數(shù)(如
步驟4:執(zhí)行攔截器(Interceptor)
HandlerInterceptor在處理器執(zhí)行前后插入邏輯:- preHandle:在處理器方法執(zhí)行前調(diào)用(如權(quán)限校驗)。
- postHandle:在處理器方法執(zhí)行后、視圖渲染前調(diào)用。
- afterCompletion:在請求完成后調(diào)用(資源清理)。
步驟5:業(yè)務邏輯處理
- 控制器方法執(zhí)行業(yè)務邏輯,可能涉及:
- 調(diào)用 Service 層處理數(shù)據(jù)。
- 操作 Model 對象向視圖傳遞數(shù)據(jù)。
@GetMapping("/users")
public String listUsers(Model model) {
List<User> users = userService.findAll();
model.addAttribute("users", users); // 數(shù)據(jù)傳遞到視圖
return "user/list"; // 視圖名稱
}步驟6:視圖解析(View Resolver)
ViewResolver將控制器返回的視圖名稱解析為具體的View對象。- 常見實現(xiàn):
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對象將模型數(shù)據(jù)渲染到響應中(如生成 HTML、JSON)。- 渲染方式:
- JSP:使用 JSTL 或 EL 表達式填充數(shù)據(jù)。
- REST API:通過
HttpMessageConverter將返回值序列化為 JSON(如@ResponseBody)。
步驟8:返回響應
渲染后的響應通過 DispatcherServlet 返回給客戶端。
關鍵組件與接口
| 組件 | 職責 |
|---|---|
| DispatcherServlet | 前端控制器,統(tǒng)一調(diào)度請求處理流程。 |
| HandlerMapping | 映射請求到處理器(Controller 方法)。 |
| HandlerAdapter | 調(diào)用處理器方法,處理參數(shù)綁定與返回值。 |
| ViewResolver | 解析視圖名稱到具體視圖實現(xiàn)(如 JSP、Thymeleaf)。 |
| HandlerInterceptor | 攔截請求,實現(xiàn)預處理和后處理邏輯(如日志、權(quán)限校驗)。 |
| HttpMessageConverter | 處理請求/響應的數(shù)據(jù)轉(zhuǎn)換(如 JSON ↔ Java 對象)。 |
異常處理機制
@ExceptionHandler:在 Controller 內(nèi)處理特定異常。
@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,直接返回數(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ù)請求的
AcceptHeader 返回 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.參數(shù)解析:通過 HandlerMethodArgumentResolver 解析方法參數(shù)。
3.返回值處理:通過 HandlerMethodReturnValueHandler 處理返回值。
總結(jié)
- 核心流程:DispatcherServlet → HandlerMapping → HandlerAdapter → Interceptor → ViewResolver。
- 擴展點:攔截器、異常處理器、自定義參數(shù)解析器。
- 設計思想:職責分離、組件化、高度可定制。
到此這篇關于Spring MVC 請求處理流程詳解的文章就介紹到這了,更多相關Spring MVC 請求處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Springcould多模塊搭建Eureka服務器端口過程詳解
這篇文章主要介紹了Springcould多模塊搭建Eureka服務器端口過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-11-11
將SpringBoot項目的HTTP站點改為HTTPS的全過程
本文介紹了如何在Spring Boot項目中實現(xiàn)HTTPS請求,首先,創(chuàng)建一個Spring Boot項目并編寫一個BasicController.java文件,然后,配置application.yaml文件以支持HTTPS,接著,使用Java自帶的keytool工具生成一個免費的HTTPS證書,需要的朋友可以參考下2026-02-02
springboot整合sentinel接口熔斷的實現(xiàn)示例
為了防止慢接口導致的服務阻塞,可以通過添加熔斷處理來避免應用的大量工作線程陷入阻塞,保證其他接口的正常運行,本文介紹了如何使用Spring Boot與Sentinel進行接口熔斷的配置與實現(xiàn),感興趣的可以了解一下2024-09-09
java面試常問的Runnable和Callable的區(qū)別
大家好,本篇文章主要講的是java面試常問的Runnable和Callable的區(qū)別,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下2022-01-01
Java中關于isEmpty方法、null以及““的區(qū)別
這篇文章主要介紹了Java中關于isEmpty方法、null以及““的區(qū)別,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08
JAVA8 List<List<Integer>> list中再裝一個list轉(zhuǎn)成一個list操
這篇文章主要介紹了JAVA8 List<List<Integer>> list中再裝一個list轉(zhuǎn)成一個list操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08
SpringBoot對Filter過濾器中的異常進行全局處理方案詳解
這篇文章主要介紹了SpringBoot對Filter過濾器中的異常進行全局處理,在SpringBoot中我們通過 @ControllerAdvice 注解和 @ExceptionHandler注解注冊了全局異常處理器,需要的朋友可以參考下2023-09-09

