<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-7  評(píng)論-24  文章-102  trackbacks-0

    原文: 
    struts+spring+hibernate 組裝web應(yīng)用
    用spring、Hibernate、Struts組建輕量級(jí)架構(gòu)



    應(yīng)用程序的分層 (Application Layering)/  SSH       大多數(shù)不復(fù)雜的web應(yīng)用都能被分成至少4個(gè)各負(fù)其責(zé)的層次。這些層次是:表現(xiàn)層(presentation)、持久層(persistence)、業(yè)務(wù)層(business)、領(lǐng)域模型層(domain model)。每層在應(yīng)用程序中都有明確的責(zé)任,不應(yīng)該和其它層混淆功能。每一應(yīng)用層應(yīng)該彼此獨(dú)立但要給他們之間放一個(gè)通訊接口。讓我們從審視各個(gè)層開始,討論這些層應(yīng)該提供什么和不應(yīng)該提供什么。

     
    為什么采用這樣的四層架構(gòu)?


    表現(xiàn)層 (The Presentation Layer) / Struts   在一個(gè)典型的web應(yīng)用的一端是表現(xiàn)層。很多Java開發(fā)者也理解Struts所提供的。然而,太常見的是,他們把像業(yè)務(wù)邏輯之類的耦合的代碼放進(jìn)了一個(gè)org.apache.struts.Action。所以,讓我們?cè)谙馭truts這樣一個(gè)框架應(yīng)該提供什么上取得一致意見。這兒是Struts負(fù)責(zé)的:  

         為用戶管理請(qǐng)求和響應(yīng);  
         提供一個(gè)控制器(controller)代理調(diào)用業(yè)務(wù)邏輯和其它上層處理; 
         處理從其它層擲出給一個(gè)Struts Action的異常; 
         為顯示提供一個(gè)模型;
         執(zhí)行用戶接口(UI)驗(yàn)證。


    這兒是一些經(jīng)常用Struts編寫的但是卻不應(yīng)該和Struts表現(xiàn)層相伴的項(xiàng)目:

         直接和數(shù)據(jù)庫(kù)通訊,比如JDBC調(diào)用; 
         業(yè)務(wù)邏輯和與你的應(yīng)用程序相關(guān)的驗(yàn)證; 
         事務(wù)管理;

    在表現(xiàn)層中引入這種代碼將導(dǎo)致典型耦合(type coupling)和討厭的維護(hù)。

    為什么使用Struts?


    業(yè)務(wù)層(The Business Layer) / Spring       在一個(gè)典型的web應(yīng)用程序的中間的組件是業(yè)務(wù)層或服務(wù)層。從編碼的視角來看,這個(gè)服務(wù)層是最容易被忽視的一層。不難在用戶接口(UI)層或者持久層里找到散布在其中的這種類型的代碼。這不是正確的地方,因?yàn)檫@導(dǎo)致了應(yīng)用程序的緊耦合,這樣一來,隨著時(shí)間推移代碼將很難維護(hù)。幸好,針對(duì)這一問題有好幾種Frameworks存在。在這個(gè)領(lǐng)域兩個(gè)最流行的框架是Spring和PicoContainer,它們叫作微容器(microcontainers),你可以不費(fèi)力不費(fèi)神的把你的對(duì)象連在一起。所有這些框架都工作在一個(gè)簡(jiǎn)單的叫作“依賴注入”(dependency injection)(也通稱“控制反轉(zhuǎn)”(inversion of control))的概念上。這篇文章將著眼于Spring的為指定的配置參數(shù)通過bean屬性的setter注入(setter injection)的使用。Spring也提供了一個(gè)構(gòu)建器注入(constructor injection)的復(fù)雜形式作為setter注入的一個(gè)替代。對(duì)象們被一個(gè)簡(jiǎn)單的XML文件連在一起,這個(gè)XML文件含有到像事務(wù)管理器(transaction management handler)、對(duì)象工廠(object factories)、包含業(yè)務(wù)邏輯的服務(wù)對(duì)象(service objects)、和數(shù)據(jù)存取對(duì)象(DAO)這些對(duì)象的引用(references)。
     

    這篇文章的后面將用例子來把Spring使用這些概念的方法說得更清楚一些。業(yè)務(wù)層應(yīng)該負(fù)責(zé)下面這些事情:

        處理應(yīng)用程序的業(yè)務(wù)邏輯和業(yè)務(wù)驗(yàn)證;
        管理事務(wù);
        預(yù)留和其它層交互的接口;
        管理業(yè)務(wù)層對(duì)象之間的依賴;
        增加在表現(xiàn)層和持久層之間的靈活性,使它們互不直接通訊;
        從表現(xiàn)層中提供一個(gè)上下文(context)給業(yè)務(wù)層獲得業(yè)務(wù)服務(wù)(business services );
        管理從業(yè)務(wù)邏輯到持久層的實(shí)現(xiàn)。

    為什么使用Spring ?


    持久層 (The Persistence Layer ) / Hibernate

            在典型web應(yīng)用的另一端是持久層。這通常是使事情迅速失控的地方。開發(fā)者低估了構(gòu)建他們自己的持久層框架的挑戰(zhàn)性。一般來說,機(jī)構(gòu)內(nèi)部自己寫的持久層不僅需要大量的開發(fā)時(shí)間,而且還經(jīng)常缺少功能和變得難以控制。有幾個(gè)開源的“對(duì)象-關(guān)系映射”(ORM)框架非常解決問題。尤其是,Hibernate框架為java提供了"對(duì)象-關(guān)系持久化"(object-to-relational persistence)機(jī)制和查詢服務(wù)。Hibernate對(duì)那些已經(jīng)熟悉了SQL和JDBC API的Java開發(fā)者有一個(gè)適中的學(xué)習(xí)曲線。Hibernate持久對(duì)象是基于簡(jiǎn)單舊式Java對(duì)象(POJO)和Java集合(Java collections)。此外,使用Hibernate并不妨礙你正在使用的IDE。下面的列表包含了你該寫在一個(gè)持久層框架里的代碼類型:

            查詢相關(guān)的信息成為對(duì)象。Hibernate通過一種叫作HQL的面向?qū)ο螅∣O)的查詢語(yǔ)言或者使用條件表達(dá)式API(expressive criteria API)來做這個(gè)事情。 HQL非常類似于SQL-- 只是把SQL里的table和columns用Object和它的fields代替。有一些新的專用的HQL語(yǔ)言成分要學(xué);不過,它們?nèi)菀桌斫舛椅臋n做得好。HQL是一種使用來查詢對(duì)象的自然語(yǔ)言,花很小的代價(jià)就能學(xué)習(xí)它。

            保存、更新、刪除儲(chǔ)存在數(shù)據(jù)庫(kù)中的信息。

            像Hibernate這樣的高級(jí)“對(duì)象-關(guān)系”映射(object-to-relational mapping)框架提供對(duì)大多數(shù)主流SQL數(shù)據(jù)庫(kù)的支持,它們支持“父/子”(parent/child)關(guān)系、事務(wù)處理、繼承和多態(tài)。


    這兒是一些應(yīng)該在持久層里被避免的項(xiàng)目:

        業(yè)務(wù)邏輯應(yīng)該在你的應(yīng)用的一個(gè)高一些的層次里。持久層里僅僅允許數(shù)據(jù)存取操作。

        你不應(yīng)該把持久層邏輯(persistence logic)和你的表現(xiàn)層邏輯(presentation logic)攪在一起。避免像JSPs或基于servlet的類這些表現(xiàn)層組件里的邏輯和數(shù)據(jù)存取直接通訊。通過把持久層邏輯隔離進(jìn)它自己的層,應(yīng)用程序變得易于修改而不會(huì)影響在其它層的代碼。例如:Hebernate能夠被其它持久層框架或者API代替而不會(huì)修改在其它任何層的代碼。

    為什么使用Hibernate ?


    領(lǐng)域模型層 (The Domain Model Layer )         最后,因?yàn)槲覀冇懻摰氖且粋€(gè)不是很復(fù)雜的、基于web的應(yīng)用程序,我們需要一組能在不同的層之間移動(dòng)的對(duì)象。領(lǐng)域?qū)ο髮佑赡切┐憩F(xiàn)實(shí)世界中的業(yè)務(wù)對(duì)象的對(duì)象們組成,比如:一份訂單(Order)、訂單項(xiàng)(OrderLineItem)、產(chǎn)品(Product)等等。這個(gè)層讓開發(fā)者停止建立和維護(hù)不必要的數(shù)據(jù)傳輸對(duì)象(或者叫作DTOs),來匹配他們的領(lǐng)域?qū)ο蟆@纾琀ibernate允許你把數(shù)據(jù)庫(kù)信息讀進(jìn)領(lǐng)域?qū)ο螅╠omain objects)的一個(gè)對(duì)象圖,這樣你可以在連接斷開的情況下把這些數(shù)據(jù)顯示到UI層。那些對(duì)象也能被更新和送回到持久層并在數(shù)據(jù)庫(kù)里更新。而且,你不必把對(duì)象轉(zhuǎn)化成DTOs,因?yàn)镈TOs在不同的應(yīng)用層間移動(dòng),可能在轉(zhuǎn)換中丟失。這個(gè)模型使得Java開發(fā)者自然地以一種面向?qū)ο蟮娘L(fēng)格和對(duì)象打交道,沒有附加的編碼。
    posted on 2008-09-04 16:45 黃小二 閱讀(631) 評(píng)論(1)  編輯  收藏 所屬分類: J2EE

    評(píng)論:
    # re: SSH 組建輕量級(jí)架構(gòu) 2011-06-23 09:55 | 林風(fēng)琦
    寫的非常好  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 一级毛片免费观看不收费| 老司机亚洲精品影院无码| 相泽南亚洲一区二区在线播放| 久热中文字幕在线精品免费| 久久精品国产99精品国产亚洲性色| 成人免费观看男女羞羞视频| 免费在线看片网站| 免费国产va视频永久在线观看| 亚洲国产一区二区三区| 4hu四虎免费影院www| 亚洲最大AV网站在线观看| 在线观看片免费人成视频播放| 久久久久久A亚洲欧洲AV冫| 中国好声音第二季免费播放| 亚洲欧洲日产国码无码网站| 曰批全过程免费视频在线观看无码| 亚洲国产综合精品中文第一区| xxxxx免费视频| 亚洲日本在线观看| 香港a毛片免费观看| 亚洲精品无码久久久久久久 | 亚洲中文字幕无码久久2017| 中国国语毛片免费观看视频| 婷婷精品国产亚洲AV麻豆不片 | 一级日本高清视频免费观看 | 91免费在线播放| 亚洲日本一线产区和二线| 亚洲M码 欧洲S码SSS222| 久久免费香蕉视频| 久久精品国产亚洲av水果派 | 亚洲宅男永久在线| 一二三四免费观看在线视频中文版| 综合偷自拍亚洲乱中文字幕| 亚洲精品乱码久久久久久自慰| 999任你躁在线精品免费不卡| 亚洲美国产亚洲AV| 亚洲人成人网站色www| 免费在线观看的网站| selaoban在线视频免费精品| 亚洲成人福利在线| 亚洲欧洲一区二区三区|