Spring MVC 請(qǐng)求處理流程步驟詳解
步驟1:用戶發(fā)起請(qǐng)求
- 所有請(qǐng)求首先被
DispatcherServlet
(前端控制器)攔截,它是整個(gè)流程的入口。 DispatcherServlet
繼承自HttpServlet
,通過web.xml
或WebApplicationInitializer
配置映射路徑(如/
)。
步驟2:請(qǐng)求映射(Handler Mapping)
HandlerMapping
根據(jù)請(qǐng)求的 URL、參數(shù)、Header 等信息,找到對(duì)應(yīng)的 處理器(Handler)。- 處理器 可以是
@Controller
注解的類中的方法,或?qū)崿F(xiàn)Controller
接口的類。 - 關(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)類:
RequestMappingHandlerAdapter
(支持@RequestMapping
方法)。 - 適配過程:
- 解析方法參數(shù)(如
@RequestParam
、@RequestBody
)。 - 執(zhí)行方法邏輯。
- 處理返回值(如
ModelAndView
、JSON 數(shù)據(jù))。
- 解析方法參數(shù)(如
步驟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"; // 視圖名稱 }
步驟6:視圖解析(View Resolver)
ViewResolver
將控制器返回的視圖名稱解析為具體的View
對(duì)象。- 常見實(shí)現(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
對(duì)象將模型數(shù)據(jù)渲染到響應(yīng)中(如生成 HTML、JSON)。- 渲染方式:
- JSP:使用 JSTL 或 EL 表達(dá)式填充數(shù)據(jù)。
- REST API:通過
HttpMessageConverter
將返回值序列化為 JSON(如@ResponseBody
)。
步驟8:返回響應(yīng)
渲染后的響應(yīng)通過 DispatcherServlet
返回給客戶端。
關(guān)鍵組件與接口
組件 | 職責(zé) |
---|---|
DispatcherServlet | 前端控制器,統(tǒng)一調(diào)度請(qǐng)求處理流程。 |
HandlerMapping | 映射請(qǐng)求到處理器(Controller 方法)。 |
HandlerAdapter | 調(diào)用處理器方法,處理參數(shù)綁定與返回值。 |
ViewResolver | 解析視圖名稱到具體視圖實(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
:定義全局異常處理類。
@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 等格式(通過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ù)解析:通過 HandlerMethodArgumentResolver
解析方法參數(shù)。
3.返回值處理:通過 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)目,步驟一配置maven,步驟二配置JDK環(huán)境,緊接著通過步驟三檢查數(shù)據(jù)庫的配置,最后一步數(shù)據(jù)庫連接,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08Java獲取Excel中圖片所在的行和列坐標(biāo)位置
這篇文章主要介紹了Java獲取Excel中圖片所在的行和列坐標(biāo)位置,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-08-08在IDEA中實(shí)現(xiàn)生成Maven依賴關(guān)系圖
這篇文章主要介紹了在IDEA中實(shí)現(xiàn)生成Maven依賴關(guān)系圖方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07java 實(shí)現(xiàn)Comparable接口排序,升序、降序、倒敘
這篇文章主要介紹了java 實(shí)現(xiàn)Comparable接口排序,升序、降序、倒敘,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-08-08Centos6.5下Jdk+Tomcat+Mysql環(huán)境安裝圖文教程
這篇文章主要為大家詳細(xì)介紹了Centos6.5系統(tǒng)下Jdk+Tomcat+Mysql環(huán)境安裝過程,感興趣的小伙伴們可以參考一下2016-05-05