版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
學(xué)習(xí)要點(diǎn)Spring的設(shè)計(jì)模式Spring的控制反轉(zhuǎn)原理印ring實(shí)現(xiàn)MVC的機(jī)制MyEclipse中的Spring開(kāi)發(fā)Spring的典型應(yīng)用返回10.1Spring簡(jiǎn)介10.1.1Spring的起源和背景
2002年wrox出版的《ExpertoneononeJ2EEdesignanddevelopment》一書(shū)。該書(shū)的作者是RodJohnson。在書(shū)中,Johnson對(duì)傳統(tǒng)J2EE架構(gòu)提出深層次的思考和質(zhì)疑,并提出J2EE的實(shí)用主義思想。2003年,J2EE領(lǐng)域出現(xiàn)一個(gè)新的樞架:Spring,該樞架同樣出自Johnson之手。事實(shí)上,Spring架是《ExpertoneononeJ2EEdesignanddevelopment》一書(shū)中思想的全面體現(xiàn)和完善,Spring對(duì)實(shí)用主義J2EE思想進(jìn)一步改造和擴(kuò)充,使其發(fā)展成更開(kāi)人、清晰、全面及高效的開(kāi)發(fā)樞架。一經(jīng)推出,就得到眾多開(kāi)發(fā)者的擁戴。下一頁(yè)返回10.1Spring簡(jiǎn)介傳統(tǒng)J2EE應(yīng)用的開(kāi)發(fā)效率低,應(yīng)用服務(wù)器廠商對(duì)各種技術(shù)的支持并沒(méi)有真正統(tǒng)一,導(dǎo)致J2EE的應(yīng)用沒(méi)有真正實(shí)現(xiàn)WriteOnce及RunAnywhere的承諾。印ring作為開(kāi)源的中間件,獨(dú)立于各種應(yīng)用服務(wù)器,甚至無(wú)須應(yīng)用服務(wù)器的支持,也能提供應(yīng)用服務(wù)器的功能,如聲明式事務(wù)等。Spring致力于J2EE應(yīng)用的各層的解決方案,而不是僅僅專注于某一層的方案。可以說(shuō)Spring是企業(yè)應(yīng)用開(kāi)發(fā)的“一站式”選擇,并貫穿表現(xiàn)層、業(yè)務(wù)層及持久層。然而,Spring并不想取代那些已有的框架,而與它們無(wú)縫地整合。總結(jié)起來(lái),Spring有如下優(yōu)點(diǎn)。上一頁(yè)下一頁(yè)返回10.1Spring簡(jiǎn)介(1)低侵入式設(shè)計(jì),代碼污染極低。(2)獨(dú)立于各種應(yīng)用服務(wù)器,可以真正實(shí)現(xiàn)WriteOnce,RunAnywhere的承諾。(3)Spring的DI機(jī)制降低了業(yè)務(wù)對(duì)象替換的復(fù)雜性。(4)Springy并不完全依賴于Springy,開(kāi)發(fā)者可自由選用Springy框架的部分或全部。上一頁(yè)下一頁(yè)返回10.1Spring簡(jiǎn)介10.1.2Spring的組成模塊Spring是由以下幾個(gè)模塊組成的,這些模塊提供了開(kāi)發(fā)企業(yè)級(jí)應(yīng)用所需要的基本功能,可以在自己的程序中選擇使用需要的模塊。Spring模塊組成如圖10-1所示。1.SpringCore模塊核心容器提供Spring樞架的基本功能。核模式的實(shí)現(xiàn)。BeanFactory使用控制反轉(zhuǎn)(IoC)的應(yīng)用程序代碼分開(kāi)。心容器的主要組件是BeanFactory,它是工廠模式將應(yīng)用程序的配置和依賴性規(guī)范與實(shí)際的應(yīng)用程序代碼分開(kāi)。上一頁(yè)下一頁(yè)返回10.1Spring簡(jiǎn)介2.SpringContext模塊
Spring上下文是一個(gè)配置文件,向Spring樞架提供上下文信息。Sping上下文包括企業(yè)服務(wù),如JNDI,EJB,電子郵件、國(guó)際化、校驗(yàn)和調(diào)度功能。3.SpringAOP模塊通過(guò)配置管理特性,SpringAOP模塊直接將面向方面的編程功能集成到了Spring樞架中。所以,可以很容易地使Spring樞架管理的任何對(duì)象支持AOP。SpringAOP模塊為基于Spring的應(yīng)用程序中的對(duì)象提供了事務(wù)管理服務(wù)。通過(guò)使用SpringAOP,不用依賴EJB組件,就可以將聲明性事務(wù)管理集成到應(yīng)用程序中。上一頁(yè)下一頁(yè)返回10.1Spring簡(jiǎn)介4.SpringDAO模塊JDBCDAO抽象層提供了有意義的異常層次結(jié)構(gòu),可用該結(jié)構(gòu)來(lái)管理異常處理和不同數(shù)據(jù)庫(kù)供應(yīng)商拋出的錯(cuò)誤消息。異常層次結(jié)構(gòu)簡(jiǎn)化了錯(cuò)誤處理,并且極大地降低了需要編寫的異常代碼數(shù)量(如打開(kāi)和關(guān)閉連接)。SpringDAO的面向JDBC的異常遵從通用的DAO異常層次結(jié)構(gòu)。5.SpringORM模塊印ring樞架插入了若干個(gè)ORM樞架,從而提供了ORM的對(duì)象關(guān)系工具,JDO,Hibernate和iBalisSQLMap。所有這些都遵從Spring的通用事務(wù)和DAO結(jié)構(gòu)。其中包括異常層次上一頁(yè)下一頁(yè)返回10.1Spring簡(jiǎn)介6.SpringWeb模塊Web上下文模塊建立在應(yīng)用程序上下文模塊之上,為基于Web的應(yīng)用程序提供了上下文。所以,Spring樞架支持與JakartaStruts的集成。Web模塊還簡(jiǎn)化廠處理多部分請(qǐng)求以及將請(qǐng)求參數(shù)綁定到域?qū)ο蟮墓ぷ鳌?.SpringWebMVC模塊MVC樞架是一個(gè)全功能的構(gòu)建Web應(yīng)用程序的MVC實(shí)現(xiàn)。通過(guò)策略接口,MVC樞架變成為高度可配置的,MVC容納了大量視圖技術(shù),其中包括JSP,Velocity,Tiles,iText和POI。上一頁(yè)下一頁(yè)返回10.1Spring簡(jiǎn)介10.1.3
案例一:應(yīng)用MyEclipse搭建Spring開(kāi)發(fā)環(huán)境【案例功能】在MyEclipse中運(yùn)行第一個(gè)Spring實(shí)例。【案例目標(biāo)】學(xué)習(xí)在MyEclipse中搭建Spring開(kāi)發(fā)環(huán)境。【案例要點(diǎn)】Spring樞架的搭建、Spring實(shí)例的開(kāi)發(fā)步驟【案例步驟】(1)創(chuàng)建第10章源碼文件夾ch10。(2)為項(xiàng)目添加Spring屬性,如圖10-2——圖10-4所示。添加Spring屬性后在MyEclipse工程中會(huì)出現(xiàn)Spring相關(guān)資源包,在src中會(huì)增加配置文件application一Contextxml文件。(3)在ch10中編寫JavaBean源代碼文件ShowMessagc.Java。上一頁(yè)下一頁(yè)返回10.1Spring簡(jiǎn)介【源碼】ShowMessage.java上一頁(yè)下一頁(yè)返回10.1Spring簡(jiǎn)介【代碼說(shuō)明】第10-13行:用戶自定義方法show(),功能是輸出成員變量message的內(nèi)容。(4)在src中編寫配置文件applicationContext.Xml。【源碼】applicationContext.Xml上一頁(yè)下一頁(yè)返回10.1Spring簡(jiǎn)介上一頁(yè)下一頁(yè)返回10.1Spring簡(jiǎn)介【代碼說(shuō)明】①第5行:定義了ShowMessage類的實(shí)例化對(duì)象myBean。②第6-8行:將對(duì)象myBean的成員變量message賦值為“HelloSpring!”從以上配置文件的代碼中可以看到,在配置文件中定義了一個(gè)新的bean,設(shè)置id的值為myBean,其對(duì)應(yīng)的類就是剛剛建立的ch10包下的ShowMessage類。這個(gè)類有一個(gè)屬性message需要被傳遞參數(shù)“HelloSpring!”。(5)在ch10中編寫測(cè)試程序MyTest.Java。【源碼】MyTest.Java上一頁(yè)下一頁(yè)返回10.1Spring簡(jiǎn)介上一頁(yè)下一頁(yè)返回10.1Spring簡(jiǎn)介【代碼說(shuō)明】①第2-3行:導(dǎo)入相關(guān)類。②第6-7行:獲取Spring的上下文環(huán)境。③第8行:從上下文環(huán)境獲取myBean。④第9行:調(diào)用ShowMessage的show方法輸出消息。(6)運(yùn)行測(cè)試程序結(jié)果如圖10-5所示。上一頁(yè)下一頁(yè)返回10.2Spring的控制反轉(zhuǎn)10.2.1
理解反轉(zhuǎn)控制控制反轉(zhuǎn)是Spring的核心技術(shù)之一,在任何Java應(yīng)用系統(tǒng)中,要實(shí)現(xiàn)具體的業(yè)務(wù)邏輯,都需要很多Java類的協(xié)同工作才能完成。程序運(yùn)行期間,每個(gè)Java對(duì)象必須在得到所需調(diào)用的對(duì)象之后才能繼續(xù)運(yùn)行,這種對(duì)象之間的關(guān)系就是依賴。在傳統(tǒng)的應(yīng)用系統(tǒng)中,這種依賴關(guān)系是通過(guò)在代碼中調(diào)用其他類來(lái)完成的,這樣就增加了耦合度,從而給系統(tǒng)帶來(lái)種種隱患;而在IoC中,對(duì)象之間的依賴關(guān)系在統(tǒng)一的配置文件中進(jìn)行描述,不會(huì)在程序中用代碼直接調(diào)用其他類的對(duì)象。在程序運(yùn)行期間,IoC容器負(fù)責(zé)把對(duì)象之間的依賴關(guān)系注入,使各個(gè)對(duì)象之間協(xié)同工作,從而實(shí)現(xiàn)系統(tǒng)的功能。不管是依賴注入,還是控制反轉(zhuǎn),都說(shuō)明Spring采用動(dòng)態(tài)、靈活的下一頁(yè)返回10.2Spring的控制反轉(zhuǎn)方式來(lái)管理各種對(duì)象。對(duì)象與對(duì)象之間的具體實(shí)現(xiàn)互相透明。在理解依賴注入之前,看如下這個(gè)問(wèn)題在各種社會(huì)形態(tài)里如何解決:一個(gè)人(Java實(shí)例,調(diào)用者)需要一把斧子(Java實(shí)例,被調(diào)用者)。原始社會(huì)里,幾乎沒(méi)有社會(huì)分工。需要斧子的人(調(diào)用者)只能自己去磨一把斧子(被調(diào)用者)。對(duì)應(yīng)的情形為:Java程序里的調(diào)用者自己創(chuàng)建被調(diào)用者。進(jìn)人工業(yè)社會(huì),工廠出現(xiàn)。斧子不再由普通人完成,而在工廠里被生產(chǎn)出來(lái),此時(shí)需要斧子的人(調(diào)用者)找到工廠,購(gòu)買斧子,無(wú)須關(guān)心斧子的制造過(guò)程。對(duì)應(yīng)Java程序的簡(jiǎn)單工廠的設(shè)計(jì)模式。進(jìn)人“按需分配”社會(huì),需要斧子的人不需要找到工廠,坐在家里發(fā)出一個(gè)簡(jiǎn)單指令:需要斧子)斧子就自然出現(xiàn)在他面前)對(duì)應(yīng)Springy的上一頁(yè)下一頁(yè)返回10.2Spring的控制反轉(zhuǎn)依賴注入。第一種情況下,Java實(shí)例的調(diào)用者創(chuàng)建被調(diào)用的Java實(shí)例,必然要求被調(diào)用的Java類出現(xiàn)在調(diào)用者的代碼里。無(wú)法實(shí)現(xiàn)二者之間的松耦合第二種情況下,調(diào)用者無(wú)須關(guān)心被調(diào)用者具體實(shí)現(xiàn)過(guò)程,只需要找到符合某種標(biāo)準(zhǔn)(接口)的實(shí)例,即可使用。此時(shí)調(diào)用的代碼面向接口編程,可以讓調(diào)用者和被調(diào)用者解耦,這也是工廠模式大量使用的原因。但調(diào)用者需要自己定位工廠,調(diào)用者與特定工廠耦合在一起。第三種情況下,調(diào)用者無(wú)須自己定位工廠,程序運(yùn)行到需要被調(diào)用者時(shí),系統(tǒng)自動(dòng)提供被調(diào)用者實(shí)例。事實(shí)上,調(diào)用者和被調(diào)用者都處于Spring的管理下,二者之間的依賴關(guān)系由Springy提供。上一頁(yè)下一頁(yè)返回10.2Spring的控制反轉(zhuǎn)所謂依賴注入,是指程序運(yùn)行過(guò)程中,如果需要調(diào)用另一個(gè)對(duì)象協(xié)助時(shí),無(wú)須在代碼中創(chuàng)建被調(diào)用者,而是依賴于外部的注入。Spring的依賴注入對(duì)調(diào)用者和被調(diào)用者兒乎沒(méi)有任何要求,完全支持對(duì)JavaBean*之間依賴關(guān)系的管理。上一頁(yè)下一頁(yè)返回10.2Spring的控制反轉(zhuǎn)10.2.2Spring中注入依賴的方法Spring中對(duì)象之間的依賴是由容器控制的,在程序運(yùn)行期間,容器會(huì)根據(jù)配置文件的內(nèi)容把對(duì)象之間的依賴關(guān)系注入組件中,從而實(shí)現(xiàn)對(duì)象之間的協(xié)同工作。在Spring中,注入對(duì)象之間依賴關(guān)系的方式有賦值注入和構(gòu)造器注入。1.賦值注入在JavaBean的規(guī)范中,可以使用屬性對(duì)應(yīng)的getter和setter方法來(lái)獲得和設(shè)置Bean的屬性值,這種方法在JavaBean中已經(jīng)被大量使用。同樣,在Spring中,每個(gè)對(duì)象在配置文件中都是以<bean>的形式出現(xiàn)的,而子元素<property>則指明廠使用JavaBean的setter方法來(lái)注入值。在<property>中可以定義要配置的屬性及要注入的值,可以給上一頁(yè)下一頁(yè)返回10.2Spring的控制反轉(zhuǎn)屬性注入任何類型的值,可以是基本的Java數(shù)據(jù)類型,也可以是其他的Bean對(duì)象。2.構(gòu)造器注入在使用賦值注入方式時(shí),可以通過(guò)<property>元素注入屬性的值。構(gòu)造器注入的方法與這基本類似,不同之處在于,使用構(gòu)造器注入的時(shí)候,是通過(guò)<bean>元素的子元素<constructer-arg>來(lái)制定實(shí)例化Bean的時(shí)候需要注入的參數(shù),同時(shí)在Bean中需要提供對(duì)應(yīng)的構(gòu)造器,而不是提供屬性的setter和getter方法上一頁(yè)下一頁(yè)返回10.2Spring的控制反轉(zhuǎn)10.2.3
案例二:使用賦值注入依賴存取學(xué)生信息【案例功能】存取學(xué)生信息。【案例目標(biāo)】掌握賦值注入對(duì)象之間依賴關(guān)系的方法。【案例要點(diǎn)】JavaBean對(duì)象屬性的注入、集合類型屬性的注入。【案例步驟】(1)在ch10目錄下編寫School.java作為Student類的一個(gè)成員屬性。【源碼】School.java上一頁(yè)下一頁(yè)返回10.2Spring的控制反轉(zhuǎn)上一頁(yè)下一頁(yè)返回10.2Spring的控制反轉(zhuǎn)(2)在ch10目錄下編寫JavaBean:Student.java。【源碼】Student.java上一頁(yè)下一頁(yè)返回10.2Spring的控制反轉(zhuǎn)上一頁(yè)下一頁(yè)返回10.2Spring的控制反轉(zhuǎn)上一頁(yè)下一頁(yè)返回10.2Spring的控制反轉(zhuǎn)(3)在src中編寫配置文件applicationContext.Xml。【源碼】applicationContext.Xml上一頁(yè)下一頁(yè)返回10.2Spring的控制反轉(zhuǎn)【代碼說(shuō)明】①第5-8行:對(duì)School這個(gè)Bean進(jìn)行屬性的注入,其中<bean>標(biāo)簽是Spring中用來(lái)描述JavaBean的標(biāo)簽,這個(gè)標(biāo)簽的id屬性指明了這個(gè)JavaBean的id,在其他的JavaBean中可以通過(guò)這個(gè)id訪問(wèn)這個(gè)JavaBean,class屬性指明le這個(gè)JavaBean對(duì)應(yīng)的具體的包路徑。②第12行:在Student這個(gè)JavaBean中,school屬性的類型是School類對(duì)象,所以在<property>標(biāo)簽中不能使用<value>標(biāo)簽注入屬性,需要使用<ref>標(biāo)簽來(lái)引用JavaBean。<ref>標(biāo)簽的bean屬性指明了要引用JavaBean的id,設(shè)置需要引用的是id為school的JavaBean,這個(gè)JavaBean是在配置文件中已經(jīng)成功配置的,可以直接引用。在需要上一頁(yè)下一頁(yè)返回10.2Spring的控制反轉(zhuǎn)調(diào)用Student這個(gè)JavaBean的時(shí)候,Spring會(huì)把school這個(gè)JavaBean注入Student中,從而實(shí)現(xiàn)對(duì)象之間依賴關(guān)系的注入。③第13-20行:在Student這個(gè)JavaBean中,courses屬性的類型是List,這就需要在<property>標(biāo)簽中使用<list>標(biāo)簽,指明這個(gè)屬性的類型是List的集合類型。<list>中的元素可以是<value>或者是<ref>,還可以是其他<list>,其中集合中的元素可以是基本類型或者是JavaBeano。Spring支持的集合類型有l(wèi)isl,map,set和props。(4)在ch10中編寫測(cè)試程序StudentTest.Java。【源碼】StudentTest.Java上一頁(yè)下一頁(yè)返回10.2Spring的控制反轉(zhuǎn)上一頁(yè)下一頁(yè)返回10.2Spring的控制反轉(zhuǎn)【代碼說(shuō)明】①第7-8行:把a(bǔ)pplicationContext.xml配置文件加載到內(nèi)存中。②第9行:從配置文件中讀取bean的配置信息。③第10行:從BeanFactory中取出Student類對(duì)象,從BeanFactory中獲取bean的時(shí)候,是根據(jù)配置文件的“id”獲取的,取出來(lái)的對(duì)象都是Object類型,需要通過(guò)強(qiáng)制類型轉(zhuǎn)化成需要的類型。(5)運(yùn)行測(cè)試程序結(jié)果如圖10-6所示。上一頁(yè)下一頁(yè)返回10.2Spring的控制反轉(zhuǎn)10.2.3
案例三:使用構(gòu)造器注入依賴存取學(xué)生信息【案例功能】存取學(xué)生信息。【案例目標(biāo)】掌握構(gòu)造器注入對(duì)象之間依賴關(guān)系的方法。【案例要點(diǎn)】使用<constructor-arg>標(biāo)簽進(jìn)行構(gòu)造器諸如以來(lái)。【案例步驟】
(1)在ch10目錄下編寫JavaBean:StudentC.java。【源碼】StudentC.java上一頁(yè)下一頁(yè)返回10.2Spring的控制反轉(zhuǎn)上一頁(yè)下一頁(yè)返回10.2Spring的控制反轉(zhuǎn)(2)在src中編寫配置文件applicationContext.xml。【源碼】applicationContext.xml上一頁(yè)下一頁(yè)返回10.2Spring的控制反轉(zhuǎn)上一頁(yè)下一頁(yè)返回10.2Spring的控制反轉(zhuǎn)【代碼說(shuō)明】第7-23行:通過(guò)構(gòu)造器注入依賴與賦值方法注入依賴非常類似,不同之處在于通過(guò)構(gòu)造器注入依賴的時(shí)候需要使用<constructor-arg>標(biāo)簽而不是<property>標(biāo)簽,當(dāng)構(gòu)造器有多個(gè)參數(shù)的時(shí)候,需要在<constructor-arg>中用index屬性表明參數(shù)的順序,index的起始值是0,Spring會(huì)根據(jù)index的值把對(duì)應(yīng)的值傳遞給對(duì)應(yīng)的參數(shù)。測(cè)試程序與案例二類似,不再贅述。上一頁(yè)下一頁(yè)返回10.2Spring的控制反轉(zhuǎn)10.2.4
兩種注入方式的對(duì)比1.賦值注入的優(yōu)點(diǎn)如下①與傳統(tǒng)的JavaBean的寫法更相似,程序員更容易理解、接受,通過(guò)setter方式設(shè)定依賴關(guān)系顯得更加直觀、明顯。②對(duì)于復(fù)雜的依賴關(guān)系,如果采用構(gòu)造注入,會(huì)導(dǎo)致構(gòu)造器過(guò)于臃腫,難以閱讀。Spring在創(chuàng)建Bean實(shí)例時(shí),需要同時(shí)實(shí)例化其依賴的全部實(shí)例,因而導(dǎo)致系統(tǒng)性能下降。而可以使用賦值注入,則可以避免這些問(wèn)題。③尤其在某些屬性可選的情況下,多參數(shù)的構(gòu)造器更加笨拙。上一頁(yè)下一頁(yè)返回10.2Spring的控制反轉(zhuǎn)2.構(gòu)造注入的優(yōu)點(diǎn)如下①構(gòu)造注入可以再構(gòu)造器中決定依賴關(guān)系的注入順序,優(yōu)先依賴的優(yōu)先注入。②對(duì)于依賴關(guān)系無(wú)須變化的Bean,構(gòu)造注入更有用處;因?yàn)闆](méi)有setter方法,所有的依賴關(guān)系全部在構(gòu)造器內(nèi)設(shè)定,因此,不用擔(dān)心后續(xù)代碼對(duì)依賴關(guān)系的破壞。③依賴關(guān)系只能在構(gòu)造器中設(shè)定,則只有組件的創(chuàng)建者才能改變組件的依賴關(guān)系。對(duì)組件的調(diào)用者而言,組件內(nèi)部的依賴關(guān)系完全透明,更符合高內(nèi)聚的原則。上一頁(yè)返回10.3
在Spring中實(shí)現(xiàn)MVC10.3.1Spring中MVC的實(shí)現(xiàn)原理在SpringMVC中,通過(guò)DispatcherServlet接收用戶的請(qǐng)求,接收到用戶的請(qǐng)求后,就會(huì)在配置文件中查詢HandlerMapping,HandlerMapping負(fù)責(zé)把URL映射到控制器中,當(dāng)DispatcherServlet在HandlerMapping中查詢到控制器對(duì)象之后,就會(huì)把這個(gè)用戶請(qǐng)求分派給這個(gè)控制器,控制器根據(jù)用戶的請(qǐng)求執(zhí)行不同的業(yè)務(wù)邏輯。當(dāng)控制器完成業(yè)務(wù)邏輯以后,會(huì)返回一個(gè)ModelAndView對(duì)象,然后有DispatcherServlet把這個(gè)返回的ModelAndView對(duì)象分派給ViewResolver對(duì)象,ViewResolver對(duì)象負(fù)責(zé)解析ModelAndView對(duì)象,把解析的視圖結(jié)果返回給用戶。到這里為止,Spring完成了一次用戶的請(qǐng)求。Spring中MVC的實(shí)現(xiàn)原理如圖10-7所示。下一頁(yè)返回10.3
在Spring中實(shí)現(xiàn)MVC簡(jiǎn)單地說(shuō),在SpringMVC中,處理用戶請(qǐng)求的基本流程如下。(1)編寫請(qǐng)求的控制器。(2)在DispathcerServlet的上下文配置文件中把用戶請(qǐng)求映射到控制器中。(3)通過(guò)視圖解析器解析控制器返回的視圖對(duì)象,從而把結(jié)果展示給用戶。上一頁(yè)下一頁(yè)返回10.3
在Spring中實(shí)現(xiàn)MVC10.3.2
案例四:在Spring中實(shí)現(xiàn)簡(jiǎn)單MVC【案例功能】實(shí)現(xiàn)頁(yè)面信息輸出。【案例目標(biāo)】掌握在Spring樞架下實(shí)現(xiàn)MVC的流程。【案例要點(diǎn)】使用DispatcherServlet配置文件把用戶請(qǐng)求映射到控制器,并配置視圖解析器把結(jié)果展示給用戶。【案例步驟】(1)在web.xml中配置DispatcherServlet。
【源碼】web.xml上一頁(yè)下一頁(yè)返回10.3
在Spring中實(shí)現(xiàn)MVC上一頁(yè)下一頁(yè)返回10.3
在Spring中實(shí)現(xiàn)MVC【代碼說(shuō)明】第2-12行:配置了一個(gè)名為SpringMVC的DispatcherServlet,并且把所有*.do后綴的請(qǐng)求都映射到這個(gè)Servlet中(用戶可以選擇任何后綴)。這樣當(dāng)URL是后綴名為*.do的請(qǐng)求時(shí),就會(huì)通過(guò)一個(gè)名為“springMVC-servlet.Xml”(在Spring中,這個(gè)配置文件的默認(rèn)名稱就是“DispatcherServlet的名稱-servlet.Xml”,需要在WEB-INF目錄中創(chuàng)建)的配置文件將客戶請(qǐng)求映射到控制器。(2)在ch10目錄下編寫請(qǐng)求控制器IndexController.Java。【源碼】IndexController.Java上一頁(yè)下一頁(yè)返回10.3
在Spring中實(shí)現(xiàn)MVC上一頁(yè)下一頁(yè)返回10.3
在Spring中實(shí)現(xiàn)MVC
【代碼說(shuō)明】第17-21行:在上面這個(gè)控制器中,接收用戶的請(qǐng)求,然后返回一個(gè)ModelAndView對(duì)象,在Spring中ModelAndView對(duì)象保存了視圖的相關(guān)信息,通過(guò)合適的視圖解析器就可以從中取出結(jié)果,然后展示給用戶。在這個(gè)控制器中,返回廠一個(gè)名稱為index的ModelAndView對(duì)象,在這個(gè)對(duì)象中有一個(gè)名為output的屬性,這個(gè)屬性的值就是message屬性的值。(3)在WEB一INF中創(chuàng)建配置文件SpringMVC-servlet.Xml。上一頁(yè)下一頁(yè)返回10.3
在Spring中實(shí)現(xiàn)MVC上一頁(yè)下一頁(yè)返回10.3
在Spring中實(shí)現(xiàn)MVC【代碼說(shuō)明】①第6-10行:這個(gè)bean配置把“/index.do”這個(gè)URL映射到IndexController控制器中,其中<property>標(biāo)簽指定待注入的屬性message,<value>標(biāo)簽指定注入message的值為HelloSpringMVC字符串。②第11-19行:在前面的IndexController控制器的代碼中可以看到,這個(gè)控制器會(huì)把處理的結(jié)果用ModelAndView對(duì)象的形式返回,這樣的對(duì)象當(dāng)然不可能直接顯示在頁(yè)面提供給用戶,只有通過(guò)特殊的視圖解析器,從這個(gè)ModelAndView對(duì)象中提取出相關(guān)信息,然后再把這些信息展示給用戶。id為“viewResolver”的bean就是一個(gè)視圖解析器,本例中的這個(gè)org.springframework.web.servlet.view.上一頁(yè)下一頁(yè)返回10.3
在Spring中實(shí)現(xiàn)MVCInternalResourceViewResolver視圖解析器是最簡(jiǎn)單的一種。當(dāng)InternalResourceViewResolver被請(qǐng)求解析一個(gè)視圖的時(shí)候,會(huì)在得到的視圖名稱前面添加前綴“/”(表示項(xiàng)目根目錄)和后綴“.Jsp”。因此需要在相應(yīng)目錄下準(zhǔn)備對(duì)應(yīng)的jsp模板文件,InternalResourceViewResolver會(huì)把解析出來(lái)的信息填充到這個(gè)jsp模板中,本例通過(guò)IndexController控制器傳遞oulpul屬性到/index.jsp模板文件中。(4)在WebRoot中創(chuàng)建index.jsp模板文件。上一頁(yè)下一頁(yè)返回10.3
在Spring中實(shí)現(xiàn)MVC上一頁(yè)下一頁(yè)返回10.3
在Spring中實(shí)現(xiàn)MVC【代碼說(shuō)明】第10行:output屬性是在IndexControlle:中返回的ModelAndView對(duì)象中對(duì)應(yīng)的屬性,視圖解析器會(huì)把ModelAndView中這個(gè)屬性的值取出,填充到這個(gè)jsp模板中,從而可以把這個(gè)處理結(jié)果顯示給用戶。(5)部署并啟動(dòng)Tomcat服務(wù)器后,在瀏覽器地址欄輸人http://localhost:8080/JSPClass/index.do,運(yùn)行結(jié)果如圖10-8所示。上一頁(yè)返回10.4Spring中的數(shù)據(jù)庫(kù)操作10.4.1
在Spring中配置數(shù)據(jù)源在對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作的時(shí)候,首先需要取得一個(gè)Connection對(duì)象,即需要首先取得與數(shù)據(jù)庫(kù)的鏈接。在Spring中,是從DataSource中獲得Connection對(duì)象的,通過(guò)下面的配置文件就完成了對(duì)數(shù)據(jù)源DataSource的配置。[源碼】WEB一INF/applicationContext.xml
返回下一頁(yè)10.4Spring中的數(shù)據(jù)庫(kù)操作上一頁(yè)下一頁(yè)返回10.4Spring中的數(shù)據(jù)庫(kù)操作上一頁(yè)下一頁(yè)返回10.4Spring中的數(shù)據(jù)庫(kù)操作在上面這個(gè)配置文件中,配置了一個(gè)1id為“dataSource”的數(shù)據(jù)源,在這里使用的是Spring自身提供的DriverManagcrDataSource來(lái)創(chuàng)建一個(gè)新的DataSource,其他的配置信息和一般的數(shù)據(jù)源配置并沒(méi)有什么區(qū)別。當(dāng)Spring加載這個(gè)配置文件之后就能創(chuàng)建一個(gè)新的DataSource。上一頁(yè)下一頁(yè)返回10.4Spring中的數(shù)據(jù)庫(kù)操作10.4.2
使用JdbcTemplate進(jìn)行數(shù)據(jù)庫(kù)的CRUD操作雖然Spring可以很好地和其他ORM工具整合(如Hibernate,EntityEJB,iBATIS等),但是普通的JDBC操作還是大部分開(kāi)發(fā)人員的首選,所以在Spring中提供了很好的JDBC支持,Spring中的JDBC樞架承擔(dān)了資源管理和錯(cuò)誤處理的任務(wù),從而是數(shù)據(jù)庫(kù)操作的代碼費(fèi)城簡(jiǎn)介。Spring的這些功能可以用JdbcTemplate類來(lái)完成,可以用下面的代碼創(chuàng)建JdbcTemplate對(duì)象。上一頁(yè)下一頁(yè)返回10.4Spring中的數(shù)據(jù)庫(kù)操作【代碼說(shuō)明】第1-4行:獲取默認(rèn)路徑(/WEB-INF/applicationContext.xml)下的配置文件applicationContext.xml,根據(jù)配置文件中的id為dbTest的bean標(biāo)簽,獲得在配置文件中注入的DataSource實(shí)例,進(jìn)而創(chuàng)建所需的JdbcTemplate對(duì)象。創(chuàng)建好JdbcTemplate對(duì)象后就可以調(diào)用其中的方法對(duì)數(shù)據(jù)庫(kù)進(jìn)行CRUD(Create,Retrieve,Update,Delete,即對(duì)數(shù)據(jù)庫(kù)的增、刪、改、查)操作了。在設(shè)計(jì)中,一般都將對(duì)數(shù)據(jù)庫(kù)的CRUD操作封裝在DAO(DataAccessObject)對(duì)象中。下面的代碼是使用JdbcTemplate對(duì)象向ClassDB數(shù)據(jù)庫(kù)中的courses表插入數(shù)據(jù)。上一頁(yè)下一頁(yè)返回10.4Spring中的數(shù)據(jù)庫(kù)操作上一頁(yè)下一頁(yè)返回10.4Spring中的數(shù)據(jù)庫(kù)操作下面的代碼是使用JdbeTemplate對(duì)象刪除ClassDB數(shù)據(jù)庫(kù)中的courses表中指定數(shù)據(jù)。上一頁(yè)下一頁(yè)返回10.4Spring中的數(shù)據(jù)庫(kù)操作下面的代碼是使用JdbeTemplate對(duì)象修改ClassDB數(shù)據(jù)庫(kù)中的courses表中指定數(shù)據(jù)。上一頁(yè)下一頁(yè)返回10.4Spring中的數(shù)據(jù)庫(kù)操作下面的代碼是使用JdbeTemplate對(duì)象羅列出ClassDB數(shù)據(jù)庫(kù)中的courses表所有數(shù)據(jù)。上一頁(yè)下一頁(yè)返回10.4Spring中的數(shù)據(jù)庫(kù)操作上一頁(yè)下一頁(yè)返回10.4Spring中的數(shù)據(jù)庫(kù)操作【代碼說(shuō)明】第7-16行:實(shí)現(xiàn)了一個(gè)RowCallbackHandler接口的匿名類,被實(shí)現(xiàn)的processRow方法,可以將“select*fromcourses”語(yǔ)句查詢出的每條數(shù)據(jù)庫(kù)記錄轉(zhuǎn)化為具體的JavaBean對(duì)象courseInfo,并添加到List對(duì)象中。下面的代碼是使用JdbeTemplate對(duì)象按課程代碼查出ClassDB數(shù)據(jù)庫(kù)中的courses表內(nèi)數(shù)據(jù)。上一頁(yè)下一頁(yè)返回10.4Spring中的數(shù)據(jù)庫(kù)操作上一頁(yè)下一頁(yè)返回10.4Spring中的數(shù)據(jù)庫(kù)操作下面的代碼是使用JdbeTemplate對(duì)象按課程名稱查出ClassDB數(shù)據(jù)庫(kù)中的courses表內(nèi)數(shù)據(jù)。上一頁(yè)下一頁(yè)返回10.4Spring中的數(shù)據(jù)庫(kù)操作上一頁(yè)下一頁(yè)返回10.4Spring中的數(shù)據(jù)庫(kù)操作10.4.3
案例五:應(yīng)用Spring查看課程信息【案例功能】羅列出課績(jī)管理系統(tǒng)中所有的課程信息。【案例目標(biāo)】掌握在Spring樞架使用JdbcTemplate對(duì)象進(jìn)行數(shù)據(jù)庫(kù)的訪問(wèn)。【案例要點(diǎn)】在配置文件中編寫數(shù)據(jù)庫(kù)連接代碼,DAO類的編寫。【案例步驟】(1)在web.xml中添加listener標(biāo)簽。【源碼】web.xml上一頁(yè)下一頁(yè)返回10.4Spring中的數(shù)據(jù)庫(kù)操作上一頁(yè)下一頁(yè)返回10.4Spring中的數(shù)據(jù)庫(kù)操作【代碼說(shuō)明】第4行:ContextLoaderListener預(yù)設(shè)會(huì)讀取默認(rèn)路徑下的applicationContext.xml配置文件/WEB一INF/applicationContext.Xml(2)編寫配置文件/WEB一INF/applicationContext.Xml,參考9.4.2節(jié)。(3)編寫配置文件SpringMVC-servlet.xml配置文件。[源碼】WEB一INF/springMVC-servlet.xml上一頁(yè)下一頁(yè)返回10.4Spring中的數(shù)據(jù)庫(kù)操作上一頁(yè)下一頁(yè)返回10.4Spring中的數(shù)據(jù)庫(kù)操作上一頁(yè)下一頁(yè)返回10.4Spring中的數(shù)據(jù)庫(kù)操作【代碼說(shuō)明】①第13行:id為urlMapping的bean是一個(gè)SimpleUrlHandlerMapping映射處理器。在這個(gè)bean的mappings屬性中,提供了URL映射的列表。即將把“/listAllCourscs.do”這個(gè)用戶請(qǐng)求映射到lislAllCourses控制器中。②第23-31行:定義id為listAllCourses的控制器bean,將其中的a1lCoursesview屬性注入值listAllCourses,引用的courseinfoService類在第5-10行定義。(4)在ch09.web中編寫控制器代碼ListAllCoursesAction.Java。
【源碼】ListAllCoursesAction.Java上一頁(yè)下一頁(yè)返回10.4Spring中的數(shù)據(jù)庫(kù)操作上一頁(yè)下一頁(yè)返回10.4Spring中的數(shù)據(jù)庫(kù)操作上一頁(yè)下一頁(yè)返回10.4Spring中的數(shù)據(jù)庫(kù)操作【代碼說(shuō)明】①第37行:調(diào)用CourseInfoService接口的對(duì)象CourseInfoService中的listAllCourseInfo(request)方法將從數(shù)據(jù)庫(kù)中查詢出的課程信息封裝在courseInfo對(duì)象中并付給list。②第39-40行:將list對(duì)象賦予鍵值allCourses存入map對(duì)象中,并作為參數(shù)通過(guò)返回的ModelAndView對(duì)象傳遞給allCoursesview屬性所制定的頁(yè)面,allCourses_view屬性已在配置文件springMVC-servlet.xml中注入了值lis
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學(xué)數(shù)學(xué)五年級(jí)下冊(cè)同分母分?jǐn)?shù)加、減法知識(shí)清單
- 七年級(jí)下冊(cè)語(yǔ)文《駱駝祥子》名著導(dǎo)讀整本書(shū)閱讀能力檢測(cè)教學(xué)設(shè)計(jì)
- 初中物理八年級(jí)《力與運(yùn)動(dòng)的關(guān)系:基于牛頓第一定律的深度應(yīng)用》教案
- 小學(xué)三年級(jí)數(shù)學(xué)第四單元《兩位數(shù)乘兩位數(shù)》整體教學(xué)設(shè)計(jì)
- 小學(xué)數(shù)學(xué)三年級(jí)跨學(xué)科項(xiàng)目化導(dǎo)學(xué)案:《游園策展人-最優(yōu)資源配置方案設(shè)計(jì)》
- 初中英語(yǔ)八年級(jí)上冊(cè)Unit8SectionA(1a1dPronunciation)教學(xué)設(shè)計(jì)
- 小學(xué)六年級(jí)數(shù)學(xué)《分?jǐn)?shù)四則混合運(yùn)算精講與寒假特訓(xùn)》教學(xué)設(shè)計(jì)
- 2026年全面質(zhì)量管理企業(yè)員工競(jìng)賽知識(shí)題庫(kù)附帶答案
- 2026年石家莊交通運(yùn)輸學(xué)校招聘考試筆試試題(含答案)
- 八年級(jí)生物第一單元血液循環(huán)材料題專項(xiàng)練習(xí)卷真題遷移版
- 出納常用表格模板格大全
- 老年失能全周期綜合康復(fù)管理模式專家共識(shí)
- 蘇教版四年級(jí)上冊(cè)數(shù)學(xué)第四單元《統(tǒng)計(jì)表和條形統(tǒng)計(jì)圖(一)》測(cè)試卷(含答案解析)
- JJG 949-2011經(jīng)緯儀檢定裝置檢定規(guī)程
- 市技能大師工作室建設(shè)方案
- 《電力電容器》課件
- 辦公設(shè)備資產(chǎn)評(píng)估報(bào)告
- 檔案密集架采購(gòu)?fù)稑?biāo)方案(技術(shù)標(biāo))
- 鐵總建設(shè)201857號(hào) 中國(guó)鐵路總公司 關(guān)于做好高速鐵路開(kāi)通達(dá)標(biāo)評(píng)定工作的通知
- 七年級(jí)72班家長(zhǎng)會(huì)課件
- 某發(fā)電廠工程可行性研究報(bào)告
評(píng)論
0/150
提交評(píng)論