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

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

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)系?

?????????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的工作原理圖

七、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工程

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

配置web.xml
因?yàn)镈ispatcherServlet本身就是一個(gè)Servlet,所以需要在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配置文件的加載路徑,如上圖所示。

自定義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 。

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

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

處理器映射器(配置多個(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會(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接口中的處理器方法。
添加日志

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

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