springmvc工作原理及源碼分析

一、JavaEE體系結(jié)構(gòu)

JavaEE體系結(jié)構(gòu).jpg

二、mvc?設(shè)計(jì)模式|思想

mvc.jpg

Model 模型層? (javaBean組件 = 領(lǐng)域模型(javaBean) + 業(yè)務(wù)層 + 持久層)

View 視圖層( html、jsp…)

Controller 控制層(委托模型層進(jìn)行數(shù)據(jù)處理)

三、springmvc簡(jiǎn)介?

? ?springmvc是一個(gè)web層mvc框架,類似struts2。

四、springmvc和spring之間關(guān)系?

spring.jpg

?????????springmvc是spring的部分,其實(shí)就是spring在原有基礎(chǔ)上,又提供了web應(yīng)用的mvc模塊。springmvc和spring之間是屬于無縫整合的,不需要添加上額外的jar包,只需要在原spring的jar包上添加springmvc自身需要的jar包即可運(yùn)行springmvc程序。

五、sprigmvc和struts2的比較

實(shí)現(xiàn)機(jī)制:

struts2是基于過濾器實(shí)現(xiàn)的。

springmvc是基于servlet實(shí)現(xiàn)的。

運(yùn)行速度:

因?yàn)檫^濾器底層是servlet,所以springmvc的運(yùn)行速度會(huì)稍微比structs2快。

struts2是多例的? ? ? ? ? ?

springmvc單例的? ??

參數(shù)封裝:

struts2參數(shù)封裝是基于屬性進(jìn)行封裝。

springmvc是基于方法封裝。顆粒度更細(xì)。??

springmvc和struct2.jpg

六、springmvc的工作原理圖

springmvc工作原理圖.jpg

七、springmvc具體流程步驟

⑴ 用戶發(fā)送請(qǐng)求至DispatcherServlet。

⑵ DispatcherServlet收到請(qǐng)求調(diào)用HandlerMapping查詢具體的Handler。

⑶ HandlerMapping找到具體的處理器(具體配置的是哪個(gè)處理器的實(shí)現(xiàn)類),生成處理器對(duì)象及處理器攔截器(HandlerExcutorChain包含了Handler以及攔截器集合)返回給DispatcherServlet。

⑷ DispatcherServlet接收到HandlerMapping返回的HandlerExcutorChain后,調(diào)用HandlerAdapter請(qǐng)求執(zhí)行具體的Handler(Controller)。

⑸ HandlerAdapter經(jīng)過適配調(diào)用具體的Handler(Controller即后端控制器)。

⑹ Controller執(zhí)行完成返回ModelAndView(其中包含邏輯視圖和數(shù)據(jù))給HandlerAdaptor。

⑺ HandlerAdaptor再將ModelAndView返回給DispatcherServlet。

⑻ DispatcherServlet請(qǐng)求視圖解析器ViewReslover解析ModelAndView。

⑼ ViewReslover解析后返回具體View(物理視圖)到DispatcherServlet。

⑽ DispatcherServlet請(qǐng)求渲染視圖(即將模型數(shù)據(jù)填充至視圖中) 根據(jù)View進(jìn)行渲染視圖。

⑾ 將渲染后的視圖返回給DispatcherServlet。

⑿ DispatcherServlet將響應(yīng)結(jié)果返回給用戶。

八、springmvc核心組件說明

①前端控制器DispatcherServlet(配置即可)

功能:中央處理器,接收請(qǐng)求,自己不做任何處理,而是將請(qǐng)求發(fā)送給其他組件進(jìn)行處理。DispatcherServlet 是整個(gè)流程的控制中心。

②處理器映射器HandlerMapping(配置即可)

功能:根據(jù)DispatcherServlet發(fā)送的url請(qǐng)求路徑查找Handler

常見的處理器映射器:BeanNameUrlHandlerMapping,SimpleUrlHandlerMapping,

ControllerClassNameHandlerMapping,DefaultAnnotationHandlerMapping(不建議使用)

③處理器適配器HandlerAdapter(配置即可)

功能:按照特定規(guī)則(HandlerAdapter要求的規(guī)則)去執(zhí)行Handler。

通過HandlerAdapter對(duì)處理器進(jìn)行執(zhí)行,這是適配器模式的應(yīng)用,通過擴(kuò)展多個(gè)適配器對(duì)更多類型的處理器進(jìn)行執(zhí)行。

常見的處理器適配器:HttpRequestHandlerAdapter,SimpleControllerHandlerAdapter,AnnotationMethodHandlerAdapter

④處理器Handler即Controller(程序猿編寫)

功能:編寫Handler時(shí)按照HandlerAdapter的要求去做,這樣適配器才可以去正確執(zhí)行Handler。

⑤視圖解析器ViewReslover(配置即可)

功能:進(jìn)行視圖解析,根據(jù)邏輯視圖名解析成真正的視圖。

ViewResolver負(fù)責(zé)將處理結(jié)果生成View視圖,ViewResolver首先根據(jù)邏輯視圖名解析成物理視圖名即具體的頁面地址,再生成View視圖對(duì)象,最后對(duì)View進(jìn)行渲染將處理結(jié)果通過頁面展示給用戶。

springmvc框架提供了多種View視圖類型,如:jstlView、freemarkerView、pdfView...

⑥視圖View(程序猿編寫)

View是一個(gè)接口,實(shí)現(xiàn)類支持不同的View類型(jsp、freemarker、pdf...)

九、springmvc入門案例

創(chuàng)建一個(gè)maven工程

maven工程.jpg

配置pom.xml

引入相關(guān)依賴:spring的基本包、springmvc需要的spring-webmvc,日志相關(guān)的slf4j-log4j12,jsp相關(guān)的jstl、servlet-api、jsp-api。

pom.xml

配置web.xml

因?yàn)镈ispatcherServlet本身就是一個(gè)Servlet,所以需要在web.xml配置。

web.xml

配置springmvc.xml

一、使用默認(rèn)加載springmvc配置文件的方式,必須按照以下規(guī)范:

①命名規(guī)則:<servlet-name>-servlet.xml ====> springmvc-servlet.xml

②路徑規(guī)則:<servlet-name>-servlet.xml必須放在WEB-INF下邊

二、如果要不按照默認(rèn)加載位置,則需要在web.xml中通過<init-param>標(biāo)簽來指定springmvc配置文件的加載路徑,如上圖所示。

springmvc.xml

自定義Controller(處理器)

將自定義的 Controller 處理器配置到 spring 容器中交由 spring 容器來管理,因?yàn)檫@里的 springmvc.xml 配置文件中處理器映射器配置的是 BeanNameUrlHandlerMapping ,根據(jù)名字可知這個(gè)處理器映射器是根據(jù) bean (自定義Controller) 的 name 屬性值url去尋找執(zhí)行類 Handler(Controller) ,? 所以bean的name屬性值即是要和用戶發(fā)送的請(qǐng)求路徑匹配的 url 。

MyController.java

定義視圖頁面

根據(jù)視圖解析路徑:WEB-INF/jsps/index.jsp

index.jsp

根據(jù)代碼分析springmvc執(zhí)行流程

springmvc代碼執(zhí)行流程.jpg

處理器映射器(配置多個(gè)處理器映射器可以共存)

<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

功能:根據(jù)bean(自定義Controller)的name屬性的url去尋找執(zhí)行類Controller。

處理器適配器(配置多個(gè)處理器適配器可以共存)

<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

功能:自定義的處理器(Controller)實(shí)現(xiàn)了Controller接口時(shí),適配器就會(huì)執(zhí)行Controller的具體方法。

處理器適配器源碼SimpleControllerHandlerAdapter

SimpleControllerHandlerAdapter源碼分析.jpg

SimpleControllerHandlerAdapter會(huì)自動(dòng)判斷自定義的處理器(Controller)是否實(shí)現(xiàn)了Controller接口,如果是,它將會(huì)自動(dòng)調(diào)用處理器的handleRequest方法。

Controller接口中有一個(gè)方法叫handleRequest,也就是處理器方法。

因此,自定義的Controller要想被調(diào)用就必須實(shí)現(xiàn)Controller接口,重寫Controller接口中的處理器方法。

添加日志

log4j.properties

運(yùn)行結(jié)果

運(yùn)行結(jié)果.jpg

如果覺得這篇文章對(duì)你有幫助的,請(qǐng)記得幫忙點(diǎn)個(gè)贊或關(guān)注,在此先謝謝各位啦!??!O(∩_∩)O

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • SpringMVC的工作原理圖: SpringMVC流程 1、 用戶發(fā)送請(qǐng)求至前端控制器DispatcherSer...
    帥氣人閱讀 359評(píng)論 0 0
  • 2018.12.13 星期四(農(nóng)歷十一月初七)天氣晴 把所有的不愉快留給昨天,把所有的希望給明天,把所有的努力給今...
    善慧_b7b1閱讀 755評(píng)論 0 5
  • 有什么熬不過 大不了唱首歌 離歌
    干涸閱讀 216評(píng)論 0 1
  • 周末總是單調(diào)的,哪天又不是呢,生活就由無數(shù)的單調(diào)和無數(shù)的興奮組成的。寫完了年終總結(jié),看了一些關(guān)于conformal...
    悟空金月餃子閱讀 146評(píng)論 0 0
  • 0926 《把時(shí)間當(dāng)作朋友》 字?jǐn)?shù):640 1、完美永不存在 好萊塢導(dǎo)演卡梅隆,為了拍出《阿凡達(dá)》,在拍完《泰坦尼...
    奔跑的Danielle閱讀 225評(píng)論 0 0

友情鏈接更多精彩內(nèi)容