什麼是SpringMVC
1、概述

Spring MVC是Spring Framework的一部分,是基于Java實作MVC的輕量級Web架構。
檢視官方文檔:https://docs.spring.io/spring-framework/docs
我們為什麼要學習SpringMVC呢?
Spring MVC的特點:
- 輕量級,簡單易學
- 高效,基于請求響應的MVC架構
- 與Spring相容性好,無縫結合
- 約定優于配置
- 功能強大:RESTful、資料驗證、格式化、本地化、主題等
- 簡潔靈活
Spring的web架構圍繞DispatcherServlet[排程Servlet]設計。
DispatcherServlet的作用是将請求分發到不同的處理器。從Spring 2.5開始,使用Java 5或者以上版本的使用者可以采用基于注解形式進行開發,十分簡潔。
正因為SpringMVC好,簡單、便捷、易學,天生與Spring無縫結合(使用SpringIoC和Aop),使用約定優于配置。能夠進行簡單的junit測試。支援Restful風格。異常處理,本地化,國際化,資料驗證,類型轉換,攔截器 等等......是以我們要學習。
最重要的一點還是用的人多,使用的公司多。
2、中心控制器
Spring的web架構圍繞DispatcherServlet設計。DispatcherServlet的作用是将請求分發到不同的處理器。從Spring 2.5開始,使用Java 5或以上版本的使用者可以采用基于注解的controller聲明方式。
Spring MVC架構像許多其它MVC架構一樣,以請求為驅動,圍繞一個中心Servlet分派請求及提供其它功能,DispatcherServlet是一個實際的Servlet(它繼承自HttpServlet基類)。
SpringMVC的原理如下圖所示:
前端控制器:DispatcherServlet
頁面控制器:Controller接口實作類,或注釋@Controller的類
3、SpringMVC執行原理
圖為SpringMVC的一個較完整的流程圖,實線表示SpringMVC架構提供的技術,不需要開發者實作,虛線表示需要開發者實作。
簡要分析執行流程
-
DispatcherServlet表示前置控制器,是整個SpringMVC的控制中心。使用者送出請求,DispatcherServlet接收請求并攔截請求。
我們假設請求的url為:
如上url拆分成三部分:http://loaclhost:8080/SpringMVC/hello
伺服器域名http://localhost:8080
部署在伺服器上的web站點SpringMVC
表示控制器hello
- HandlerMapping為處理器映射器(兩種類型、三種實作)。根據url的
/hello
去尋找具體的handler(handler就是Controller對象)。
兩種類型:
三種實作:org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping rg.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
- 實作Controller接口
- 實作HttpRequestHandler接口
- @Controller注解
- HandlerExecution(JDK1.8是HandlerExecutionChain)表示具體的handler
- 把handler傳回給DispatcherServlet
- HandlerAdapter(接口)表示處理器擴充卡,根據handler找到具體的HandlerAdapter的實作類
org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
- 用HandlerAdapter去執行Controller中的方法
- Controller将具體的執行資訊傳回給HandlerAdapter,如ModelAndView。
- HandlerAdapter将ModelAndView傳遞給DispatcherServlet。
- DispatcherServlet調用視圖解析器(ViewResolver)來解析HandlerAdapter傳遞的ModelAndView。
- 視圖解析器将解析後的ModelAndView傳給DispatcherServlet。
- spatcherServlet根據視圖解析器解析的視圖結果,調用具體的視圖。
- 最終視圖呈現給使用者。