版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Spring MVC 技術(shù)交流,作者:翁玉鵬,目 錄,MVC設(shè)計(jì)思想,MVC即Model-View-Controller,把一個(gè)應(yīng)用的輸入、處理、輸出流程按照Model、View、Controller的方式進(jìn)行分離,這樣一個(gè)應(yīng)用被分成三個(gè)層模型層、視圖層、控制層。,MVC設(shè)計(jì)思想,MVC是一種復(fù)合模式,結(jié)合了觀察者模式、策略模式、組合模式、適配器模式。 模型使用觀察者模式,以便觀察者更新,同時(shí)保持兩者之間的解耦??刂破魇且晥D的策略,視圖使用組合模式實(shí)現(xiàn)用戶界面。適配器模式用來將模型適配成符合現(xiàn)有視圖和控制器的需要的模型。 這些模式合作把MVC模式的三層解耦。,MVC設(shè)計(jì)思想,視圖(View)代
2、表用戶交互界面,對于Web應(yīng)用來說,可以是HTML,也可能是jsp、XML和Applet等。一個(gè)應(yīng)用可能有很多不同的視圖,MVC設(shè)計(jì)模式對于視圖的處理僅限于視圖上數(shù)據(jù)的采集和處理,以及用戶的請求,而不包括在視圖上的業(yè)務(wù)流程的處理。業(yè)務(wù)流程的處理交予模型(Model)處理。 比如一個(gè)訂單的視圖只接受來自模型的數(shù)據(jù)并顯示給用戶,以及將用戶界面的輸入數(shù)據(jù)和請求傳遞給控制和模型。,MVC設(shè)計(jì)思想,模型(Model):是業(yè)務(wù)的處理以及業(yè)務(wù)規(guī)則的制定。模型接受視圖請求的數(shù)據(jù),并返回最終的處理結(jié)果。業(yè)務(wù)模型的設(shè)計(jì)是MVC最主要的核心。MVC設(shè)計(jì)模式告訴我們,把應(yīng)用的模型按一定的規(guī)則抽取出來,抽取的層次很重要
3、,抽象與具體不能隔得太遠(yuǎn),也不能太近。MVC并沒有提供模型的設(shè)計(jì)方法,而只是組織管理這些模型,以便于模型的重構(gòu)和提高重用性。 業(yè)務(wù)模型還有一個(gè)很重要的模型那就是數(shù)據(jù)模型。數(shù)據(jù)模型主要指實(shí)體對象的數(shù)據(jù)保存(持續(xù)化)。比如將一張訂單保存到數(shù)據(jù)庫,從數(shù)據(jù)庫獲取訂單。我們可以將這個(gè)模型單獨(dú)列出,所有有關(guān)數(shù)據(jù)庫的操作只限制在該模型中。,MVC設(shè)計(jì)思想,控制(Controller)可以理解為從用戶接收請求, 將模型與視圖匹配在一起,共同完成用戶的請求。劃分控制層的作用也很明顯,它清楚地告訴你,它就是一個(gè)分發(fā)器,選擇什么樣的模型,選擇什么樣的視圖,可以完成什么樣的用戶請求??刂茖硬⒉蛔鋈魏蔚臄?shù)據(jù)處理。 例如
4、,用戶點(diǎn)擊一個(gè)連接,控制層接受請求后, 并不處理業(yè)務(wù)信息,它只把用戶的信息傳遞給模型,告訴模型做什么,選擇符合要求的視圖返回給用戶。因此,一個(gè)模型可能對應(yīng)多個(gè)視圖,一個(gè)視圖可能對應(yīng)多個(gè)模型。,Jsp model 1架構(gòu),Model 1的基礎(chǔ)是JSP文件,它由一些相互獨(dú)立的JSP文件和其他一些Java Class組成。這些JSP從HTTP Request中獲得所需要的數(shù)據(jù),處理業(yè)務(wù)邏輯,然后將結(jié)果通過Response返前端瀏覽器。Model 1的應(yīng)該說是唯一的好處是“簡單”,可以大大加快系統(tǒng)的開發(fā)進(jìn)度。它把表現(xiàn)層和業(yè)務(wù)邏輯層柔和在一起,不利于以后的維護(hù)工作以及開發(fā)角色的分配,所以這種模式只能適合
5、于小的系統(tǒng)開發(fā)。,Jsp model 2架構(gòu),Model 2采用面向?qū)ο蠹夹g(shù)實(shí)現(xiàn)MVC模式 從而擴(kuò)展JSP/Servlet的模式。 Model2是MVC在Web上的應(yīng)用。,一個(gè)Model 2規(guī)范實(shí)現(xiàn)的Web框架,一個(gè)Model 2規(guī)范實(shí)現(xiàn)的Web框架,視圖層采用JSP實(shí)現(xiàn);控制層采用Servlet實(shí)現(xiàn),整個(gè)框架采用同一個(gè)Servlet,以實(shí)現(xiàn)請求的中轉(zhuǎn);模型層采用Java實(shí)現(xiàn),主要決定用來做什么;在模型層后添加了一個(gè)DAO,目的是將決定做什么和具體怎么做分開。 整個(gè)Web框架大致的流程是:首先客戶端發(fā)送請求,提交JSP頁面給中轉(zhuǎn)器(Servlet);中轉(zhuǎn)器根據(jù)客戶的請求,選擇相應(yīng)的模型層,即L
6、ogic,Logic進(jìn)行相應(yīng)的邏輯處理;如果需要使用數(shù)據(jù)庫,則通過DAO進(jìn)行相應(yīng)的數(shù)據(jù)庫操作。,Spring MVC 架構(gòu),Spring MVC是結(jié)構(gòu)最清晰的MVC Model 2實(shí)現(xiàn)。它的Action也不叫Action,而是稱做Controller;Controller接收request, response參數(shù),然后返回ModelAndView(其中的Model不是Object類型,而是Map類型)。但在其它的Web Framework中,Action返回值一般都只是一個(gè)View Name;Model則需要通過其它的途徑(如request.attribute,Context參數(shù),或Actio
7、n本身的屬性數(shù)據(jù))傳遞上去。,Spring Web MVC請求處理流程,Spring MVC 特點(diǎn),清晰的角色劃分:控制器(controller)、驗(yàn)證器(validator)、 命令對象(command object)、表單對象(form object)、模型對象(model object)、 Servlet分發(fā)器(DispatcherServlet)、 處理器映射(handler mapping)、視圖解析器(view resolver)等。 每一個(gè)角色都可以由一個(gè)專門的對象來實(shí)現(xiàn)。 強(qiáng)大而直接的配置方式:將框架類和應(yīng)用程序類都能作為JavaBean配置,支持跨多個(gè)context的引用,例
8、如,在web控制器中對業(yè)務(wù)對象和驗(yàn)證器(validator)的引用。 可適配、非侵入:可以根據(jù)不同的應(yīng)用場景,選擇合適的控制器子類 (simple型、command型、form型、wizard型、multi-action型或者自定義),而不是從單一控制器 (比如Action/ActionForm)繼承。,Spring MVC 特點(diǎn),可重用的業(yè)務(wù)代碼:可以使用現(xiàn)有的業(yè)務(wù)對象作為命令或表單對象,而不需要去擴(kuò)展某個(gè)特定框架的基類。 可定制的綁定(binding) 和驗(yàn)證(validation):比如將類型不匹配作為應(yīng)用級的驗(yàn)證錯(cuò)誤, 這可以保存錯(cuò)誤的值。再比如本地化的日期和數(shù)字綁定等等。在其他某些框
9、架中,你只能使用字符串表單對象, 需要手動解析它并轉(zhuǎn)換到業(yè)務(wù)對象。 可定制的handler mapping和view resolution:Spring提供從最簡單的URL映射, 到復(fù)雜的、專用的定制策略。與某些web MVC框架強(qiáng)制開發(fā)人員使用單一特定技術(shù)相比,Spring顯得更加靈活。 靈活的model轉(zhuǎn)換:在Springweb框架中,使用基于Map的 鍵/值對來達(dá)到輕易地與各種視圖技術(shù)的集成。,Spring MVC 特點(diǎn),可定制的本地化和主題(theme)解析:支持在JSP中可選擇地使用Spring標(biāo)簽庫、支持JSTL、支持Velocity(不需要額外的中間層)等等。 簡單而強(qiáng)大的JSP
10、標(biāo)簽庫(Spring Tag Library):支持包括諸如數(shù)據(jù)綁定和主題(theme) 之類的許多功能。 JSP表單標(biāo)簽庫:在Spring2.0中引入的表單標(biāo)簽庫,使得在JSP中編寫 表單更加容易。 Spring Bean的生命周期可以被限制在當(dāng)前的HTTP Request或者HTTP Session。,目 錄,Spring MVC 重要組件,1.spring mvc請所有的請求都提交給DispatcherServlet,它會委托應(yīng)用系統(tǒng)的其他模塊負(fù)責(zé)負(fù)責(zé)對請求進(jìn)行真正的處理工作。2.DispatcherServlet查詢一個(gè)或多個(gè)HandlerMapping,找到處理請求的Controll
11、er.3.DispatcherServlet請請求提交到目標(biāo)Controller4.Controller進(jìn)行業(yè)務(wù)邏輯處理后,會返回一個(gè)ModelAndView5.Dispathcher查詢一個(gè)或多個(gè)ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象6.視圖對象負(fù)責(zé)渲染返回給客戶端,Spring MVC 架構(gòu)類圖,DispatcherServlet,DispatcherServlet,應(yīng)用了“ Front Controller”模式 是所有 Spring MVC 請求的中樞。 繼承了HttpServlet,是一個(gè)Servlet,由WebApplicationCon
12、text 加載 如果不作其它配置,會加載默認(rèn)組件,在web.xml配DispatcherServlet,web.xml dispatcher org.springframework.web.servlet.DispatcherServlet contextConfigLocation WEB-INF/mvc.xml 1 ,HandlerMapping,HandlerMapping,將web請求映射到正確的處理器(handler)上 , 通常是一個(gè) Controller 不需用自定義處理器映射 已經(jīng)內(nèi)置了很多處理器映射策略 在處理器映射中通過配置攔截器(包括處理器執(zhí)行前、執(zhí)行后、或者執(zhí)行前后運(yùn)行
13、攔截器)將使其功能更強(qiáng)大,BeanNameUrlHandlerMapping,把一個(gè) URL 影射到一個(gè)和它名字相同的已注冊的bean 比如 /simple 將影射到一個(gè)名為“/simple”的bean。 可以給bean多個(gè)名字 (別名) 通過空格來分隔 必須有一個(gè)name屬性 “/”在xml中不能定義id屬性 在bean名字中可以使用通配符 (/simple*) 是默認(rèn)的 HandlerMapping,如果在上下文中沒有找到處理器映射,DispatcherServlet會為你創(chuàng)建一個(gè)BeanNameUrlHandlerMapping,但不鼓勵(lì),BeanNameUrlHandlerMappin
14、g,dispatcher-servlet.xml ,SimpleUrlHandlerMapping,最常用的處理器映射,將請求的URLs 影射到handlers 由一系列的分別代表URLs 和bean 的名字的name/value 對來定義影射。 Bean的名字可以用通配符 (/simple*),SimpleUrlHandlerMapping,dispatcher-servlet.xml /simple.htm=simpleController /test*=testController ,ControllerClassNameHandlerMapping,支持慣例優(yōu)先原則 在它的應(yīng)用上下文中
15、找出所有不同的處理器(handler)(或Controller)bean, 并去掉名稱中的Controller,來定義它的處理器映射。Removed Controller from class name 全部轉(zhuǎn)為小寫 前面加 “/” 后面附 *“ 例子: WelcomeController映射到“/welcome*”請求URL 極大的減少了影射的配置,ControllerClassNameHandlerMapping,dispatcher-servlet.xml ,Controllers,Controller 接口,負(fù)責(zé)處理請求 內(nèi)部參數(shù)繼承 HttpServlet handleRequest
16、(HttpServletRequest, HttpServletResponse) 返回一個(gè) ModelAndView對象 所有實(shí)現(xiàn)都是線程安全的 基本不用自己實(shí)現(xiàn)接口 已經(jīng)提供了很多實(shí)用的實(shí)現(xiàn)類,ModelAndView 對象,封裝了用來渲染頁面的 model和view Model 用 java.util.Map實(shí)現(xiàn)的 添加對象,可以不需用名字: addObject(String, Object) 用顯式名字添加 addObject(Object) 用默認(rèn)名添加 (慣例優(yōu)先) View 用 String 或 View 對象表示 類似 Struts的 Action,Controller 實(shí)現(xiàn),
17、通常在我們的應(yīng)用中要求Controllers: 自動作默認(rèn)處理 (不用編碼) 簡單web處理 在web 層和service 層之間作相應(yīng)的處理 參數(shù)處理 視圖跳轉(zhuǎn) 輸入驗(yàn)證,AbstractController,提供了簡單的操作 用來處理一個(gè)簡單的請求 protected ModelAndView handleRequestInternal( HttpServletRequest request, HttpServletResponse response) String text = service.getText(); return new ModelAndView( simple, tex
18、t, text); ,ThrowawayController,中文叫做一次性控制器,也就像一次性筷子那樣用完即丟 并不在Spring的Controller繼承架構(gòu)中,而是一個(gè)獨(dú)立的接口定義 當(dāng)映射的不是一個(gè)model 對象時(shí)很有用 Bean的作用域必須是prototype ,他們本身不是線程安全的,ThrowawayController,dispatcher-servlet.xml ,配置作為一個(gè) prototype bean,ThrowawayController,public class ExampleThrowawayController implements ThrowawayCont
19、roller private String message; public void setMessage(String message) this.message = message; public ModelAndView execute() throws Exception String hashCodeMessage = + hashCode() + - + message; return new ModelAndView(throwaway, message, hashCodeMessage); ,Command Controllers,提供了一種和數(shù)據(jù)對象交互的方式,并動態(tài)地將來自
20、HttpServletRequest的參數(shù)綁定到指定的數(shù)據(jù)對象上。 功能和Struts中的ActionForm有點(diǎn)像,不過在Spring中,不需要實(shí)現(xiàn)任何接口來實(shí)現(xiàn)數(shù)據(jù)綁定 Command 可以是任何 POJO 通常是一個(gè) domain對象 提供的功能: 綁定用戶類型 自動驗(yàn)證 自動創(chuàng)建command對象 稍后會用到,Command Controllers,AbstractCommandController 提供綁定和驗(yàn)證 SimpleFormController 除了提供綁定和驗(yàn)證, 還提供了工作流中的表單處理 對表單form處理很有用 具體細(xì)節(jié)后面介紹 AbstractWizardForm
21、Controller 適合涉及多個(gè)頁面的表單form處理,其他 Controllers,ServletWrappingController and ServletForwardingController 為了Struts專門設(shè)計(jì)的,在spring攔截器里封裝了Struts servlet,作用相當(dāng)于代理Struts的ActionServlet ParameterizableViewController 簡單的返回一個(gè)指定的視圖名稱,不涉及客戶端視圖技術(shù)(從而避免了在Java代碼中的硬編碼) UrlFilenameViewController 會檢查URL,獲取文件請求的文件名,并把它作為視圖名
22、加以使用。如:/index.html對應(yīng)的視圖文件名是index,Interceptors,Interceptors,在請求前后添加其它功能 包括攔截器方法 preHandle and postHandle 包括回調(diào)方法 afterCompletetion 可以通過 HandlerMapping 和一系列Controller關(guān)聯(lián)上,Interceptor 實(shí)現(xiàn),實(shí)現(xiàn) HandlerInterceptor 或WebRequestInterceptor Spring 提供的幾個(gè)實(shí)現(xiàn) OvenXxxInViewInteceptor 用于 OR
23、M 架構(gòu)JDO, JPA and Hibernate UserRoleAuthorizationInterceptor 用于各種角色授權(quán)驗(yàn)證 其他有用的擴(kuò)展: 自定義安全, caching, ,Interceptor 例子,下面的例子提供了一個(gè)攔截器,它攔截所有請求,如果當(dāng)前時(shí)間不是在上午9點(diǎn)到下午6點(diǎn),它將用戶重定向到某個(gè)頁面。 所有的請求都將被TimeBasedAccessInterceptor截獲, 如果當(dāng)前時(shí)間不在上班時(shí)間,用戶會被重定向到一個(gè)靜態(tài)html頁面,提供諸如只有上班時(shí)間才能訪問網(wǎng)站之類的告示。,Interceptor 例子, /*.form=editAccountFormC
24、ontroller /*.view=editAccountFormController ,Interceptor 例子,package samples; public class TimeBasedAccessInterceptor extends HandlerInterceptorAdapter private int openingTime; private int closingTime; public void setOpeningTime(int openingTime) this.openingTime = openingTime; public void setClosingT
25、ime(int closingTime) this.closingTime = closingTime; public boolean preHandle( HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception Calendar cal = Calendar.getInstance(); int hour = cal.get(HOUR_OF_DAY); if (openingTime = hour closingTime) return true; else resp
26、onse.sendRedirect( return false; ,ViewResolver,ViewResolver,從一個(gè)邏輯視圖名映射到一個(gè)視圖對象 可以排序, 所以能鏈在一起 對JSP用戶, 通常實(shí)現(xiàn) InternalResourceViewResolver: ,其他 ViewResolver 實(shí)現(xiàn),VelocityViewResolver 針對Velocity templates設(shè)計(jì)的 FreeMarkerViewResolver 針對 FreeMarker templates設(shè)計(jì)的 ResourceBundleViewResolver 映射關(guān)系在一個(gè) properties 文件 支持國際化 XmlViewResolver 映射關(guān)系在XML文件,視圖 View,視圖 View,支持的幾種視圖模板技術(shù): InternalResourceView (JSP) JstlView (JSP + JSTL) VelocityView (Velocity) FreeMarkerView (FreeMarker) TilesView (Tiles) TilesJstlView (Tiles + JSTL),View,還支持渲染下列視圖 Excel files PDF
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版房屋買賣合同中的房屋抵押及解押約定3篇
- 二零二五河南事業(yè)單位100人招聘項(xiàng)目合同執(zhí)行標(biāo)準(zhǔn)3篇
- 二零二五版建筑工程項(xiàng)目現(xiàn)場勘察與監(jiān)測服務(wù)合同3篇
- 二零二五版混凝土結(jié)構(gòu)防雷接地施工合同2篇
- 二零二五年度草場承包管理與開發(fā)合同范本3篇
- 二零二五版國際貿(mào)易實(shí)務(wù)實(shí)驗(yàn)報(bào)告與國際貿(mào)易實(shí)務(wù)實(shí)訓(xùn)合同3篇
- 二零二五年度虛擬現(xiàn)實(shí)(VR)技術(shù)研發(fā)合同3篇
- 二零二五年度特種貨物安全運(yùn)輸服務(wù)合同范本2篇
- 二零二五年度體育設(shè)施建設(shè)與運(yùn)營管理復(fù)雜多條款合同3篇
- 二零二五年度電梯門套安裝與安全性能檢測合同3篇
- 建筑工程一切險(xiǎn)條款版
- 人教版八年級下冊第一單元英語Unit1 單元設(shè)計(jì)
- PEP小學(xué)六年級英語上冊選詞填空專題訓(xùn)練
- 古建筑修繕項(xiàng)目施工規(guī)程(試行)
- GA 844-2018防砸透明材料
- 化學(xué)元素周期表記憶與讀音 元素周期表口訣順口溜
- 非人力資源經(jīng)理的人力資源管理培訓(xùn)(新版)課件
- MSDS物質(zhì)安全技術(shù)資料-201膠水
- 鉬氧化物還原過程中的物相轉(zhuǎn)變規(guī)律及其動力學(xué)機(jī)理研究
- (完整word)2019注冊消防工程師繼續(xù)教育三科試習(xí)題及答案
- 《調(diào)試件現(xiàn)場管理制度》
評論
0/150
提交評論