MVC是英文Modle View Controller的簡稱,是一種軟件設(shè)計(jì)典范,目的是將業(yè)務(wù)邏輯、數(shù)據(jù)、頁面視圖代碼分離,達(dá)到增加開發(fā)效率、降低耦合度、代碼更利于維護(hù)的目的。
Spring MVC是一個(gè)流行的MVC框架,我們知道Spring核心是解決業(yè)務(wù)邏輯層和其他各層的松耦合問題,Spring MVC由Spring基礎(chǔ)框架支撐,讓開發(fā)JAVA Web 程序變得更簡單。
Spring MVC 框架原理:
1.用戶HTTP請求 ——> DispatcherServlet(調(diào)度器根據(jù)請求進(jìn)行調(diào)度)
2.DispatcherServlet ——> HandlerMApping(找到對應(yīng)的處理器)
3.HandlerMapping ——> Controller(調(diào)用對應(yīng)的處理器)
4.Controller ——>業(yè)務(wù)層(調(diào)用業(yè)務(wù)層完成相應(yīng)的業(yè)務(wù))
5.業(yè)務(wù)層 ——> ModelAndView(處理結(jié)果數(shù)據(jù))
6.ModelAndView ——>DispatcherServlet ——>ViewResolver(視圖解析器做處理)
7.ViewResolver ——> View(模型數(shù)據(jù)顯示) ——>用戶
Spring MVC 實(shí)現(xiàn)源碼解析
ContextLoaderListener類:
簡述:ContextLoaderListener類是一個(gè)監(jiān)聽類,在Tomcat啟動后創(chuàng)建一個(gè)IOC容器,并將創(chuàng)建的IOC容器存到servletContext中。
web.xml中的配置:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
springMVC父容器初始化流程圖:
DispatcherServlet類:
簡述:DispatcherServlet是SpringMVC的入口,DispatcherServlet類主要用作職責(zé)調(diào)度工作,本身主要用于控制流程。
代碼實(shí)現(xiàn)的業(yè)務(wù)邏輯:
DispatcherServlet類本身也是一個(gè)Servlet,以下是該類的關(guān)系圖:
DispatcherServlet調(diào)度器架構(gòu)原理:
HandlerMapping接口:
簡述:根據(jù)調(diào)度器的請求找到一個(gè)處理器handler,其實(shí)現(xiàn)機(jī)制簡單來說就是維持了一個(gè)url到Controller關(guān)系的Map結(jié)構(gòu)。
實(shí)現(xiàn)機(jī)制:
HandlerMapping的實(shí)現(xiàn)機(jī)制就是根據(jù)request來獲得HandlerExecutionChain,其實(shí)就是獲取真正要執(zhí)行的Controller或者某個(gè)具體的方法。HandlerMapping接口提供唯一的方法getHandler(HttpServletRequest request)。
ViewResolver接口:
簡述:ViewResolver的主要作用是把一個(gè)邏輯上的視圖名稱解析為一個(gè)真正的視圖。
InternalResourceViewResolver類是ViewResolver的實(shí)現(xiàn)類,在xml中配置如下:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
View接口:
簡述:View接口的職責(zé)就是接收model對象、Request對象、Response對象,并渲染輸出結(jié)果給Response對象。