以下是 Spring MVC 框架 的核心概念、組件關系及流程的詳細說明,并附表格總結:
1. 核心理念
Spring MVC 是基于 MVC(Model-View-Controller)設計模式 的 Web 框架,其核心思想是 解耦:
- Model:數據模型,負責業務邏輯和數據處理。
- View:視圖層,負責數據展示(如 HTML、JSON)。
- Controller:控制器,負責接收請求、調用 Model、選擇 View。
2. 核心組件詳解
2.1 DispatcherServlet(前端控制器)
- 作用:
Spring MVC 的核心,處理所有請求的入口點。 - 功能:
- 接收 HTTP 請求。
- 分發請求到合適的 Handler(處理器)。
- 組合 Model 和 View,返回最終響應。
- 配置:
在web.xml
中配置為Servlet
,或通過@SpringBootApplication
自動配置。
2.2 HandlerMapping(處理器映射器)
- 作用:
根據請求 URL 找到對應的 Handler(處理器)。 - 功能:
- 將請求 URL 映射到具體的 Controller 方法。
- 支持多種映射方式(如
@RequestMapping
、@GetMapping
)。
- 示例:
@Controller @RequestMapping("/user") public class UserController {@GetMapping("/list")public String list() { ... } }
2.3 HandlerAdapter(處理器適配器)
- 作用:
調用 Handler(處理器)并獲取處理結果(ModelAndView
)。 - 功能:
- 將請求參數綁定到方法參數(如
@RequestParam
、@PathVariable
)。 - 調用 Controller 方法,處理業務邏輯。
- 將返回值(如
String
、ModelAndView
)轉換為ModelAndView
對象。
- 將請求參數綁定到方法參數(如
- 適用場景:
適配不同類型的處理器(如@Controller
、@RestController
)。
2.4 ViewResolver(視圖解析器)
- 作用:
將邏輯視圖名(如"user/list"
)轉換為具體的 View 對象。 - 功能:
- 根據配置規則(如前綴、后綴)查找視圖資源。
- 支持多種視圖技術(如 Thymeleaf、JSP、FreeMarker)。
- 配置示例:
spring.mvc.view.prefix=/WEB-INF/views/ spring.mvc.view.suffix=.jsp
2.5 Model(模型)
- 作用:
存儲數據,供視圖渲染使用。 - 功能:
- 通過
Model
、ModelAndView
或@ModelAttribute
注入數據。 - 示例:
@Controller public class UserController {@GetMapping("/user/{id}")public String getUser(@PathVariable Long id, Model model) {User user = userService.findById(id);model.addAttribute("user", user); // 存入 Modelreturn "user/detail";} }
- 通過
2.6 View(視圖)
- 作用:
將 Model 中的數據渲染為最終的響應(如 HTML 頁面、JSON 數據)。 - 實現方式:
- Thymeleaf:
<div th:text="${user.name}"></div>
。 - JSP:
<%= user.getName() %>
。 - JSON:通過
@ResponseBody
或@RestController
直接返回對象。
- Thymeleaf:
2.7 Controller(控制器)
- 作用:
處理 HTTP 請求,調用 Model 并選擇 View。 - 功能:
- 通過
@Controller
或@RestController
標記。 - 使用
@RequestMapping
系列注解定義請求映射。 - 示例:
@RestController public class UserController {@GetMapping("/api/user/{id}")public User getUser(@PathVariable Long id) {return userService.findById(id);} }
- 通過
2.8 攔截器(HandlerInterceptor)
- 作用:
在請求處理前后執行自定義邏輯(如權限校驗、日志記錄)。 - 功能:
- 實現
HandlerInterceptor
接口。 - 通過
WebMvcConfigurer
注冊攔截器。 - 示例:
public class AuthInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {// 權限校驗return true; // 繼續處理請求} }
- 實現
3. 核心組件關系圖
用戶請求 → DispatcherServlet → HandlerMapping → Handler(Controller)↓HandlerAdapter → 處理請求 → Model + View名稱↓ViewResolver → 解析View → 渲染響應 → 返回客戶端
4. 請求處理流程
- 請求到達 DispatcherServlet:
客戶端發送 HTTP 請求到DispatcherServlet
。 - 映射處理器:
HandlerMapping
根據 URL 找到對應的Handler
(如UserController
的list()
方法)。 - 調用處理器:
HandlerAdapter
調用Handler
方法,獲取ModelAndView
(包含數據和邏輯視圖名)。 - 解析視圖:
ViewResolver
將邏輯視圖名(如"user/list"
)轉換為具體的View
(如/WEB-INF/views/user/list.jsp
)。 - 渲染響應:
View
使用 Model 數據生成最終響應(HTML、JSON 等),返回給客戶端。
5. 表格總結
組件 | 作用 | 角色 | 示例/配置 |
---|---|---|---|
DispatcherServlet | 接收請求,分發到 Handler,組合 Model 和 View。 | 中央調度器,核心組件。 | @SpringBootApplication 自動配置。 |
HandlerMapping | 映射請求 URL 到對應的 Handler(Controller)。 | 請求路由的橋梁。 | @RequestMapping 、@GetMapping 。 |
HandlerAdapter | 調用 Handler 方法,處理參數綁定和返回值轉換。 | 調用處理器的適配器。 | 支持 @RequestParam 、@PathVariable 。 |
ViewResolver | 將邏輯視圖名轉換為具體的 View 對象。 | 視圖解析器,支持多種模板引擎。 | spring.mvc.view.prefix=/views/ 、spring.mvc.view.suffix=.jsp 。 |
Model | 存儲數據,供視圖渲染。 | 數據容器。 | Model 、@ModelAttribute 。 |
View | 渲染最終的響應(HTML、JSON 等)。 | 響應生成器。 | Thymeleaf、JSP、FreeMarker。 |
Controller | 處理請求,調用 Model,選擇 View。 | 業務邏輯處理器。 | @Controller 、@RestController 。 |
HandlerInterceptor | 在請求處理前后執行攔截邏輯(如權限校驗)。 | 請求攔截器。 | 實現 HandlerInterceptor 接口,通過 WebMvcConfigurer 注冊。 |
6. 關鍵概念關系圖
用戶請求 → DispatcherServlet → HandlerMapping(找到 Controller) → HandlerAdapter(調用 Controller 方法)↓Model(存儲數據) → ViewResolver(解析視圖) → View(渲染響應)
7. 注意事項
- 注解驅動:通過
@EnableWebMvc
或@SpringBootApplication
啟用注解支持。 - 異步處理:通過
@Async
或DeferredResult
實現異步請求。 - 異常處理:通過
@ControllerAdvice
統一處理全局異常。
通過以上組件和流程,Spring MVC 實現了請求的解耦和高效處理,是構建現代化 Web 應用的首選框架。
一、Spring MVC 請求處理全流程詳解
1. 請求參數接收
-
實現方式:通過方法參數注解(如
@RequestParam
,@PathVariable
,@RequestBody
)直接綁定請求參數。@GetMapping("/user/{id}") public String getUser(@PathVariable String id, @RequestParam String name) {// 參數綁定到方法參數 }
-
核心類:
ServletInvocableHandlerMethod
負責參數解析,通過HandlerMethodArgumentResolver
解析不同注解的參數。
2. 請求分發到控制器方法
- 流程:
DispatcherServlet
通過HandlerMapping
定位處理器(Controller方法)。- 關鍵類:
RequestMappingHandlerMapping
根據@RequestMapping
注解匹配 URL 和 HTTP 方法。 - 匹配邏輯:解析
@RequestMapping
的path
、method
等屬性,生成HandlerExecutionChain
。
// 示例:匹配到 UserController 的 getUser 方法 @Controller @RequestMapping("/user") public class UserController {@GetMapping("/{id}")public String getUser(@PathVariable String id) { ... } }
- 關鍵類:
3. 視圖定位與渲染
-
視圖解析:
ViewResolver
根據邏輯視圖名(如user/list
)解析為實際視圖(如 JSP 文件)。- 核心類:
InternalResourceViewResolver
將視圖名轉換為/WEB-INF/views/user/list.jsp
。
// 配置視圖解析器 @Bean public ViewResolver viewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/views/");resolver.setSuffix(".jsp");return resolver; }
- 核心類:
-
視圖類型:JSP、Thymeleaf、FreeMarker 等,通過
View
接口實現。
二、流程可省略與可自定義部分
1. 可省略的流程
流程階段 | 省略條件 | 替代處理方式 |
---|---|---|
視圖解析 | 返回值添加 @ResponseBody | 由 HttpMessageConverter 直接序列化返回 |
視圖渲染 | 返回 JSON/XML 等數據格式 | 無需渲染,直接寫入響應體 |
Session管理 | 無會話需求(如 REST API) | 關閉 Session 支持(@Controller 不繼承 @SessionAttributes ) |
2. 可自定義的流程
流程階段 | 自定義方式 | 實現類/注解 |
---|---|---|
參數綁定 | 自定義參數解析器 | HandlerMethodArgumentResolver |
處理器映射 | 自定義請求到方法的匹配規則 | HandlerMapping |
視圖解析 | 自定義視圖解析邏輯 | ViewResolver |
異常處理 | 自定義全局異常處理器 | @ControllerAdvice + @ExceptionHandler |
三、DispatcherServlet.properties
定義的類及作用
1. 核心類列表
類名 | 作用 |
---|---|
RequestMappingHandlerMapping | 根據 @RequestMapping 注解匹配 Controller 方法 |
RequestMappingHandlerAdapter | 調用 Controller 方法并處理方法參數和返回值 |
BeanNameUrlHandlerMapping | 根據 Bean 名稱直接映射 URL(如 loginController 對應 /loginController ) |
SimpleUrlHandlerMapping | 簡單的 URL 映射配置(通過 XML 配置 URL 和 Controller 關聯) |
DefaultAnnotationHandlerMapping | 舊版注解處理器映射(Spring 3.0 后逐步被 RequestMappingHandlerMapping 替代) |
InternalResourceViewResolver | 解析 JSP 視圖,將邏輯視圖名轉換為實際資源路徑 |
ContentNegotiatingViewResolver | 根據請求的 Accept 頭選擇合適視圖(如 JSON 或 HTML) |
HandlerExceptionResolver | 全局異常處理,將異常轉換為視圖或 HTTP 狀態碼 |
2. 流程總結表格
流程階段 | 是否可省略 | 是否可自定義 | 默認實現類 |
---|---|---|---|
參數綁定 | 否 | 是 | ServletModelAttributeMethodProcessor |
請求分發 | 否 | 是 | RequestMappingHandlerMapping |
視圖解析 | 是 | 是 | InternalResourceViewResolver |
視圖渲染 | 是 | 是 | JstlView (JSP) |
異常處理 | 否 | 是 | DefaultHandlerExceptionResolver |
四、關鍵代碼注釋示例
// 1. Controller 方法參數綁定示例
@GetMapping("/search")
public String search(@RequestParam String keyword, @RequestBody User user) { // @RequestParam 綁定查詢參數,@RequestBody 綁定 JSON 請求體
}// 2. 自定義視圖解析器(實現 ViewResolver 接口)
public class CustomViewResolver implements ViewResolver {@Overridepublic View resolveViewName(String viewName, Locale locale) {// 自定義邏輯:根據 viewName 返回自定義 View 實現return new CustomView();}
}// 3. @ResponseBody 省略視圖流程
@GetMapping("/api/user")
@ResponseBody
public User getUserAsJson() {// 直接返回對象,由 Jackson 轉換為 JSON,跳過視圖解析
}