Spring MVC 是一個基于 MVC 設計模式的框架,其核心組件協同工作以處理 HTTP 請求并生成響應。以下是各組件的詳細說明及其協作流程:
一、?核心組件
-
?DispatcherServlet(前端控制器)?
- ?作用:接收所有請求并協調其他組件處理。
- ?流程:作為中央調度器,將請求分發給合適的處理器,并管理視圖渲染和異常處理。
-
?HandlerMapping(處理器映射器)?
- ?作用:根據請求的 URL 和配置,確定處理請求的 Controller 及其方法。
- ?示例:
@RequestMapping
?注解將 URL 映射到具體方法。
-
?HandlerAdapter(處理器適配器)?
- ?作用:調用具體的處理器方法,處理參數綁定、數據轉換和返回值處理。
- ?示例:適配?
@Controller
?注解的類或?Controller
?接口的實現。
-
?ViewResolver(視圖解析器)?
- ?作用:將邏輯視圖名(如?
"home"
)解析為物理視圖(如 JSP、Thymeleaf 模板)。 - ?配置示例:添加前綴?
/WEB-INF/views/
?和后綴?.jsp
。
- ?作用:將邏輯視圖名(如?
-
?ModelAndView
- ?作用:封裝模型數據(業務結果)和視圖信息(渲染目標)。
- ?使用:Controller 方法返回該對象,傳遞數據到視圖層。
-
?HandlerExceptionResolver(異常解析器)?
- ?作用:統一處理請求處理過程中的異常,返回自定義錯誤視圖或狀態碼。
- ?工具:結合?
@ControllerAdvice
?實現全局異常處理。
-
?MultipartResolver(文件上傳解析器)?
- ?作用:解析?
multipart/form-data
?請求,處理文件上傳。 - ?示例:
CommonsMultipartResolver
?處理文件流。
- ?作用:解析?
-
?LocaleResolver & ThemeResolver(區域與主題解析器)?
- ?作用:支持國際化(i18n)和主題切換,根據請求確定用戶區域或主題。
-
?參數解析器與消息轉換器
- ?Parameter Resolvers:處理?
@RequestParam
、@PathVariable
?等參數綁定。 - ?HttpMessageConverter:轉換請求/響應體數據(如 JSON ? Java 對象),支持?
@RequestBody
?和?@ResponseBody
。
- ?Parameter Resolvers:處理?
二、?請求處理流程
-
?請求接收
-
????????DispatcherServlet 接收 HTTP 請求。
-
-
?處理器匹配?
-
????????HandlerMapping 根據 URL 找到對應的 Controller 方法。
-
-
?方法執行?
-
HandlerAdapter 調用目標方法,處理參數綁定(如解析路徑變量、請求體等),執行業務邏輯。
-
-
?返回處理結果?
-
方法返回?
ModelAndView
?或通過?@ResponseBody
?返回數據。若返回視圖名,由 ViewResolver 解析為具體視圖。
-
-
?視圖渲染?
-
視圖技術(如 JSP、Thymeleaf)使用模型數據渲染頁面,生成響應內容。
-
-
?異常處理?
-
若過程中拋出異常,HandlerExceptionResolver 捕獲并處理,返回錯誤頁面或 JSON 錯誤信息。
-
-
?響應返回?
-
DispatcherServlet 將最終響應發送給客戶端。
-
三、?配置示例
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {// 配置視圖解析器@Beanpublic ViewResolver viewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/views/");resolver.setSuffix(".jsp");return resolver;}// 啟用JSON轉換@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {converters.add(new MappingJackson2HttpMessageConverter());}// 文件上傳支持@Beanpublic MultipartResolver multipartResolver() {return new CommonsMultipartResolver();}
}
四、?總結
????????Spring MVC 的組件化設計實現了職責分離,提升了靈活性和擴展性。開發者可通過配置或注解定制各組件(如替換視圖技術、增加消息轉換器等),適應不同項目需求。理解組件協作流程有助于調試和優化應用,例如自定義異常處理或優化參數綁定邏輯。
(望各位潘安、各位子健/各位彥祖、于晏不吝賜教!多多指正!🙏)