欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Huihoo.com - 利用JSF、SpringFramework和Hibernate構建Web應用的實(shí)例講述

利用JSF、SpringFramework和Hibernate構建Web應用的實(shí)例講述


(來(lái)源:http://blog.csdn.net/ylong/archive/2004/07/24/50810.aspx)

[原作者] Derek Yang Shen
[原文鏈接] http://www.javaworld.com/javaworld/jw-07-2004/jw-0719-jsf.html
[源碼鏈接] http://www.javaworld.com/javaworld/jw-07-2004/jsf/jw-0719-jsf.zip
[翻譯] 本人
[點(diǎn)評] 該文是我看的第一篇講述JSF與Spring整合的文章,是一個(gè)很好的范例,比較適合于對Spring有了一定了解人學(xué)習。其中大量篇幅講述的JSF,對JSF感興趣的也可以來(lái)看看。
[聲明] 該文是本人第一次翻譯大塊頭的文章,由于本人才疏學(xué)淺、英語(yǔ)較爛,但考慮到和我一樣不喜歡看洋文的大有人在,遂用近4小時(shí)的時(shí)間翻譯該文,對一些技術(shù)名詞和不會(huì )翻譯的地方用原文代替,其中難免有很多錯誤,歡迎批評指正。

[譯文]

JSF是一種新的用于構架j2ee應用用戶(hù)界面的技術(shù),它尤其適合于基于MVC架構的應用中。雖已有很多文章介紹過(guò)了JSF,然而它們大多從理論高度來(lái)介紹JSF而不是面向于實(shí)際應用。目前對于實(shí)際應用,JSF仍有很多問(wèn)題沒(méi)有解決,例如:如何使JSF適應于MVC整體構架中?如何將JSF與其他Java 框架整合起來(lái)?是否應該將業(yè)務(wù)邏輯放置在JSF的backing beans中?如何處理JSF中的安全機制?更為重要的是如何利用JSF構架現實(shí)世界的Web應用?

本文將涉及到上面的這些問(wèn)題,它將演示如何將JSF、Spring和Hibernate整合在一起,構架出一個(gè)名為JCatalog的
在線(xiàn)產(chǎn)品價(jià)目系統。利用該Demo,本文涵蓋了Web應用開(kāi)發(fā)的每一個(gè)階段,包括需求收集、分析,技術(shù)選擇,系統架構和實(shí)現。本文討論了在JCatalog中涉及到的各種技術(shù)的優(yōu)點(diǎn)和缺點(diǎn)并展示了一些關(guān)鍵部分的設計方法。

本文的對象是從事基于J2ee的Web應用架構人員和開(kāi)發(fā)人員,它并不是對JSF、SpringFramework和Hibernate的簡(jiǎn)單介紹,如果對這些領(lǐng)域不甚了解,請參看相關(guān)資源。

該范例的功能需求
JCatalog是一個(gè)現實(shí)世界的Web應用,我首先描述JCatalog的需求,在通篇的技術(shù)決策和架構設計時(shí)都將涉及到本部分。

在設計Web應用的第一階段是收集系統的功能需求,范例應用是一個(gè)典型的電子商務(wù)應用系統,用戶(hù)可以瀏覽產(chǎn)品的catalog并查看產(chǎn)品的詳細情況,而管理員可以管理產(chǎn)品的catalog。通過(guò)增加一些其他功能,如inventory管理和訂單處理等,該應用可成為一個(gè)成熟的電子商務(wù)系統。

Use cases
Use-case分析被用來(lái)展示范例應用的功能需求,圖1就是該應用的use-case圖。
    


use-case圖用于表示系統中的actors以及可能進(jìn)行的operations,在該應用中將有七個(gè)use-case,用戶(hù)能夠瀏覽產(chǎn)品 catalog和查看產(chǎn)品的詳細情況,一旦用戶(hù)登錄到系統中,她將成為管理員,從而可以創(chuàng )建新的產(chǎn)品,編輯已存在的產(chǎn)品或者刪除老的產(chǎn)品等。

Business rules
JCatalog必須符合以下business rules:
  • 每個(gè)產(chǎn)品必須具有唯一的ID
  • 每個(gè)產(chǎn)品必須屬于至少一個(gè)category
  • 產(chǎn)品ID一旦創(chuàng )立不得修改
Assumptions
我們在系統的設計和實(shí)現中做以下假定:
  • 英語(yǔ)講是缺省語(yǔ)言,且不需事先國際化
  • 在Catalog不講不會(huì )超過(guò)500個(gè)產(chǎn)品
  • catalog將不會(huì )被頻繁的修改
Page flow
圖2顯示了所有的JCatalog的pages以及它們之間的transitions關(guān)系:
    


該應用中存在兩組pages:公開(kāi)的internet和用于管理的intranet,其中intranet只能被那些成功登錄到系統的用戶(hù)訪(fǎng)問(wèn)。 ProductSummary不作為一個(gè)單獨的page展示給用戶(hù),它顯示在Catalog page中的frame中。ProductList只對管理員可視,它包含用于創(chuàng )建、編輯和刪除產(chǎn)品的鏈接。

圖3是一個(gè)Catalog頁(yè)面的示意圖,理想狀況下,在需求文檔中應該包含每一頁(yè)的詳細示意圖。
        


構架設計
Web應用開(kāi)發(fā)的下一個(gè)階段是構架設計,它包括將應用劃分為多個(gè)功能組件并將這些組件分割組合成層,高層的構架設計應該中立于所選用的特定技術(shù)。

多層架構
多層架構是將整個(gè)系統清晰的分為多個(gè)功能單元:client、presentation、business-logic、integration和 EIS,這將確保職責得到清晰的劃分,使得系統更易于維護和擴展。具有三層或等多層的系統被證明比C/S模型具有更好的伸縮性和靈活性。

client層是使用和表示數據模型的地方,對于一個(gè)Web應用,client層通常是瀏覽器,基于瀏覽器的瘦客戶(hù)端不包含任何表示邏輯,它依賴(lài)于
presentation層。

presentation層將business-logic層的服務(wù)展示給用戶(hù),它應知道如何處理用戶(hù)的請求,如何同business-logic層交互,并且知道如何選擇下一個(gè)視圖顯示給用戶(hù)。

business-logic層包含應用的business objects和business services。它接受來(lái)在于presentation層的請求、基于請求處理業(yè)務(wù)邏輯。業(yè)務(wù)邏輯層組件將受益于系統級的服務(wù),如安全管理、事務(wù)管理和資源管理等。

integration層是介于
business-logic層和EIS層之間的橋梁,它封裝了與EIS層交互的邏輯。有時(shí),將integration層和business-logic層合稱(chēng)為中間層。

應用的數據被保存在EIS層中,它包括關(guān)系數據庫、面向對象數據庫和以及遺留系統等。

JCatalog的構架設計
圖4顯示了JCatalog的構架設計以及如何應用于多層構架系統中。
 


該應用采用了多層非分布式的構架,圖4展示了系統的分層以及每一層中選擇的技術(shù),它同時(shí)又是該范例的部署圖,它的presentation、 business-logic和integration層將存在于同一個(gè)web容器中。定義良好的接口將孤立每一層的職責,這一架構使得應用更為簡(jiǎn)單和更好的伸縮性。

對于presentation層,經(jīng)驗表明,最好的方法是選擇已存在的并已得到證明了的Web應用框架,而不是自己去設計和開(kāi)發(fā)新的框架。我們擁有多個(gè)可選擇的框架,如Struts,WebWork和JSF等,在JCatalog中,我們選擇采用JSF。

EJB和POJO都可以用來(lái)創(chuàng )建業(yè)務(wù)邏輯層,如果應用是分布式的,采用具有remote接口的EJB是一個(gè)好的選擇;由于JCatalog是一個(gè)典型的不需要遠程訪(fǎng)問(wèn)的Web應用,因此選用POJO,并充分利用Spring Framework的幫助,將是實(shí)現業(yè)務(wù)邏輯層的更好選擇。

integration層利用關(guān)系型數據庫事先數據的持續化,存在多種方法可用來(lái)實(shí)現:
  • JDBC:這是最為靈活的方法,然而,低級的JDBC難以使用,而且質(zhì)量差的JDBC代碼很難運轉良好
  • Entity beans:CMP的Entity bean是一種分離數據訪(fǎng)問(wèn)代碼和處理ORM的昂貴的方法,它是以應用服務(wù)器為中心的方法,即entity bean不是將應用與某種數據庫類(lèi)型而是EJB容器約束在一起。
  • O/R mapping framework:一個(gè)ORM框架采用以對象為中心的方法實(shí)現數據持續化,一個(gè)以對象為中心的應用易于開(kāi)發(fā)并具有高度的可移植性。在該領(lǐng)域中存在幾個(gè)框架可用—JDO、Hibernate、TopLink以及CocoBase等。在我們的范例中將選用Hibernate。
現在,我們將討論每一層中的設計問(wèn)題,由于JSF是一個(gè)相對較新的技術(shù),因此將著(zhù)重于它的使用:

presentation層和JSF
表示層的功能是收集用戶(hù)的輸入、展示數據、控制頁(yè)面導航并將用戶(hù)的輸入傳遞給業(yè)務(wù)邏輯層,表示層同時(shí)需要驗證用戶(hù)的輸入以及維護應用的session狀態(tài)。在下面幾部分中,我將討論表示層設計時(shí)的考慮和模式,并說(shuō)明選擇JSF作為JCatalog表示層的原因。

MVC
MVC是Java-Blueprints推薦的架構設計模式,MVC將幾個(gè)方面分離開(kāi)來(lái),從而減少代碼的重復,它以控制為中心并使得應用更具擴展性。MVC同時(shí)可幫助具有不同技能的用戶(hù)更關(guān)注于自己的技能,通過(guò)定義良好的接口進(jìn)行相互合作。MVC是表示層的架構設計模式。

JSF
JSF是Web應用的服務(wù)器端用戶(hù)組件框架,它包含以下API:表示UI組件、管理它們的狀態(tài)、處理事件、服務(wù)器端驗證、數據轉換、定義頁(yè)面導航、支持國際化,并為這些特性提供擴展能力。它同時(shí)包括兩個(gè)JSP的tag庫以在JSP頁(yè)面中表示UI組件,以及將組件wire為服務(wù)器端對象。

JSF和MVC
JSF非常適合于基于MVC的表示層架構,它在行為和表示之間提供了清晰的分離,它使得你可以采用熟悉的UI組件和web層概念而無(wú)需受限于某種特殊的腳本技術(shù)或標記語(yǔ)言。

JSF backing beans是JSF的Model層,此外,它同樣包含actions,action是controller層的擴展,用于將用戶(hù)的請求委派給業(yè)務(wù)邏輯層。這里請注意,從整體的應用構架看,業(yè)務(wù)邏輯層也被稱(chēng)為model層。包含JSF標簽的JSP頁(yè)面是表示層,Faces Servlet提供了controller的功能。

為什么選用JSF?

JSF不僅僅是另外一個(gè)Web框架,下面這些特性是JSF區別于其他Web框架之所在:
  • 類(lèi)Swing的面向對象的Web應用開(kāi)發(fā):服務(wù)器端有狀態(tài)的UI組件模型,配合event listeners和handlers,促進(jìn)了面向對象的Web應用開(kāi)發(fā)。
  • backing-bean管理: backing bean是與頁(yè)面中使用的UI組件相關(guān)聯(lián)的javabean組件,backing-bean管理將UI組件對象的定義同執行應用相關(guān)處理和擁有數據的對象分離開(kāi)來(lái)。JSF在合適的范圍內保存和管理這些backing-bean實(shí)例。
  • 可擴展的UI模型:JSF的UI模型是可配置的、可重用的,用以構建JSF應用的用戶(hù)界面。你可以通過(guò)擴展標準的UI組件來(lái)開(kāi)發(fā)出更為復雜的組件,例如菜單條、樹(shù)組件等。
  • 靈活的rendering模型:renderer分離了UI組件的功能和顯示,多個(gè)renderers可創(chuàng )建和用來(lái)為同一客戶(hù)端或不同的客戶(hù)端定義不同的顯示。
  • 可擴展的轉換和驗證模型:基于標準的converter和validator,你可以開(kāi)發(fā)出自己的可提供更好的模型保護的converter和validator。
盡管如此,JSF目前尚未成熟,隨同JSF發(fā)布的 components、converters和validators都是最基礎的,而且per-component驗證模型不能處理components 和validators間的many-to-many驗證。此外,JSF標簽不能與JSTL間無(wú)縫的整合在一起。

在下面的章節中,我將討論幾個(gè)在JCatalog實(shí)現中的關(guān)鍵部分和設計決策。我首先解釋managed bean的定義和使用以及JSF中的backing bean,然后,我將說(shuō)明如何處理安全、分頁(yè)、caching、file upload、驗證以及錯誤信息定制。

Managed bean,backing bean,view object 和domain object model
JSF中引入了兩個(gè)新的名詞:managed bean和backing bean。JSF提供了一個(gè)強大的managed-bean工具,由JSF來(lái)管理的JavaBean對象稱(chēng)為managed-bean,一個(gè) managed bean表述了一個(gè)bean如何被創(chuàng )建和管理,它不包含該bean的任何功能性描述。

backing bean定義了與頁(yè)面中使用的UI組件相關(guān)聯(lián)的屬性和處理邏輯。每一個(gè)backing-bean屬性邦定于一個(gè)組件實(shí)例或某實(shí)例的value。一個(gè) backing-bean同時(shí)定義了一組執行組件功能的方法,例如驗證組件的數據、處理組件觸發(fā)的事件、實(shí)施與組件相關(guān)的導航等。

一個(gè)典型的JSF應用將其中的每個(gè)頁(yè)面和一個(gè)backing-bean結合起來(lái),然而在現實(shí)應用中,強制的執行這種one-on-one的關(guān)系不是一種理想的解決方案,它可能會(huì )導致代碼重復等問(wèn)題。在現實(shí)的應用中,多個(gè)頁(yè)面可以共享一個(gè)backing-bean,例如在JCatalog中, CreateProduct和EditProduct將共享同一個(gè)ProductBean定義。

model對象特定于表示層中的一個(gè)view對象,它包含必須顯示在view層的數據以及驗證用戶(hù)輸入、處理事件和與業(yè)務(wù)邏輯層交互的處理邏輯等。在基于 JSF的應用中backing bean就是view對象,在本文中backing bean和view對象是可互換的名詞。

對比于struts中的ActionForm和Action,利用JSF中的backing-bean進(jìn)行開(kāi)發(fā)將能更好的遵循面向對象方法,一個(gè) backing-bean不僅包含view數據,而且還包含與這些數據相關(guān)的行為,而在struts中,Action和ActionForm分別包含數據和邏輯。

我們都應該聽(tīng)說(shuō)過(guò)domain object model,那么,domain object model和view對象之間有什么區別呢?在一個(gè)簡(jiǎn)單的Web應用中,一個(gè)domain object model能夠橫穿所有層中,而在復雜的應用中,需要用到一個(gè)單獨的view對象模型。domain object model應該屬于業(yè)務(wù)邏輯層,它包含業(yè)務(wù)數據和與特定業(yè)務(wù)對象相關(guān)的業(yè)務(wù)邏輯;一個(gè)view對象包含presentation-specific的數據和邏輯。將view對象從domain object model中分離出來(lái)的缺點(diǎn)是在這兩個(gè)對象模型之間必將出現數據映射。在JCatalog中,ProductBeanBuilder和 UserBeanBuilder利用reflection-based Commons BeanUtils來(lái)實(shí)現數據映射。

安全
目前,JSF沒(méi)有內建的安全特性,而對于范例應用來(lái)說(shuō)安全需求是非?;A的:用戶(hù)登錄到administration intranet中僅需用戶(hù)名和密碼認證,而無(wú)需考慮授權。
針對于JSF的認證,已有幾種方法提出:
  • 利用一個(gè)backing bean:這一個(gè)方法非常簡(jiǎn)單,然而它卻將backing bean與特殊的繼承關(guān)系結合起來(lái)了
  • 利用JSF的ViewHandler decorator:這一方法中,安全邏輯緊密地與一特定Web層技術(shù)聯(lián)系在了一起
  • 利用servlet filter:一個(gè)JSF應用與其他的Web應用沒(méi)有什么兩樣,filter仍是處理認證檢查的最好地方,這種方法中,認證邏輯與Web應用分離開(kāi)來(lái)
在我們的范例程序中,SecurityFilter類(lèi)被用來(lái)處理用戶(hù)的認證,目前,受保護的資源只包含三個(gè)頁(yè)面,出于簡(jiǎn)單的考慮,將它們的位置被硬編碼到Filter類(lèi)中。

分頁(yè)
該應用中的Catalog頁(yè)面需要分頁(yè),表示層可用來(lái)處理分頁(yè),即它取出所有的數據并保存在這一層;分頁(yè)同樣可在business-logic層、 integration層、甚至EIS層中實(shí)現。由于在JCatalog中假設不超過(guò)500個(gè)產(chǎn)品,因此所有的產(chǎn)品信息能存放在一個(gè)user session中,我們將分頁(yè)邏輯放在了ProductListBean中,與分頁(yè)相關(guān)的參數將通過(guò)JSF managed-bean工具配置。

Caching
Caching是提高Web應用性能的最重要技術(shù)之一,在應用構建中的很多層中都可以實(shí)現caching。JSF managed-bean工具可以使在表示層實(shí)現caching非常容易。通過(guò)改變一個(gè)managed bean的范圍,這個(gè)managed bean中包含的數據可以在不同的范圍內緩存。

范例應用中采用了兩級caching,第一級caching存在于業(yè)務(wù)邏輯層,CachedCatalogServiceImpl類(lèi)維護了一個(gè)所有產(chǎn)品和目錄的讀寫(xiě)cache,Spring將該類(lèi)作為一個(gè)singleton service bean來(lái)管理,所以,一級cache是一個(gè)應用范圍的讀寫(xiě)cache。

為了簡(jiǎn)化分頁(yè)邏輯并進(jìn)而提高應用的速度,產(chǎn)品同樣在session范圍內緩存到表示層,每一個(gè)用戶(hù)維護著(zhù)他自己的ProductListBean,這一方法的缺點(diǎn)是內存的消耗和數據的失效問(wèn)題,在一個(gè)用戶(hù)session中,如果管理員更改了catalog,用戶(hù)可到的將是失效的數據,然而,由于我們假設應用的數據不會(huì )經(jīng)常的改變,所以這些缺點(diǎn)將能夠忍受。

File upload
目前的JSF Sun參考實(shí)現中不支持file upload。Struts雖已具有非常不錯的file upload能力,然而要想使用這一特性需要Struts-Faces整合庫。在JCatalog中,一個(gè)圖像與一個(gè)產(chǎn)品相關(guān)聯(lián),在一個(gè)用戶(hù)創(chuàng )建了新的產(chǎn)品后,她必須將相應的圖片上傳,圖片將保存在應用服務(wù)器的文件系統里,產(chǎn)品的ID就是圖像名稱(chēng)。

范例應用中采用、Servlet和Jakarta Common的file-upload API來(lái)實(shí)現簡(jiǎn)單的文件上傳功能,該方法包含兩個(gè)參數:圖像路徑和圖像上傳結果頁(yè)面。它們將通過(guò)ApplicationBean來(lái)配置,詳細內容請參看 FileUploadServlet類(lèi)。

Validation
JSF中發(fā)布的標準validator是非?;A的,無(wú)法滿(mǎn)足現實(shí)的需要,但很容易開(kāi)發(fā)出自己的JSF validator,在范例中,我開(kāi)發(fā)了SelectedItemsRange validator,它用來(lái)驗證UISelectMany組件中選擇的數量:

 
    
    
 


詳細情況請參看范例。

定制錯誤信息
在JSF中,你可以為converters和validators創(chuàng )建resource bundle和定制錯誤信息,一個(gè)resource bundle可在faces-config.xml中創(chuàng )建:

  catalog.view.bundle.Messages

并將錯誤信息的key-value對加到Message.properties文件中:

  javax.faces.component.UIInput.CONVERSION=Input data is not in the correct type.
  javax.faces.component.UIInput.REQUIRED=Required value is missing.

業(yè)務(wù)邏輯層和Spring Framework
業(yè)務(wù)對象和業(yè)務(wù)服務(wù)存在于業(yè)務(wù)邏輯層中,一個(gè)業(yè)務(wù)對象不僅包含數據,而且包含相應的邏輯,在范例應用中包含三個(gè)業(yè)務(wù)對象:Product、Category和User。

業(yè)務(wù)服務(wù)與業(yè)務(wù)對象交互并提供更高級的業(yè)務(wù)邏輯,需要首先定義一個(gè)正式的業(yè)務(wù)接口,它是直接與終端用戶(hù)交互的服務(wù)接口。在JCatalog中,通過(guò)在 Spring Framework幫助下的POJO實(shí)現業(yè)務(wù)邏輯層,其中共有兩個(gè)業(yè)務(wù)服務(wù):CatalogService包含Catalog管理相關(guān)的業(yè)務(wù)邏輯, UserService中包含User管理邏輯。

Spring是基于IoC概念的框架,在范例應用中用到的Spring特性包括:
  • Bean management with application contexts:Spring可以有效地組織我們的中間層對象,它能夠消除singleton的proliferation,并易于實(shí)現良好的面向對象編程方法,即“編程到接口”。
  • Declarative Transaction management: Spring利用AOP實(shí)現事務(wù)管理,而無(wú)需借助于EJB容器,利用這種方法,事務(wù)管理可以用于任何POJO中。Spring的事務(wù)管理不局限于JTA,而是可以采用不同的事務(wù)策略,在范例應用中,我們將使用declarative transaction management with Hibernate transaction。
  • Data-access exception hierarchy:Spring提供了非常好的異常來(lái)代替SQLException,為利用Spring的異常,必須在Spring的配置文件中定義以下異常轉換:
       
         
             
         

       


        在范例應用中,如果一個(gè)具有重復ID的新產(chǎn)品被插入,將會(huì )拋出DataIntegrityViolationException,這一異常將被
        catch并rethrown一個(gè)DuplicateProductIdException。這樣,該異常就可以與其它的異常區別處理。
  • Hibernate integration:Spring與Hibernate這樣的ORM框架整合的非常好,Spring提供了對Hibernate session的高效和安全的處理,它可通過(guò)application context配置Hibernate的SessionFactories和JDBC數據源,并使得應用易于測試。

Integration層和Hibernate
Hibernate是一個(gè)開(kāi)源的ORM框架,它可以支持所有主流SQL數據庫系統,Hibernate的查詢(xún)語(yǔ)言為對象和關(guān)系架起了非常好的橋梁。Hibernate提供了強大的功能以實(shí)現:數據讀取和更新、事務(wù)管理、數據連接池、查詢(xún)和實(shí)體關(guān)系管理等。

Data Access Ojbect(DAO)
JCatalog中采用了Dao模式,該模式抽象和封裝了所有對數據源的訪(fǎng)問(wèn),該應用中包括兩個(gè)DAO接口:CatalogDao和UserDao,它們相應的實(shí)現HibernateCatalogDaoImpl和HibernateUserDAoImpl包含了Hibernate特定的邏輯來(lái)實(shí)現數據的管理和持久化。

實(shí)現
現在我們來(lái)看看如何將上面討論的這些東西包裝在一起以實(shí)現JCatalog,你可以從這個(gè)地址下載源碼:source code

數據庫設計
我們?yōu)樵摲独龖脛?chuàng )建了包含4個(gè)表的數據庫,如圖5所示:


類(lèi)設計
圖6顯示了JCatalog的類(lèi)圖


“編程到接口”的思想貫穿了整個(gè)設計實(shí)現中,在表示層,共用到四個(gè)backing bean:ProductBean、ProductListBean、UserBean和MessageBean;業(yè)務(wù)邏輯層包含兩個(gè)業(yè)務(wù)服務(wù) (CatalogService和UserService)和三個(gè)業(yè)務(wù)對象(Product、Category和User);Integration層有兩個(gè)Dao接口和它們相應的Hibernate實(shí)現,Spring的application context用來(lái)管理絕大多數的業(yè)務(wù)邏輯層和integration層的對象;ServiceLocator將JSF和業(yè)務(wù)邏輯層整合在了一起。

Wire everything up
由于篇幅所限,我們僅舉例說(shuō)明,范例中use case CreateProduct展示了如何裝配和構建應用,在詳細講述細節前,我們利用sequence圖(圖7)來(lái)說(shuō)明所有層的end-tp-end整合。



表示層
表示層實(shí)現包括創(chuàng )建JSP頁(yè)面、定義頁(yè)導航、創(chuàng )建和配置backing bean以及將JSF與業(yè)務(wù)邏輯層整合。
  • JSP page:createProduct.jsp是用來(lái)創(chuàng )建新產(chǎn)品的頁(yè)面,它包含UI組件并將組件打包成ProductBean,ValidateItemsRange標簽用來(lái)驗證用戶(hù)選擇的種類(lèi)數量,對每一個(gè)產(chǎn)品至少要有一個(gè)種類(lèi)被選中。
  • 頁(yè)面導航:應用中的導航被定義在應用的配置文件faces-navigation.xml中,CreateProduct的導航準則如下:

   *
  
      createProduct
      /createProduct.jsp
  


   /createProduct.jsp
  
      success
      /uploadImage.jsp
  
  
      retry
      /createProduct.jsp
  
  
      cancel
      /productList.jsp
  

  • Backing bean:ProductBean不僅包含有將數據映射到頁(yè)面上的UI組件的屬性,還包括三個(gè)action:createAction、editAction和deleteAction,下面是createAction方法的代碼:
public String createAction() {
   try {
      Product product = ProductBeanBuilder.createProduct(this);

      //Save the product.
      this.serviceLocator.getCatalogService().saveProduct(product);

      //Store the current product id inside the session bean.
      //For the use of image uploader.
      FacesUtils.getSessionBean().setCurrentProductId(this.id);

      //Remove the productList inside the cache.
      this.logger.debug("remove ProductListBean from cache");
      FacesUtils.resetManagedBean(BeanNames.PRODUCT_LIST_BEAN);
   } catch (DuplicateProductIdException de) {
      String msg = "Product id already exists";
      this.logger.info(msg);
      FacesUtils.addErrorMessage(msg);

      return NavigationResults.RETRY;
   } catch (Exception e) {
      String msg = "Could not save product";
      this.logger.error(msg, e);
      FacesUtils.addErrorMessage(msg + ": Internal Error");

      return NavigationResults.FAILURE;
   }
   String msg = "Product with id of " + this.id + " was created successfully.";
   this.logger.debug(msg);
   FacesUtils.addInfoMessage(msg);

   return NavigationResults.SUCCESS;
}
  • Managed-bean聲明:ProductBean必須在JSF配置文件faces-managed-bean.xml中配置:

  
      Backing bean that contains product information.
  
   productBean
   catalog.view.bean.ProductBean
   request   
  
      id
      #{param.productId}
  
  
      serviceLocator
      #{serviceLocatorBean}
  

  •  表示層和業(yè)務(wù)邏輯層之間的整合: ServiceLocator抽象了查找服務(wù)的邏輯,在范例應用中,ServiceLocator被定義為一個(gè)接口,該接口實(shí)現為一個(gè)JSF的 managed bean,即ServiceLocatorBean,它將在Spring的application context中尋找服務(wù):
ServletContext context = FacesUtils.getServletContext();
this.appContext = WebApplicationContextUtils.getRequiredWebApplicationContext(context);
this.catalogService = (CatalogService)this.lookupService(CATALOG_SERVICE_BEAN_NAME);
this.userService = (UserService)this.lookupService(USER_SERVICE_BEAN_NAME);
業(yè)務(wù)邏輯層
  • 業(yè)務(wù)對象:由于采用Hibernate提供持久化,因此Product和Category兩個(gè)業(yè)務(wù)對象需要為它們的所有field提供getter和setter。
  • 業(yè)務(wù)服務(wù):CatalogService接口中定義了所有的與Catalog management相關(guān)的服務(wù):
public interface CatalogService {
   public Product saveProduct(Product product) throws CatalogException;
   public void updateProduct(Product product) throws CatalogException;
   public void deleteProduct(Product product) throws CatalogException;
   public Product getProduct(String productId) throws CatalogException;
   public Category getCategory(String categoryId) throws CatalogException;
   public List getAllProducts() throws CatalogException;
   public List getAllCategories() throws CatalogException;
}
  • Spring Configuration:這里是CatalogService的Spring配置:


  




  




  
  
  
     
         PROPAGATION_REQUIRED,readOnly
       PROPAGATION_REQUIRED
       PROPAGATION_REQUIRED
       PROPAGATION_REQUIRED
     
  

  • Spring和Hibernate的整合:下面是HibernateSessionFactory的配置:

<!-- Hibernate SessionFactory Definition -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
   <property name="mappingResources">
      <list>
         <value>catalog/model/businessobject/Product.hbm.xml</value>
         <value>catalog/model/businessobject/Category.hbm.xml</value>
         <value>catalog/model/businessobject/User.hbm.xml</value>
      </list>
   </property>
   <property name="hibernateProperties">
      <props>
         <prop key="hibernate.dialect">net.sf.hibernate.dialect.MySQLDialect</prop>
       <prop key="hibernate.show_sql">true</prop>
       <prop key="hibernate.cglib.use_reflection_optimizer">true</prop>
       <prop key="hibernate.cache.provider_class">net.sf.hibernate.cache.HashtableCacheProvider</prop>
      </props>
   </property>
   <property name="dataSource">
      <ref bean="dataSource"/>
   </property>
</bean>

CatalogDao uses HibernateTemplate to integrate between Hibernate and Spring. Here‘s the configuration for HibernateTemplate:

<!-- Hibernate Template Defintion -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate.HibernateTemplate">
   <property name="sessionFactory"><ref bean="sessionFactory"/></property>
   <property name="jdbcExceptionTranslator"><ref bean="jdbcExceptionTranslator"/></property>
</bean>



Integration層
Hibernate通過(guò)xml配置文件來(lái)映射業(yè)務(wù)對象和關(guān)系數據庫,在JCatalog中,Product.hbm.xml表示了Product對象的映射,Category.hbm.xml則用來(lái)表示Category的映射,Product.hbm.xml如下:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
      "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
      "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping package="catalog.model.businessobject">
   <class name="Product" table="product">
      <id name="id" column="ID" unsaved-value="null">
         <generator class="assigned"/>
      </id>
      <property name="name" column="NAME" unique="true" not-null="true"/>
      <property name="price" column="PRICE"/>    
      <property name="width" column="WIDTH"/>      
      <property name="height" column="height"/>      
      <property name="description" column="description"/>   
      <set name="categoryIds" table="product_category" cascade="all">
         <key column="PRODUCT_ID"/>
         <element column="CATEGORY_ID" type="string"/>
      </set>
   </class>
</hibernate-mapping>

CatalogDao is wired with HibernateTemplate by Spring:

<!-- Catalog DAO Definition: Hibernate implementation -->
<bean id="catalogDao" class="catalog.model.dao.hibernate.CatalogDaoHibernateImpl">
   <property name="hibernateTemplate"><ref bean="hibernateTemplate"/></property>
</bean>

結論
本文主要講述了如何將JSF與Spring、Hibernate整合在一起來(lái)構建實(shí)際的Web應用,這三種技術(shù)的組合提供了一個(gè)強大的Web應用開(kāi)發(fā)框架。在Web應用的高層設計中應該采用多層構架體系,JSF非常適合MVC設計模式以實(shí)現表示層,Spring可用在業(yè)務(wù)邏輯層中管理業(yè)務(wù)對象,并提供事物管理和資源管理等,Spring與Hibernate結合的非常出色,Hibernate是強大的O/R映射框架,它可以在integration層中提供最好的服務(wù)。

通過(guò)將整個(gè)Web應用分割成多層,并借助于“編程到接口”,應用程序的每一層所采用的技術(shù)都是可替換的,例如Struts可以用來(lái)替換JSF,JDO可替換Hibernate。各層之間的整合不是不值得研究,采用IoC和ServiceLocator設計模式可使得整合非常容易。JSF提供了其它Web框架欠缺的功能,然而,這并不意味著(zhù)你馬上拋棄Struts而開(kāi)始使用JSF,是否采用JSF取決于項目目前的狀況和功能需求,以及開(kāi)發(fā)團隊的意見(jiàn)等。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
JSF+Spring+Hibernate的實(shí)例講解
利用JSF、SpringFramework和Hibernate構建Web應用的實(shí)例講述(3)
一篇SSH框架的應用介紹
使用Spring框架的好處(轉帖)
Spring3整合Hibernate3
JBoss Seam 入門(mén)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久