Struts210+Spring25+Hibernate32框架說課講解_第1頁
Struts210+Spring25+Hibernate32框架說課講解_第2頁
Struts210+Spring25+Hibernate32框架說課講解_第3頁
Struts210+Spring25+Hibernate32框架說課講解_第4頁
Struts210+Spring25+Hibernate32框架說課講解_第5頁
已閱讀5頁,還剩100頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、Good is good, but better carries it.精益求精,善益求善。Struts210+Spring25+Hibernate32框架Struts2.0+Spring2.5+Hibernate3.2框架1.系統(tǒng)架構(gòu):采用J2EE的三層結(jié)構(gòu),分為表現(xiàn)層、業(yè)務(wù)邏輯層和數(shù)據(jù)服務(wù)層。三層體系將業(yè)務(wù)規(guī)則、數(shù)據(jù)訪問等工作放到中間層處理,客戶不直接與數(shù)據(jù)庫交互,而是通過控制器與中間層建立連接,再由中間層與數(shù)據(jù)庫交互。中間層采用Spring+Hibernate,為了分離控制器與業(yè)務(wù)層,又可細分為:控制器層,負責表現(xiàn)層與業(yè)務(wù)邏輯層的交互,調(diào)用業(yè)務(wù)邏輯層,并將業(yè)務(wù)數(shù)據(jù)返回給表現(xiàn)層作顯示。MV

2、C框架采用流行的struts2Service層(業(yè)務(wù)邏輯層),負責實現(xiàn)業(yè)務(wù),對DAO對象進行正面模式的封裝DAO(數(shù)據(jù)訪問層),負責與持久化對象交互,封裝了數(shù)據(jù)的增、刪、查、改原子操作PO層(持久化對象層),通過實體/關(guān)系的映射工具,將關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)映射成對象,實現(xiàn)以面向?qū)ο蠓绞讲僮鲾?shù)據(jù)庫,這個系統(tǒng)采用Hibernate作為O/RMapping框架。中間層是這個系統(tǒng)的關(guān)鍵所在,而Spring的作用貫穿了整個中間層,將web層、Service層、DAO、PO無縫整合。用戶界面業(yè)務(wù)數(shù)據(jù)組織和表示MVC架構(gòu)模式的控制層控制業(yè)務(wù)邏輯層與表現(xiàn)層的交互業(yè)務(wù)邏輯的實現(xiàn)層數(shù)據(jù)訪問對象與持久化對象交互通過實

3、體-關(guān)系映射O-RMapping由數(shù)據(jù)庫表得來對象存放數(shù)據(jù)視圖層Web層Service層DAO層持久化對象數(shù)據(jù)服務(wù)層Struts2Spring2.5+Hibernate3.2系統(tǒng)架構(gòu)圖中間層MVC框架Web瀏覽器JSP頁面Struts的核心控制器業(yè)務(wù)控制器ActionActionManager后臺服務(wù)系統(tǒng)業(yè)務(wù)流程圖應(yīng)用程序的分層,多數(shù)web應(yīng)用程序都能至少分為4個各負其責層次,這些層次依次為:表現(xiàn)層、業(yè)務(wù)層、領(lǐng)域模型層、持久層,每個層次在應(yīng)用程序中都有明確的責任,不應(yīng)該和其它層次的職責發(fā)生混淆。每個層次功能是彼此獨立的,但是都應(yīng)提供通訊接口,以便其它層次使用本層次的功能。Struts負責的:為

4、用戶管理請求和響應(yīng);提供一個控制器代理調(diào)用業(yè)務(wù)邏輯和其它上層處理;處理從其它層擲出給一個StrutsAction的異常;為顯示提供一個模型;執(zhí)行用戶接口驗證。業(yè)務(wù)層在一個典型的web應(yīng)用程序的中間的組件是業(yè)務(wù)層或服務(wù)層。從編碼的視角來看,這個服務(wù)層是最容易被忽視的一層。不難在用戶接口層或者持久層里找到散布在其中的這種類型的代碼。這不是正確的地方,因為這導(dǎo)致了應(yīng)用程序的緊耦合,這樣一來,隨著時間推移代碼將很難維護。在這個領(lǐng)域兩個最流行的框架是HYPERLINK/z/spring/index.htmlt_blankSpring和PicoContainer,它們叫作微容器,可以不費力不費神的把你的對

5、象連在一起。所有這些框架都工作在一個簡單的叫作“依賴注入”(也通稱“控制反轉(zhuǎn)”)的概念上。業(yè)務(wù)層應(yīng)該負責下面這些事情:處理應(yīng)用程序的業(yè)務(wù)邏輯和業(yè)務(wù)驗證;管理事務(wù);預(yù)留和其它層交互的接口;管理業(yè)務(wù)層對象之間的依賴;增加在表現(xiàn)層和持久層之間的靈活性,使它們互不直接通訊;從表現(xiàn)層中提供一個上下文給業(yè)務(wù)層獲得業(yè)務(wù)服務(wù);管理從業(yè)務(wù)邏輯到持久層的實現(xiàn)。領(lǐng)域模型層基于web的應(yīng)用程序,需要一組能在不同的層之間移動的對象。領(lǐng)域?qū)ο髮佑赡切┐憩F(xiàn)實世界中的業(yè)務(wù)對象的對象們組成。這個層讓開發(fā)者停止建立和維護不必要的數(shù)據(jù)傳輸對象(或者叫作DTOs),來匹配他們的領(lǐng)域?qū)ο?。例如,Hibernate允許你把數(shù)據(jù)庫信息讀

6、進領(lǐng)域?qū)ο蟮囊粋€對象圖,這樣可以在連接斷開的情況下把這些數(shù)據(jù)顯示到UI層。那些對象也能被更新和送回到持久層并在數(shù)據(jù)庫里更新。而且,不必把對象轉(zhuǎn)化成DTOs,因為DTOs在不同的應(yīng)用層間移動,可能在轉(zhuǎn)換中丟失。這個模型使得Java開發(fā)者自然地以一種面向?qū)ο蟮娘L格和對象打交道,沒有附加的編碼。持久層在典型web應(yīng)用的另一端是持久層。查詢相關(guān)的信息成為對象。保存、更新、刪除儲存在數(shù)據(jù)庫中的信息。其中模型層、持久化層、數(shù)據(jù)庫層之間的關(guān)系是上層依賴下層,而下層對上一層依賴很少。模型層實際上又分為數(shù)據(jù)訪問層(DAO)和數(shù)據(jù)管理層(Manager)。系統(tǒng)使用Hibernate來實現(xiàn)持久化層,在這一層使用DA

7、O模式。DAO模式是J2EE核心模式中的一種,其主要行為就是在業(yè)務(wù)核心方法和具體數(shù)據(jù)源之間在再加一層,用這一層來連接業(yè)務(wù)方法和數(shù)據(jù)源,從而實現(xiàn)解耦,使得系統(tǒng)非常容易在各個數(shù)據(jù)庫之間移植。在DAO模式種,每一個持久化類都對應(yīng)一個DAO,而一個DAO包括接口和實現(xiàn)。接口說明持久化類的操作方法,如CRUD操作,在接口的實現(xiàn)中則是具體使用hibernateAPI來實現(xiàn)接口。對與上層來說,只需要調(diào)用接口中的方法即可。DAO模式一般和工廠方法聯(lián)合使用的。通過一個工廠方法來產(chǎn)生所有DAO接口。DAO是DataAccessObject數(shù)據(jù)訪問接口,位于業(yè)務(wù)層和數(shù)據(jù)層之間。DAO的主要功能:(1)DAO用來封裝

8、DataSource的,比如Connectionconn=DAOFactory.createConnection().這樣就可以把Drive.URL.username,password這一些放在DAO中。以后要改變數(shù)據(jù)庫的類型,比如把MSSQL換為Oracle的話,只需更該DAOFactory里面的getConnection()的Driver.URL就行。(2)DAO也是把對數(shù)據(jù)庫的操作(比如最為基本的CRUD操作)全部封裝在里面。要插入一個新的用戶,那么在DAO中只需提供一個insertUser(Useruser)這個方法就可以了。具體操作在DAO中實現(xiàn)。一般DAO是與AbstrFactor

9、y模式一起使用的。Factory用來建立數(shù)據(jù)庫和定位具體的DAO(比如是UserDao還是CustomerDao)。一般將getConnection設(shè)置為static,也可以把HibernateSessionFactory這個公共類放在AbstractFactory類中去。PublicclassDAOFactoryPrivatestaticfinalSessionFactorysessionFactory;StaticSessioncurrentSession()PublicUserDaogetUserDAO()ReturnnewUserDaoImpl(session);Publicother

10、DaogetOtherDAO()PublicinterfaceUserDaoPublicinsertUser(FormBean);PublicupdateUser(FormBean);/然后實現(xiàn)DAO接口PublicclassUserDaoImplimplementsUserDaoPrivateSessionsession;PublicUserDaoImpl(Sessionsession)This.session=session;PublicinsertUser(FormBean)/Session.save(UserPO);/ReturnFormBean;PublicFormBeanupdat

11、eUser(FormBean)/Session.update(UserPO);/ReturnFormBean;最后定義POPublicclassuserPOStringfirstname,lastname,password開發(fā)工具:myeclipse6.5Web服務(wù)器:Tomcat6.0數(shù)據(jù)庫服務(wù)器SQLServer20002Struts2.0框架Struts2框架可以分為3個部分,即核心控制器FilterDispatcher、業(yè)務(wù)控制器action和用戶實現(xiàn)的企業(yè)業(yè)務(wù)邏輯組件。核心控制器FilterDispatcher是struts2框架的基礎(chǔ),包含框架內(nèi)部的控制流程和處理機制。業(yè)務(wù)控制器a

12、ction和企業(yè)業(yè)務(wù)邏輯組件是要用戶自己實現(xiàn)的。業(yè)務(wù)邏輯控制器action的execute()返回一個String類型的值,Struts2提供一個ActionSupport工具類,該類實現(xiàn)了action接口和validate()方法,一般開發(fā)人員編寫action可以直接繼承ActionSupport類。編寫Action類之后,還要在xml文件中配置action,一個action包括一下幾個方面:該action的name,即用戶請求所指向的URLAction所對應(yīng)的class名稱,對應(yīng)于action類的位置指定result邏輯名稱和實際資源的定位注意:Action中,不實現(xiàn)任何的業(yè)務(wù)邏輯,只是負

13、責組織調(diào)度業(yè)務(wù)邏輯組件。Struts2框架是基于MVC模式開發(fā)的,提供一個核心的控制器,用于對所有的請求進行統(tǒng)一的處理。這個控制器的名字就是FilterDispatcher的servlet過濾器來充當。需要在web.xml文件中配置FilterDispatcher,制定要映射到FilterDispatcher的URL樣式,匹配這個URL請求,都將被web容器交由FilterDispatcher進行處理。Struts2使用action代理,Action代理可以根據(jù)系統(tǒng)配置,加載一系列攔截器,由攔截器將HttpServletRequest參數(shù)解析出來,再傳入action。同樣action處理結(jié)果也

14、通過攔截器傳入HttpServletResponse,然后由HttpServletRequest傳給用戶,這個過程就是典型的AOP。Action就是一段只有特定的URL被請求時才會執(zhí)行的代碼。當一個action創(chuàng)建完成之后,需要為其配置一個URL,只有這樣FilterDispatcher才知道是哪個URL對應(yīng)哪個action,當截獲訪問該URL的請求時,F(xiàn)ilterDispatcher就知道調(diào)用對應(yīng)的action對請求進行處理。FilterDispatcher根據(jù)請求URL不同,來執(zhí)行不同的action,action執(zhí)行的結(jié)果通常都對應(yīng)一個要呈現(xiàn)給用戶的result,這個result就是HTM

15、L頁面,也可以是一個PDF或是Excel電子表,action與其對應(yīng)的result是在struts.xml的配置文件中進行配置的。業(yè)務(wù)控制器Action,是由用戶自己開發(fā)的,Action類實際就是一個簡單的Java類,與ServletAPI完全分離。Action方法一般都有一個execute()方法,同時也可以定義其他的業(yè)務(wù)控制,execute()方法返回一個String類型的值。Struts2提供一個ActionSupport工具類,該類實現(xiàn)Action接口和Validate()方法。一般開發(fā)人員編寫action類時,可以直接繼承ActionSupport類。編寫完Action類之后,必須在

16、配置文件中培植action,一個action的配置應(yīng)該包含以下幾個方面:該action的name,即用戶請求所指向的URLaction所對應(yīng)的class元素,對應(yīng)action類的位置。指定result邏輯名稱和實際的資源的定位。Action是業(yè)務(wù)控制器,因此應(yīng)避免將業(yè)務(wù)邏輯處理放在其中,減少action與業(yè)務(wù)邏輯模塊的耦合程度。業(yè)務(wù)模型組件,實現(xiàn)業(yè)務(wù)邏輯的模塊,可以是EJB、POJO、或者Javabean。Struts2框架的目的就是使用action來調(diào)用業(yè)務(wù)邏輯模塊。21Struts2配置文件Struts2核心的配置文件是缺省的struts.xml,這個文件也是struts2框架主動加載的文

17、件,在這個文件中可以定義自己的一些action、interceptor、package等。Package通常繼承struts-default包。struts文件可以放入jar中,并自動插入應(yīng)用程序,這樣每個模塊可以包含自己的配置文件并自動配置。Struts2框架一般包含兩個配置文件,struts2.xml和perties文件。前者定義了包、包的名稱、action、攔截器、和攔截器棧等信息,主要用于struts2框架的action映射。后者是一個屬性定義文件,定義struts2框架中的大量屬性值、常量,開發(fā)者一般可以修改這個文件。Struts2配置文件是整個框架的聯(lián)系的紐帶,是配置文件將stru

18、ts2的核心控制器FilterDispatcher、業(yè)務(wù)控制器action、視圖組件等聯(lián)系在一起。配置文件的分類:(1)管理元素bean配置常量配置包配置命名空間配置包含配置(2)用戶請求處理元素攔截器配置action配置result配置(3)錯誤處理異常錯誤包配置,配置包的時候必須要指定包的name屬性,這個屬性就是應(yīng)用該包的key,同時還要指定包的,該屬性為可選,extends屬性必須是另一個包的name屬性。指定extends屬性說明該包繼承了其它包,同時繼承其它包中的action、攔截器和攔截器棧等配置。ShowRenyuanAction.action/jsp/error.jsp/js

19、p/renyuanShow.jsp/jsp/error.jsp/jsp/renyuanUpdt.jspShowRenyuanActionShowRenyuanAction.action/jsp/error.jspStruts.xml配置元素說明:(1)PackagesPackages:packages把actions、results、resultstypes、interceptors和interceptor-stacks組裝到一個邏輯單元中,從概念上講,packages就像一個對象,可以被其它子包從寫,而且可以擁有自己獨立的部分。Name屬性是packages的必填元素,它作為一個關(guān)鍵字被后邊

20、的包引用;extends元素是可選的,它允許包擴展一個和多個前邊定義的包。注意,struts.xml文件是至上而下處理的,所有被擴展的包,需要在擴展包前定義。Abstract元素是可選的,它可以申明一個不包含actions的配置文件。(2)NamespaceNamespace元素把actions細分到邏輯模塊,每一個namespace都有自己的前綴(prefix),namespace避免了action之間的名字沖突,當前綴出現(xiàn)在URI中時,這些標簽都是名字空間感知的(“namespaceaware”),所以這些namespaceprefix不必嵌入到表單或連接中。Default的namespa

21、ce是一個空字符串“”,如果在指定的配置文件中,沒有找到action,缺省的namespace也會被查找。Local/global策略允許應(yīng)用程序在action“extends”元素層次結(jié)構(gòu)之外,有全局的action配置。缺省的namespace也可以不在package中申明。Namespaceprefix可以注冊為java的申明式HYPERLINK/o安全t_blank安全,以確保授權(quán)的用戶才能訪問namespace的資源。Rootnamespace(“/”)也被支持,root就是當直接請求contextpath的時候的namespace。Namespace:可選屬性,該屬性定義該包的命名空

22、間,指定用戶請求的URL目錄路徑,實際上也就是action的包名字。指定了命名空間后,用戶請求訪問該包下所有action時,URL應(yīng)該是命名空間(namespace)+action.Struts2尋找一個action的搜索順序是:查找指定的命名空間下的action如果找不到,則轉(zhuǎn)入默認命名空間中查找action如果找不到,則報錯(3)IncludeInclude元素使得框架能應(yīng)用“divideandconquer”來配置文件。被include的每個配置文件必須和struts.xml有一樣的格式,一個大的項目可以采用這樣方式來組織程序模塊。Include元素也可以和package交替出現(xiàn),框架將

23、按照順序加載配置文件。(4)InterceptorconfigurationInterceptor允許應(yīng)用程序在Action方法執(zhí)行前后定義執(zhí)行代碼,Interceptor在應(yīng)用程序開發(fā)中十分重要,對于Interceptor有許多用例,如validation,propertypopulation,security,logging,和profiling。Interceptor被定義為一個Java類,Interceptor也可以組裝成Interceptor-stack,他們將按照定義的順序執(zhí)行。在struts-default.xml中定義了一些缺省的Interceptor-stack,以便框架能很

24、好地運行。(5)ActionAction是框架的“工作單元”。Action可以指定一個Interceptor-stack、一序列的returntype和一序列的異常處理,但只有name屬性是必須的。22配置web.xml文件web應(yīng)用項目都需要一個web.xml配置文件,該文件負責對整個項目進行配置。針對struts2web.xml配置文件里有兩個比較重要的元素分別是和。定義struts2的核心控制器org.apache.struts2.dispatcher.FilterDispatcher,并將定義為名稱struts2;配置說明,使用上面定義的名稱為struts2的Filter來處理所有的用

25、戶URL請求。注意:如果web應(yīng)用使用Servlet2.3以前的規(guī)范,web應(yīng)用不會自動加載struts2的標簽庫,必須在web.xml中顯示指定加栽。/s/WEN-INF/struts-tags.tld如果在WEB-INF目錄下沒有發(fā)現(xiàn)struts-tags.tld標簽庫文件,就需要手動進行復(fù)制。標簽庫包含在struts2-core-2.0.11.jar文件中。如果使用Servlet2.4規(guī)范,標簽庫自動加載。23攔截器的配置攔截器是struts2核心內(nèi)容之一,攔截器的作用是在執(zhí)行action處理用戶請求之前或之后,執(zhí)行攔截器來進行某些操作,例如判斷用戶的合法身份,這樣在action中就不用

26、處理和判斷用戶身份的問題,將功能交給攔截器來管理。這就是AOP(面向切面編程)的編程思想。攔截器的定義interceptorname=”chatAuthentication”class=”org.apache.struts2.showcase.chat.ChatAuthenticationInteceptor”/上面定義了一個攔截器chatAuthentication和攔截器棧chatAuthenticationStack。在action中使用上述的攔截器或者攔截器棧,/chat/userAvailable.flt如果配置了攔截器,在執(zhí)行攔截器在usersAvailable的execute()

27、方法之前,需要執(zhí)行攔截器chatAuthenticationStack的相關(guān)處理。3Spring2.5框架Spring框架由一個容器,一個配置和組織組件的框架,和一組內(nèi)置的為事務(wù)、持久化和Web用戶接口提供的服務(wù)組成。作為一種輕量級的J2EE框架,Spring提供了一種有效的方式來建立和組織J2EE應(yīng)用程序。31Spring特性IoC(InversionofControl;控制反轉(zhuǎn));又稱DI(DependencyInjection;依賴注入);是面向?qū)ο箢I(lǐng)域新興的編程思想;也是Spring的精髓所在。簡單地說;IoC就是指程序之間的關(guān)系由容器來控制;而不是傳統(tǒng)實現(xiàn)中由程序代碼直接操控。這也就

28、是所謂“控制反轉(zhuǎn)”的概念所在:控制權(quán)由應(yīng)用代碼轉(zhuǎn)到外部容器,控制權(quán)的轉(zhuǎn)移,也就是所謂的反轉(zhuǎn)。IoC將控制創(chuàng)建的職責搬進了框架中;并把它從應(yīng)用代碼脫離開來。當使用Spring的IoC容器時只需指出組件需要的對象,在運行時Spring的IoC容器會根據(jù)XML配置數(shù)據(jù)提供給它。SpringIoC,借助于依賴注入設(shè)計模式,使得開發(fā)者不用理會對象自身的生命周期及其關(guān)系,而且能夠改善開發(fā)者對模式的使用。對于一個對象的管理不是什么困難,難就難在對整個對象群的管理。依賴注入可以讓容器管理對象,即“Dontcallme,Iwillcallyou”。這樣對象本身的生命周期以及對象之間的關(guān)系就不再讓開發(fā)者費神了。S

29、pringAOP,借助于Spring實現(xiàn)攔截器,開發(fā)者能夠?qū)崿F(xiàn)以聲名方式使用企業(yè)級服務(wù),比如安全性服務(wù)、事務(wù)服務(wù)。AOP合理的補充了OOP,借助于SpringAOP,開發(fā)者能夠高效的使用J2EE服務(wù)。Spring服務(wù)抽象,借助于各種J2EEAPI抽象,使得開發(fā)者能夠一致地使用J2EE技術(shù),而不管具體是使用什么J2EEAPI,借助于Spring服務(wù)抽象,使代碼大大減少,滿足“更少代碼,更少BUG”的軟件設(shè)計原則。SpringIoC+SpringAOP+Spring服務(wù)抽象,一起形成Spring,這樣一個有機體,使構(gòu)建輕量級J2EE成為可能。32SpringIoC容器Spring提供兩種IoC容器

30、,BeanFactory和ApplicationContext。SpringIoC容器提供IoC功能的實現(xiàn),負責讀取配置、裝配Bean、管理Bean的生命周期和維護各個Bean之間的關(guān)系,同時為永和獲取、管理的Bean提供接口。BeanFactory是SpringIoC容器的基本實現(xiàn),ApplicationContext繼承于BeanFactory,提供比BeanFactory更豐富的功能。321BeanFactory容器BeanFactory是整個SpringIoC容器的核心,它是一個接口,定義IoC容器的基本功能,實現(xiàn)從配置文件中讀取配置、裝配Bean、管理Bean的生命周期、Bean之間

31、的關(guān)系維護等IoC容器的基本功能,這些實現(xiàn)類通過Java的反射機制和工廠模式來實現(xiàn)裝配和管理Bean的過程,從而使被管對象無需知道Spring的存在,無需實現(xiàn)任何Spring接口、使用任何Spring提供的API,這就降低了Spring與受管Bean之間的耦合度。BeanFactory是一個接口,被放在org.springframework.beans.factory中。Spring提供了多種實現(xiàn)類,其中XmlBeanFactory是最簡單、最常用的實現(xiàn)類之一。322ApplicationContext容器ApplicationContext容器繼承BeanFactory容器,除了提供的所有功

32、能之外,還提供比BeanFactory更豐富的功能。在Spring官方的文檔種,推薦使用ApplicationContext容器。一個簡單的理解SpringIoC和DI的例子:有一個Person類和Axe類,Person類使用Axe類。首先是兩個類的接口定義:/定義Person類接口PublicinterfacePerson/Person接口定義一個使用斧子的方法PublicvoiduseAxe();/定義Axe接口PublicinterfaceAxe/Axe接口有一個砍的方法Publicvoidchop();/Chinese實現(xiàn)Person接口PulicclassChineseimpleme

33、ntsPerson/面向Axe接口編程,而不是具體的實現(xiàn)類PrivateAxeaxe;/默認的構(gòu)造器PublicChinses()/設(shè)置注入所需的setter方法PublicvoidsetAxe(Axeaxe)This.axe=axe;/實現(xiàn)Person接口的useAxe方法PublicvoiduseAxe()System.out.println(axe.chop();Axe的第一個實現(xiàn)類PublicclassstoneAxeimplementsAxe/默認的構(gòu)造器PublicstoneAxe()/實現(xiàn)Axe的接口chop方法Publicvoidchop()Return“石斧砍柴好慢!”;Sp

34、ring配置文件將Person實例和Axe實例組織在一起。主程序部分PublicclassBeanTest/主方法,程序的入口Publicstaticvoidmain(Stringargs)throwsException/因為是獨立的應(yīng)用程序,顯示地實例化Spring的上下文ApplicationContextctx=newFileSystemApplicationContext(“bean.xml”);/通過Personbean的id來獲取bean的實例,面向接口的編程,/因此,此處強制類型轉(zhuǎn)換為接口類型Personp=(Person)ctx.getBean(“chinese”);/直接執(zhí)行

35、Person的useAxe()方法p.useAxe();如果改寫Axe的實現(xiàn)類,或是提供另一個實現(xiàn)類給Person實例使用。Person接口、Chinese類都無需改變,只需提供另一個Axe的實現(xiàn),然后對配置文件進行簡單的修改即可。Axe的另一個實現(xiàn):PublicclassSteelAxeimplementsAxe/默認的構(gòu)造器PublicSteelAxe()/實現(xiàn)Axe的接口chop方法Publicvoidchop()Return“鋼斧砍柴好快!”;然后修改Spring的配置文件,在其中增加一行:該行重新定義一個Axe的實現(xiàn),SteelAxe。然后修改chinesebean的配置,將原來的s

36、toneAxe的地方改為steelAxe。構(gòu)造注入:構(gòu)造注入指的是,通過構(gòu)造函數(shù)來完成以來關(guān)系的設(shè)定,而不是通過setter方法。對前面Chinese類代碼的修改:PulicclassChineseimplementsPerson/面向Axe接口編程,而不是具體的實現(xiàn)類PrivateAxeaxe;/默認的構(gòu)造器PublicChinses(Axeaxt)This.axe=axe;/構(gòu)造注入所需的帶參數(shù)的構(gòu)造器PublicvoidChinese(Axeaxe)This.axe=axe;/實現(xiàn)Person接口的useAxe方法PublicvoiduseAxe()System.out.println(

37、axe.chop();Spring配置文件將Person實例和Axe實例組織在一起。在spring中,我們可以使用多個配置文件,將不同的bean配置放在不同的文件中,這樣便于維護與管理。比如數(shù)據(jù)庫相關(guān)配置在DataConfig.xml中定義,Action在ActionConfig.xml定義,然后在appicationContext.xml中利用標簽引入即可,spring在加載配置文件時會自動的加載這些文件:在配置文件中,可以使用標簽來為各個配置文件增加注釋,方便閱讀和管理。是標簽的子標簽,另一種注釋方式是。標簽是標簽的子標簽,用來定義一個受管的Bean,最簡單的Bean必須要指定用class

38、屬性來指定該JavaBean的類(必須包含類路徑)。同時如果不是內(nèi)部Bean,則必須要指定其id或name屬性之一來標識該bean,這樣才能引用到它。除此之外,標簽有很多其它屬性,為受管的bean注入值使用標簽中定義好一個受管的bean后,就可以為該bean的屬性注入其依賴的對象,spring中有兩個標簽為我們提供了這一功能:一個是,通過setter方法注入;另一個是,通過構(gòu)造方式注入。它們都是的子標簽。設(shè)值注入:設(shè)值注入就是springIoC容器首先通過無參數(shù)構(gòu)造子實例化受管bean,再調(diào)用標準的setter方法為其受管的bean成員注入其依賴對象??梢允褂脴撕炞⑷雑ava基本類型的值,也可

39、以使用標簽注入對象。猴子guagua2注意:如果要使用設(shè)值注入的方式,受管的bean就必須要有一個無參數(shù)的構(gòu)造函數(shù),否則容器就會拋出BeanCreationException異常,提示沒有找到默認的構(gòu)造方法。構(gòu)造注入:構(gòu)造注入是通過想bean的構(gòu)造方法中傳入若干個參數(shù)的方法,把其依賴的對象注入到受管的bean中,構(gòu)造的參數(shù)都必須是該受管bean所依賴的對象。姍姍Autowire自動裝配在應(yīng)用中,經(jīng)常使用標簽為受管bean注入所依賴的對象。Spring提供了一個自動裝配的機制,在應(yīng)用中結(jié)合標簽,減少程序員的勞動強度。定義bean時,標簽有一個屬性即autowire,通過它來指定容器為受管Java

40、Bean自動注入依賴對象。Autowire屬性有六個取值即:No:不啟用自動裝配。默認值Byname:通過屬性的名字的方式查找受管Bean依賴的對象并為其注入。byType:通過屬性的類型查找受管Bean依賴的對象并為其注入。constructor:與byType一樣,也是通過類型查找依賴的對象。區(qū)別在于它不是使用setter方法注入,而是使用構(gòu)造注入。autodetect:在byType和constructor之間自動選擇注入方式default:由上級標簽的default-autowire屬性確定使用賦值標簽使用標簽為受管的bean屬性直接賦值,使用標簽只是能夠給基本的java數(shù)據(jù)庫類型注入

41、值,比如int、String、float等,而給復(fù)雜的javaBean屬性注入值,就要使用一下幾種標簽:(1)標簽使用這個標簽可以為受管bean注入一個其他的受管bean的實例的引用,當受管bean的要引用其它類的實例時,使用該標簽。(2)標簽這個標簽可以為受管bean注入list類型或者數(shù)組類型的值,當要給某個受管bean的list或者數(shù)組類型的屬性值注入值時,使用該標簽,用法:(3)標簽這個標簽可以為受管bean注入set類型的值,和list類似,用法:(4)標簽Map是java中一個重要的接口,有hashmap、Properties等很多實現(xiàn)類。由于它以鍵、值對的形式存儲數(shù)據(jù),所以要用標

42、簽來為其key和value賦值。用法:spring(5)標簽在java中properties繼承實現(xiàn)了map接口,因此它也是用鍵值對的形式存放數(shù)據(jù),與map不同的是它的鍵(key)、值(value)是java.lang.String類型,無法為其賦Object類型的值。用法:李老師85(6)標簽這個標簽可以為受管bean的屬性注入空值。語法:323Spring事務(wù)管理Spring中的事務(wù)管理是通過AOP思想來實現(xiàn)的,AOP針對的是方法層面上的實現(xiàn),對于有接口的類,使用java內(nèi)部提供的Proxy,而沒有接口的,使用的是cglib庫,動態(tài)建立一個子類來實現(xiàn)。在springAOP中體統(tǒng)4種處理切入

43、類型:around、before、after、introduction。理解spring聲明式事務(wù)管理最重要的概念是:spring的事務(wù)管理是通過AOP代理實現(xiàn)的。其中的事務(wù)通知由元數(shù)據(jù)(目前是基于XML或注解)驅(qū)動。代理對象與事務(wù)元數(shù)據(jù)結(jié)合產(chǎn)生了一個AOP代理,使用一個platformTransactionManager實現(xiàn)配合TransactionInceptor。在方法調(diào)用前后實施事務(wù)。Spring提供的事務(wù)管理,可以分為兩種形式即編程式和聲明式。編程式比較靈活,但代碼量大,存在重復(fù)的代碼比較多;聲明式的比編程式的更靈活方便。Spring提供編程式的事務(wù)處理:Spring提供幾個關(guān)于事務(wù)

44、處理的類:TransactionDefinition/事務(wù)屬性定義TransactionStatus/代表當前的事務(wù)、可以提交和回滾PlatformTransactionManager這是spring提供的用于管理事務(wù)的基礎(chǔ)接口,其下有一個實現(xiàn)的抽象類AbstractPlatformTransactionManager。Spring聲明式事務(wù)處理Spring聲明式事務(wù)處理主要使用的IoC、AOP思想,提供TransactionIterceptor攔截器呵呵常用的代理類TransactionManagerProxyFactoryBean,可以直接對組件進行事務(wù)代理。使用TransactionIn

45、terceptor的步驟:定義數(shù)據(jù)源,事務(wù)管理類定義事務(wù)攔截器com.test.UserManager.*r=PROPAGATION_REQUIRED為組件說明一個代理類:ProxyFactoryBeancom.test.UserManager使用TransactionProxyBeanpropspropkey=insert*PROPAGATION_REQUIRED/proppropkey=update*PROPAGATION_REQUIRED/proppropkey=*PROPAGATION_REQUIRED,readOnly/prop/propsTransactionProxyFactor

46、yBean只是為組件的事務(wù)代理,如果我們要給組件添加一些業(yè)務(wù)方面的驗證等,可以使用TransactionTemplate加攔截器方式,為組件添加多個攔截器,springAOP中提供了三類Advice,即前增強,后增強,拋出異常時的增強,可以靈活使用。Spring聲明式事物管理關(guān)于聲明式事物管理的配置通常采用三種方式:使用TransactionProxyFactoryBean為目標bean生成事物代理的配置,此方法式最傳統(tǒng),配置文件最臃腫、難以閱讀的方式采用bean繼承的事物代理配置方式,比較簡單,但依然是增量式配置使用BeanNameAutoProxycreator,根據(jù)beanname自動生

47、成事務(wù)代理的方式。建議采用第三種配置方式。324Spring+HibernateHibernate的持久層的訪問必須按如下的步驟進行Step1創(chuàng)建Configuration實例Step2創(chuàng)建SessionFactory實例Step3創(chuàng)建Session實例Step4打開事物Step5開始持久化的訪問Step6提交事物Step7如果遇到異常,回滾事物Step8關(guān)閉session使用HibernateTemplateHibernateTemplate提供持久化層訪問模板化,使用HibernateTemplate無需實現(xiàn)特定接口,它值需要提供一個SessFactory的引用,就可以執(zhí)行持久化操作,Se

48、ssionFactory對象可通過構(gòu)造參數(shù)傳入,或通過設(shè)值方式傳入。在web應(yīng)用中,通常啟動時自動加載ApplicationContext,SessionFactory和DAO對象都處在Spring上下文管理下,因此無需在代碼中顯示設(shè)置,可以采用依賴注入解耦SessionFactory和DAO。Spring+hibernate配置Spring+Hibernate的配置,就是對ApplicationContext.Xml文件進行配置。實質(zhì)就是Bean的配置組件列表和注入過程,要使用hibernateTemplate進行開發(fā),需要在Bean配置文件中添加一系列的組件,這些組件相互注入。需要如下一些

49、組件:dataSource:為sessionFactory提供數(shù)據(jù)源sessionFactory:Hibernate管理工廠,為具體DAO的事務(wù)管理策略對象transactionManager提供sessionFactorytransactionManager:為具體DAO的事務(wù)管理策略對象xxxDAOProxy提供事務(wù)管理器對象xxxDAO:為xxxDAO提供POJO類;利用被注入的數(shù)據(jù)源,定義一系列的業(yè)務(wù)操作函數(shù),使用hibernateTemplate來操作POJO類,實現(xiàn)對數(shù)據(jù)庫的操作xxxDAOProxy:xxxDAO的事務(wù)管理策略對象,該對象規(guī)定了xxxDAO的管理策略,因此它需要注

50、入xxxDAO作為被管理的對象。進行事務(wù)管理也需要提供事務(wù)管理器,因此需要注入transactionManager作為事務(wù)管理器。Action類:該類是響應(yīng)處理類,負責調(diào)用xxxDAO函數(shù)即可以實現(xiàn)對數(shù)據(jù)庫的訪問,而對于xxxDAO的訪問都將在xxxDAOProxy監(jiān)督下進行。該過程的執(zhí)行順序:創(chuàng)建數(shù)據(jù)源dataSource創(chuàng)建sessionFactory,并注入數(shù)據(jù)源dataSource創(chuàng)建事務(wù)管理對象transactionManager,并注入sessionFactory;創(chuàng)建xxxDAO,并注入sessionFactory;創(chuàng)建事務(wù)管理策略對象xxxDAOProxy,并注入所管理對象xx

51、xDAO和所用事務(wù)管理器transactionManager創(chuàng)建Action,并注入xxxDAO。詳細的配置代碼:com.mysql.jdbc.driverjdbc:mysql:/wonder:3306/j2eerootpasslee/Person.xmlorg.hibernate.dialect.MySQLDialectupdatePROPAGATION_REQUIREDPROPAGATION_REQUIRED,readOnlyPROPAGATION_REQUIREDtransactionInterceporTransactionInterceptor是一個事務(wù)攔截器bean,需要傳入一個T

52、ransactionManager的引用。配置中使用Spring依賴注入該屬性。事務(wù)攔截器的事務(wù)屬性通過transactionAttributes來指定,該屬性有props子元素,配置文件中定義如下3個事務(wù)的傳播原則。所有以insert開始的方法,采用PROPAGATION_REQUIRED的事務(wù)傳播規(guī)則,程序拋出MyException異常及其子異常時,自動回滾事務(wù)。所有以find開頭的方法,采用PROPAGATION_REQUIRED事務(wù)傳播規(guī)則,并且只讀。其它方法,則采用PROPAGATION_REQUIRED的事務(wù)傳播規(guī)則。BeanBNameAutoProxyCteator是根據(jù)bean

53、名自動生成代理的代理創(chuàng)建器,該bean通常需要接受兩個參數(shù),第一個是beanName屬性,該屬性用來設(shè)置哪些bean需要自動生成代理。另一個屬性是interceptorNames,該屬性則指定事務(wù)攔截器。自動創(chuàng)建代理時,系統(tǒng)會根據(jù)這些事務(wù)攔截器的屬性來生成對應(yīng)的事務(wù)代理。4Hibernate框架41Hibernate體系結(jié)構(gòu)Hibernate是通過配置文件和映射文件來為應(yīng)用層和數(shù)據(jù)庫層提供持久化服務(wù)的。類路徑問題:基于Java平臺開發(fā)的web應(yīng)用來說,其類路徑有兩個分別是全局類路徑(globalclasspath)和上下文類路徑(Contextclasspath)?;赥omcat的web應(yīng)用

54、,全局庫文件搜索路徑是(Tomcat/common/lib)和本web應(yīng)用程序上下文的類裝載器搜索路徑(對于jar文件來說是webapps/quickstart/WEB-INF/lib,對于class文件來說是webapps/qickstart/WEB-INF/classes)文件的拷貝數(shù)據(jù)庫需要的JDBC驅(qū)動程序拷貝到全局類路徑,這是tomcat附帶的DBCP連接池軟件需要的,Hibernate使用JDBC來連接數(shù)據(jù)庫。其它的一些文件,不要拷貝到全局類路徑里,一般放置在上下文類路勁里。創(chuàng)建持久化類Hibernate最好的使用方法是使用普通的java對象(PlainOldJavaObjects

55、)POJO。一個POJO就像JavaBean,屬性是通過setter和getter方法訪問。Hibernate對屬性使用的類型不加限制,所有的JavaJDK類型和原始類型(stringchardate等)都可以被映射,也包括Java集合類型框架(JavaCollectionsFramework)中的類??梢园阉鼈冇成錇橹?、值集合、或者與其它實體關(guān)聯(lián)。Id是一個特殊的屬性,代表這個類的數(shù)據(jù)庫標識符(主鍵)。每個持久化類都應(yīng)該需要有一個標識屬性,這個屬性用來區(qū)分持久化對象。HibernatesessionHibernate的session是持久化管理接口,用來從數(shù)據(jù)庫中存取數(shù)據(jù)。首先是從sessi

56、onFactory中獲取一個session。sessionFactorysession=newConfiguration().configure().buildSessionFactory();sessionFactory負責一個數(shù)據(jù)庫,對應(yīng)一個XML配置文件的(hibertenate.cfg.xml)。sessionFactory配置Congigurationcfg=newConfiguration();Sessionfactorysession=cfg.buildSessonFactory();事務(wù)策略配置使用Hibernate的TransactionAPI,必須通過hibernate.t

57、ransaction.factory_class屬性指定一個Transaction實例工廠類。內(nèi)置兩個標準選擇是net.sf.hibernate.transaction.JDBCTransactionFactory使用數(shù)據(jù)庫(JDBC)事務(wù)(默認)Net.sf.hibernate.transaction.JTATransactionFactory使用JTA42ORM(ObjectRelationMapping)421多對一(many-to-one)通過多對一元素(many-to-one),可以定義一種常見的與另一個持久化類的關(guān)聯(lián),這種關(guān)聯(lián)模型是多對一關(guān)聯(lián)。(實際上就是對象引用)422one-t

58、o-one持久化對象之間一對一的關(guān)聯(lián)關(guān)系是通過one-to-one元素定義的:有兩種不同形式的一對一關(guān)聯(lián):主鍵關(guān)聯(lián)惟一外鍵關(guān)聯(lián)主鍵關(guān)聯(lián)不需要額外的表字段:兩行是通過這種一對一關(guān)系相關(guān)聯(lián),那么這兩行就共享同樣的主關(guān)鍵字值。因此,如果希望兩個對象通過一對一關(guān)聯(lián),必須確認它們被賦以同樣的標識值。比如說對下面的Employee和person進行主鍵一對一關(guān)聯(lián):因此,必須確保Person和Employee中相關(guān)的字段是相等的。使用一個特別的稱為foreign的hibernate標識符生成器策略:employee.另一種方式是外鍵和一個惟一關(guān)鍵字對應(yīng),上面的例子,如果使用外鍵方式,應(yīng)表達成:如果在pers

59、on的映射加入下面幾句,這種就是雙向的:43HQL語句學習一個簡單的代碼演示from查詢:PublicclassHqlQueryPublicstaticvoidmain(Stringargs)throwsException/實例化HqlQuery對象HqlQuerymgr=newHqlQuery();/調(diào)用HQL查詢方法mgr.findPersons();mgr.findPersonsbByHappenDate();PrivatevoidfindPersons()/通過工具類HibernianUtil的currentSession方法開始sessionSessionsess=Hibernate

60、Util.currentSession();/開始事物Transactiontx=sess.beginTransaction();/使用Session的createQuery方法創(chuàng)建查詢對象Queryq=sess.createQuery(“fromPersonp”);/執(zhí)行Query對象的list方法,返回查詢的全部實例q.list();/遍歷結(jié)果集,返回全部的查詢記錄for(Iteratorpit=p.iterator();pit.hasNext();)Personp=(Person)pit.next();System.out.println(p.getName();/提交事物Tmit();

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論