WADER

          java,swt,hibernate,struts,xml,spring,ant,cvs,uml,db,server
          隨筆 - 15, 文章 - 0, 評(píng)論 - 0, 引用 - 0
          數(shù)據(jù)加載中……

          2007年9月24日

          在LDAP中使用角色(Role)和組(Group)來管理用戶

          LDAP(輕量級(jí)目錄服務(wù)器)越來越被廣泛的使用,特別是在管理海量用戶信息和管理身份認(rèn)證信息的時(shí)候,LDAP被國(guó)內(nèi)大多數(shù)企業(yè)所使用,從中國(guó)電信,中國(guó)移動(dòng),新浪,和許多省市政府部門都使用LDAP來管理用戶身份的信息。下面重點(diǎn)介紹在LDAP中管理用戶的一些概念和技巧。

          LDAP服務(wù)器使用樹狀結(jié)構(gòu)來存儲(chǔ)和查找用戶的信息。這種樹狀結(jié)構(gòu)比較適合用戶身份信息的存儲(chǔ),因?yàn)闊o論在社會(huì)還是在企業(yè)中,對(duì)人的管理是分層的。從地域上的國(guó)家、省市到區(qū)域,從企業(yè)的大部門到小部門,從總經(jīng)理到小職員,所有的管理都是分層的。“人類的層次劃分是社會(huì)活動(dòng)的自然產(chǎn)物”,忘了這句話是誰說的了,但是我們觀察自己的周圍環(huán)境,樹狀結(jié)構(gòu)的分層無處不在,這也是LDAP為什么在人員管理上這么流行的原因,也是LDAP最初設(shè)計(jì)的需求。當(dāng)然,在這里我們不討論人類社會(huì)活動(dòng)現(xiàn)象,只討論LDAP技術(shù)問題。

          LDAP在存儲(chǔ)樹狀結(jié)構(gòu)的數(shù)據(jù)比關(guān)系型數(shù)據(jù)庫(kù)有很大的優(yōu)勢(shì)。請(qǐng)?jiān)噲D想想在關(guān)系數(shù)據(jù)庫(kù)中要實(shí)現(xiàn)這種樹狀的數(shù)據(jù),需要費(fèi)一番功夫,并且要定位層次比較深的節(jié)點(diǎn)的數(shù)據(jù)需要經(jīng)過復(fù)雜的查詢和轉(zhuǎn)換。但是LDAP這種樹狀的結(jié)構(gòu)也有一個(gè)重要的缺點(diǎn),就是很難反映出除了結(jié)構(gòu)層次之外的其他關(guān)系(例如在同一個(gè)組織之下的管理和被管理的關(guān)系),而且當(dāng)組織結(jié)構(gòu)經(jīng)常發(fā)生變化的情況下,樹狀結(jié)構(gòu)很難滿足這種靈活性的要求。有樹狀結(jié)構(gòu)特點(diǎn)決定,當(dāng)一個(gè)組織變化的時(shí)候,這個(gè)組織下的所有節(jié)點(diǎn)都需要一一變化。

          因此,在LDAP中出現(xiàn)了Group(組)和Role(角色)來動(dòng)態(tài)的管理節(jié)點(diǎn)之間的關(guān)系。例如,建立一個(gè)“管理員”的組或角色,然后可以將不同組織結(jié)構(gòu)下的人員放到“管理員”這個(gè)邏輯結(jié)構(gòu)下。那么通過“管理員”這個(gè)虛擬的組織結(jié)構(gòu)可以將不同物理組織下的人員動(dòng)態(tài)的組合在一起。例如給“管理員”賦予特殊的權(quán)力,使他們能夠修改本機(jī)構(gòu)中的人員信息。過了一段時(shí)間,如果需要將“管理員”這個(gè)邏輯組織取消或者改動(dòng),只需要在LDAP的單個(gè)節(jié)點(diǎn)上操作,而實(shí)際“管理員”邏輯結(jié)構(gòu)的成員們,不需要作任何的變化,原來是在哪個(gè)物理組織,現(xiàn)在也不用變化。這種Group(組)和Role(角色)的出現(xiàn)是增加了節(jié)點(diǎn)之間的關(guān)聯(lián)程度。

          Group(組)和Role(角色)的功能基本相同,操作起來也很類似。那么Group(組)和Role(角色)到底有什么區(qū)別呢?事實(shí)上,由于實(shí)現(xiàn)方法不同,Group(組)和Role(角色)在某些操作上體現(xiàn)出不同的性能。

          Group(組)的實(shí)現(xiàn)機(jī)制很簡(jiǎn)單,每個(gè)Group本身就是LDAP的一個(gè)實(shí)體。這個(gè)實(shí)體有個(gè)member的屬性。每次將一個(gè)成員添加到這個(gè)Group中就會(huì)在Member屬性中添加一條記錄(成員的DN)。如果這個(gè)Group有200個(gè)成員,那么它的member屬性中會(huì)有200條記錄。這種實(shí)現(xiàn)方式非常適合下面的操作:1. 列舉當(dāng)前Group下的所有成員。2.將一些成員從當(dāng)前的Group中刪除或添加。因?yàn)樗械某蓡T都記錄在Group實(shí)體的屬性里;這種實(shí)現(xiàn)方式非常不適合下面的操作:查找某個(gè)用戶所屬的所有Group。這個(gè)操作可能要去每個(gè)Group中查找信息。

          Role(角色)的實(shí)現(xiàn)機(jī)制就比較復(fù)雜了。其實(shí)每個(gè)LDAP實(shí)體本身都有一個(gè)“nsrole”的屬性。如果某個(gè)角色賦予這個(gè)用戶的話,就會(huì)在這個(gè)用戶的“nsrole”(其實(shí)是nsroleDN,這個(gè)會(huì)在以后解釋)的屬性中添加一個(gè)角色的記錄。如果當(dāng)前用戶有10個(gè)角色(例如,他又是領(lǐng)導(dǎo),又是員工,又是管理員,又是教授....),那么在這個(gè)用戶的"nsrole"屬性中會(huì)有10條記錄(Role的DN)。這種實(shí)現(xiàn)方式非常適合下面的操作: 列舉當(dāng)前用戶擁有的所有的角色,因?yàn)樵谟脩舻?#8220;nsrole”屬性中記錄了所有的角色。因此給一個(gè)用戶授權(quán)通常使用角色,這是因?yàn)閺挠脩粜畔⒅芯湍芎芸飓@得當(dāng)前用戶所有的角色,以及相關(guān)的權(quán)限。

          另外還有一些準(zhǔn)則來幫助判斷在設(shè)計(jì)時(shí)到底使用Group還是Role。

          1 使用Group會(huì)很容易將用戶從一系列“邏輯組織”中刪除或添加。只要是Group的創(chuàng)建者,就有權(quán)限修改Group中的member屬性。而角色(Role)的信息存在每個(gè)用戶的“nsroleDN”中,需要特定的權(quán)限才能修改這個(gè)屬性。

          2 如果要使用分布式部署(例如使用Chaining的方式),要考慮到角色(Role)是無法跨越服務(wù)器的界限

          3 如果成員數(shù)量巨大(超過20000)個(gè),可以使用動(dòng)態(tài)組的概念(FilterGroup),這個(gè)以后再將。

          posted @ 2007-09-24 11:32 wader 閱讀(5684) | 評(píng)論 (0)編輯 收藏

          2007年9月9日

          Lucene in Action(中文版)

               摘要: Lucene in Action 中文版  第一部分 Lucene核心 1.      接觸Lucene  2.      索引 3.      為程序添加搜索 4.    ...  閱讀全文

          posted @ 2007-09-09 11:45 wader 閱讀(1910) | 評(píng)論 (0)編輯 收藏

          2006年6月12日

          UI項(xiàng)目的團(tuán)隊(duì)組合(來自微軟的借鑒)

          UI項(xiàng)目的團(tuán)隊(duì)組合(來自微軟的借鑒)


          2006.06.11????

          來源:ChinaUI

          UI設(shè)計(jì)人員是對(duì)產(chǎn)品的使用界面進(jìn)行設(shè)計(jì)和訂正的人員。 Usability Engineer是檢驗(yàn)UI設(shè)計(jì)的合理性的人員。

          在很多團(tuán)隊(duì),真正的界面設(shè)計(jì)都是由PM做完了Spec,才找UI設(shè)計(jì)人員來征求意見。像我們團(tuán)隊(duì),我的設(shè)計(jì)規(guī)范書寫完后,我才找UI設(shè)計(jì)人員來,他們所做的也就不過是對(duì)我的設(shè)計(jì)作小改動(dòng),如那些英語(yǔ)詞句用得不妥,哪里的按鈕該改變大小,等等。我所知道的其它視窗操作系統(tǒng)的團(tuán)隊(duì),也是差不多。這主要是因?yàn)槲覀兡茏约哼M(jìn)行界面設(shè)計(jì)——視窗操作系統(tǒng)部門的PM是微軟PM中最厲害的。可是,這是不太正確的方法,因?yàn)槿绻阌泻軓?qiáng)的PM,你可用這種方法,要是你的 PM的設(shè)計(jì)能力不強(qiáng),這樣的流程就要出問題。你的項(xiàng)目的成功不應(yīng)該寄托在幾個(gè)強(qiáng)有力的PM上,而是要用完善的流程來保證。好的流程應(yīng)該是,在產(chǎn)品開發(fā)的早期,在做設(shè)計(jì)時(shí),PM就應(yīng)該和UI設(shè)計(jì)人員一起來考慮產(chǎn)品設(shè)計(jì)的合理性。

          這個(gè)問題在微軟內(nèi)部我們自己也有很大的爭(zhēng)論。 UI設(shè)計(jì)人員就常常抱怨,在產(chǎn)品開發(fā)的早期,他們常常不被看重,被拋在一邊。UI設(shè)計(jì)的領(lǐng)導(dǎo)人甚至在全公司的培訓(xùn)大會(huì)上講,我們的這個(gè)文化有問題,領(lǐng)導(dǎo)對(duì) UI設(shè)計(jì)人員在產(chǎn)品開發(fā)早期能起的作用不夠重視。可是這個(gè)爭(zhēng)論已有幾年了,結(jié)果仍無改變。我想這主要還是跟我們這個(gè)行業(yè)的產(chǎn)品開發(fā)的特性有關(guān)系。因?yàn)檐浖_發(fā)是很技術(shù)性的,常常在早期的技術(shù)討論中,UI設(shè)計(jì)人員對(duì)技術(shù)討論說不出個(gè)所以然來(因?yàn)樗麄兇蠖嗍菍W(xué)藝術(shù)設(shè)計(jì)的),漸漸地各開發(fā)團(tuán)隊(duì)對(duì)UI設(shè)計(jì)人員的作用就看輕了。在使用界面因素占很大比例的產(chǎn)品團(tuán)隊(duì),像 Office 和 MSN ,這種情況要好一些。

          Usability Engineer 所做的事和UI設(shè)計(jì)人員不同。他們是將UI設(shè)計(jì)的模型版,找客戶來進(jìn)行實(shí)用和使用性能的檢驗(yàn)調(diào)查和測(cè)試,并根據(jù)調(diào)查結(jié)果對(duì)UI設(shè)計(jì)提出進(jìn)行修改的意見。也就是說,他們的工作是檢驗(yàn)UI設(shè)計(jì)的合理性,有點(diǎn)像測(cè)試人員對(duì)程序進(jìn)行檢驗(yàn)的功能。可以說,Usability Engineer 和UI設(shè)計(jì)人員的關(guān)系像測(cè)試人員與開發(fā)編程人員的關(guān)系。

          User Education team 是編寫使用說明書的編輯人員。

          從大方面的來說,微軟的產(chǎn)品組是公司的幾大部門之一,其他還有市場(chǎng)/銷售部門,服務(wù)部門,運(yùn)作部門,還有研究院什么的。

          合理的開發(fā)團(tuán)隊(duì)組合應(yīng)該是什么? 允許我拋磚引玉,先談一下微軟的經(jīng)驗(yàn):

          項(xiàng)目經(jīng)理團(tuán)隊(duì):(Program Management Team)
          ? 設(shè)計(jì)項(xiàng)目經(jīng)理(Feature Design PM):負(fù)責(zé)具體的產(chǎn)品設(shè)計(jì),寫Design Spec,PM 隊(duì)伍中,80%的PM是做這個(gè)。
          ? 發(fā)行項(xiàng)目經(jīng)理 (Release PM):負(fù)責(zé)整個(gè)項(xiàng)目的流程和進(jìn)度管理,制定進(jìn)度表等,協(xié)調(diào)整個(gè)團(tuán)隊(duì)的工作。大的PM 隊(duì)伍中有一人專門做這個(gè)。這是整個(gè)項(xiàng)目的領(lǐng)頭人。大型的項(xiàng)目的成功與否,常常靠得力的發(fā)行經(jīng)理的領(lǐng)導(dǎo)。
          ? 協(xié)助項(xiàng)目經(jīng)理(Supporting PM):負(fù)責(zé)其它產(chǎn)品發(fā)行需要照顧到的事情,如客戶交流、和市場(chǎng)開發(fā)人員交流、負(fù)責(zé)beta program(初版試行)等等。大的PM 隊(duì)伍中少不了這樣的人。20%的PM是做這個(gè)。

          開發(fā)團(tuán)隊(duì):(Development Team)
          ? 開發(fā)團(tuán)隊(duì)領(lǐng)導(dǎo)(Development Manager): 負(fù)責(zé)管理各個(gè)開發(fā)小組,并對(duì)開發(fā)編程的工作做總體的規(guī)劃。
          ? 開發(fā)組長(zhǎng)(Development Lead): 負(fù)責(zé)管理開發(fā)工程師,也參加對(duì)開發(fā)編程的工作做總體的規(guī)劃。
          ? 開發(fā)工程師(Develop Engineer,or Developer):負(fù)責(zé)具體的編程開發(fā)。
          ? 構(gòu)架師(Architect): 大的產(chǎn)品團(tuán)隊(duì)有一兩個(gè)資深工程師專門做整體系統(tǒng)的設(shè)計(jì)規(guī)劃。

          測(cè)試團(tuán)隊(duì):(Quality Assurance or Test Team)
          ? 測(cè)試團(tuán)隊(duì)領(lǐng)導(dǎo)(QA Manager): 負(fù)責(zé)管理測(cè)試小組。
          ? 測(cè)試組長(zhǎng)(Test Lead): 負(fù)責(zé)管理測(cè)試工程師,制定測(cè)試計(jì)劃等。
          ? 測(cè)試工程師(Tester or Test Engineer):負(fù)責(zé)具體的測(cè)試工作。
          ? 測(cè)試開發(fā)工程師(Developer in Test,or STED): 負(fù)責(zé)測(cè)試工具的開發(fā)。

          產(chǎn)品可用性團(tuán)隊(duì):(Usability Team)
          ? 產(chǎn)品可用性工程師(Usability Engineer): 做使用性能的調(diào)查和測(cè)試,采訪客戶或?qū)⒖蛻粞?qǐng)來做調(diào)查。
          ? 界面設(shè)計(jì)師(UI Designer): 負(fù)責(zé)具體的界面設(shè)計(jì)。
          ? 產(chǎn)品設(shè)計(jì)師 (Product Designer): 負(fù)責(zé)產(chǎn)品的總體設(shè)計(jì),特別是硬件產(chǎn)品。

          客戶教育或文檔團(tuán)隊(duì):(User Education,or UE Team)
          ? 文檔組長(zhǎng)(UE Lead):負(fù)責(zé)管理文檔小組。
          ? 文檔編輯(UE Editor):負(fù)責(zé)具體的文檔編輯和撰寫。

          以上只是一個(gè)大約的組合模式。不同的團(tuán)隊(duì)有各自的側(cè)重點(diǎn)和變化。在很大程度上這些也受到具體的產(chǎn)品的影響。我想我在微軟的產(chǎn)品部門的其他同事們會(huì)再做補(bǔ)充。希望這些信息能對(duì)國(guó)內(nèi)的軟件開發(fā)公司能有參考價(jià)值。我們希望通過這樣的交流,我們能為中國(guó)軟件開發(fā)事業(yè)的進(jìn)一步發(fā)展盡我們的一點(diǎn)微薄之力。

          posted @ 2006-06-12 09:47 wader 閱讀(290) | 評(píng)論 (0)編輯 收藏

          2005年11月23日

          weblogic配置 (posted on 2005-01-13 16:21 )

          WEBLOGIC是一個(gè)性能卓越的J2EE服務(wù)器,在我國(guó)的使用者在快速增長(zhǎng)。但現(xiàn)在有關(guān)它的中文資料基本沒有,更沒有介紹使用經(jīng)驗(yàn)方面的。下面是本人在學(xué)習(xí)使用WEBLOGIC6.0中得到的一些經(jīng)驗(yàn),寫出來與大家分享。 
          一、WEBLOGIC6.0的安裝 
          WEBLOGIC6.0自帶了JDK1.3,所以不用預(yù)先安裝JDK就可以直接安裝它,在WIN2000平臺(tái)是一個(gè)EXE文件,直接運(yùn)行它即可;在UNIX平臺(tái)上的安裝包是一個(gè)*.bin文件,用sh運(yùn)行它就可以了,最好是加 -i console的控制臺(tái)選項(xiàng)(如果不加,可能會(huì)報(bào)CLASSNOFOUND等錯(cuò)誤)如下所示: 
          sh weblogic60_sol.bin -i console的控制臺(tái) 
          注意: 
          1、UNIX系統(tǒng)的TMP目錄(環(huán)境變量TMPDIR或TMP_DIR所指的路徑)應(yīng)有足夠的空間,因?yàn)閃EBLOGIC6.0安裝時(shí)先解壓文件到系統(tǒng)的TMP目錄下,然后再進(jìn)行安裝。如果TMP目錄空間不夠安裝會(huì)出錯(cuò),這時(shí)你可以把TMPDIR設(shè)到要足夠空間的目錄下。 
          2、如果用普通用戶安裝出錯(cuò),可試著用ROOT用戶安裝。一般是環(huán)境變量及權(quán)限的問題。 
          3、安裝軟件可到
          http://commerce.bea.com/downloads/products.jsp下載,聯(lián)機(jī)文檔可到http://edocs.bea.com/wls/docs61/index.html下載。 

          二、與ORACLE數(shù)據(jù)庫(kù)的連接 
          WEBLOGIC6.0通過ORACLE客戶端訪問ORACLE,所以在WEBLOGIC6.0所在的機(jī)器上要正確安裝ORACLE客戶端才行。WEBLOGIC6.0對(duì)ORACLE提供TYPE2的JDBC DRIVER支持,是一些動(dòng)態(tài)連接庫(kù)(NT 是.DLL,UNIX是.SO)文件,在$WL_HOME\bin下,以O(shè)CI開頭的幾個(gè)目錄中。具體采用哪個(gè)目錄下庫(kù)文件,與ORACLE SERVER端及CLIENT端的版本及ORACLE API的版本有關(guān),可參考WEBLOGIC6.0的聯(lián)機(jī)文檔。要把這些庫(kù)所在的路徑加到系統(tǒng)的環(huán)境變量中,否則訪問數(shù)據(jù)庫(kù)時(shí),WEBLOGIC6.0會(huì)報(bào)以下錯(cuò)誤: 
          Java.sql.SQLException: System.loadLibrary threw java.lang.UnsatisfiedLinkError 
          with the message 'no WEBLOGICoci37 in java.library.path'..... 
          在WIN2000中要加到PATH環(huán)境變量中,如: 
          set PATH= D:\WEBLOGIC6.0\wlserver6.0\bin\oci816_7;c:\ORANT816\bin;%PATH% 
          在NIX平臺(tái),要到系統(tǒng)的LIBRARY PATH中,如在SUN上,要加到LD_LIBRARY_PATH環(huán)境變量中,方法如下: 
          export LD_LIBRARY_PATH=/bea/weblogic6.0/oci816_8:$ORACLE_HOME/lib 
          在HP平臺(tái)上,要加到SHLIB_PATH環(huán)境變量中,如: 
          export SHLIB_PATH=/bea/ weblogic6.0/lib/hpux11/oci816_8:$ORACLE_HOME/lib 

          三、在WEBLOGIC6.0中設(shè)置資源的訪問權(quán)限 
          WEBLOGIC6.0幾乎可以對(duì)它所管理的所有資源設(shè)置訪問控制表,包括EJB、JSP、SERVLET、POOL、JMS、RMI、JNDI、JDBC等等。當(dāng)用戶第一次訪問設(shè)置了訪問控制表的資源時(shí),WEBLOGIC6.0會(huì)彈出一個(gè)對(duì)話框要求輸入口令及密碼,如果連輸3次都不對(duì),會(huì)返回以下錯(cuò)誤: 
          Error 401--Unauthorized xxx 
          From RFC 2068 Hypertext Transfer Protocol -- HTTP/1.1: 
          10.4.2 401 Unauthorized 

          對(duì)訪問權(quán)限的設(shè)置有兩種方式: 
          1、 在WEBLOGIC6.O的控制臺(tái)中設(shè)置,把結(jié)果保存到fileRealm.properties中,即采用WEBLOGIC6.0的file realm.感覺對(duì)DATABASE POOL,EJB等比較好用,對(duì)JSP,SERVER及某個(gè)目錄設(shè)置訪問控制表比較難。我試了很多次都沒成功。它可對(duì)WEB用戶(通過瀏覽器訪問)和普通用戶(通過JAVA客戶端等訪問)起作用。 
          2、在WEB.XML,WEBLOGIC.XML中設(shè)置,只能對(duì)WEB用戶起作用。下面舉個(gè)例子說明這種方式。 
          如:在一個(gè)名為OrderWebApp的WEB APPLICATION中,客戶的定單文件都放到/orders目錄下,只有manager能瀏覽該目錄下的文件。其WEB.XML及WEBLOGIC.XML可設(shè)置如下: 

          *************************WEB.XML************************* 
          <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 1.2//EN" "
          http://java.sun.com/j2ee/dtds/web-app_2_2.dtd"> 
          <web-app> 
          <security-constraint> 

          <web-resource-collection> 
          <web-resource-name>SecureOrdersEast</web-resource-name> 
          <description>Security constraint for resources in the orders directory</description> 
          <url-pattern>/orders/*</url-pattern> 
          <http-method>POST</http-method> 
          <http-method>GET</http-method> 
          </web-resource-collection> 

          <auth-constraint> 
          <description>constraint for orders</description> 
          <role-name>manager</role-name> 
          </auth-constraint> 

          <user-data-constraint> 
          <description>SSL not required</description> 
          <transport-guarantee>NONE</transport-guarantee> 
          </user-data-constraint> 

          </security-constraint> 

          <security-role> 
          <description>managers</description> 
          <role-name>manager</role-name> 
          </security-role> 

          </web-app> 

          說明:<security-constraint>中定義資源的訪問控制表。在<web-resource-collection>中定義資源及其存取方式;在<auth-constraint>中定義可訪問該資源的角色;在 <user-data-constraint>中定義WEBLOGIC SERVER與CLIENT之間的開始通訊時(shí),是否采用SSL建立連接。?lt;security-role>中定義角色名。

          posted @ 2005-11-23 16:34 wader 閱讀(511) | 評(píng)論 (0)編輯 收藏

          weblogic.properties 設(shè)置(posted on 2005-01-13 16:16 )

          以下的幾個(gè)服務(wù)器可以免費(fèi)下載或者進(jìn)行開發(fā):

          Blazix (1.5 Megabytes, JSP, Servlets and EJBs)
          來自
          www.blazix.com/blazix.html

          ServletExec (3.8 Megabytes, JSP and Servlets)
          來自
          www.unifyeware.com/servletExec/

          所周知,發(fā)布一個(gè)由JSP/SERVLET開發(fā)的網(wǎng)站,除了需要相應(yīng)的WEB服務(wù)器來響應(yīng)普通網(wǎng)頁(yè)的請(qǐng)求外還需要專門的應(yīng)用服務(wù)器來響應(yīng)動(dòng)態(tài)網(wǎng)頁(yè)JSP/SERVLET的請(qǐng)求。對(duì)于商業(yè)用戶來說,目前最流行的應(yīng)用服務(wù)器軟件要數(shù)BEA公司開發(fā)的WebLogic,下面介紹的是WebLogic5.1的版本。
          先將WebLogic解壓到/usr目錄下,需要修改WebLogic安裝目錄下的StartWebLogic.sh腳本文件來來設(shè)置你的CLASSPATH和JAVA_HOME,最后也是通過這個(gè)腳本文件來啟動(dòng)服務(wù)。現(xiàn)在啟動(dòng)的服務(wù)還不支持JSP/EJB/Servlet等技術(shù),所以還需要修改WebLogic安裝目錄下的weblogic.properties文件。下面就詳細(xì)介紹如何來配置這個(gè)文件。
          ------------------------------------------------------------------------------------------
          第98行:
          weblogic.system.listenPort=80
          設(shè)置HTTP端口,默認(rèn)是7001
          第114行:
          weblogic.password.system=11111111
          設(shè)置啟動(dòng)Console的密碼,默認(rèn)密碼長(zhǎng)度為8位
          第139行:
          weblogic.system.SSLListenPort=7002
          設(shè)置SSL端口,默認(rèn)是7002
          第236行:
          weblogic.system.minPasswordLen=8
          設(shè)置最小密碼長(zhǎng)度,默認(rèn)為8位
          第495行-第508行:
          設(shè)置你自己的RMI,命令格式如下:
          weblogic.system.startupClass.[virtualName]=[fullPackageName]
          例如:
          weblogic.system.startupClass.hello=examples.rmi.hello.HelloImpl
          第524行:
          #weblogic.ejb.deploy=
          # /usr/WebLogic/myserver/Your_Ejb.jar,
          默認(rèn)情況是不允許使用EJB,如果要使用可以把前面的注釋去掉,再設(shè)置你的EJB的路徑
          第539行-第543行:
          增加用戶列表,命令格式如下:
          weblogic.password.[username]=XXX
          例如:
          weblogic.password.xxx=11111111
          第604行:
          weblogic.httpd.session.enable=true
          允許在服務(wù)器端使用session;session在開發(fā)電子商務(wù)程序時(shí)非常有用
          第663行-第674行:
          663行:#weblogic.jdbc.connectionPool.db2Pool=
          664行:# url=jdbc:db2//localhost/database,
          665行:# driver=COM.ibm.db2.jdbc.net.DB2Driver,
          666行:# loginDelaySecs=1,
          667行:# initialCapacity=4,
          668行:# maxCapacity=10,
          669行:# capacityIncrement=2,
          670行:# allowShrinking=true,
          671行:# shrinkPeriodMins=15,
          672行:# refreshMinutes=10,
          673行:# testTable=table,
          674行:# props=user=db2admin;password=db2admin
          設(shè)置你要使用到的JDBC POOL,默認(rèn)情況是不允許使用,如果要使用JDBC POOL可以將前面的注釋去掉,不過首先你的JDBC驅(qū)動(dòng)程序必須是在StartWebLogic.sh的CLASSPATH中已經(jīng)存在的。其中663行是設(shè)置JDBC POOL的名字(如db2Pool);664和665行是注冊(cè)JDBC驅(qū)動(dòng)程序以及連接的數(shù)據(jù)庫(kù);667行為缺省的連接數(shù);668行為連接池中最大連接數(shù);674行為連接數(shù)據(jù)庫(kù)的用戶名和密碼
          第767行:
          weblogic.httpd.register.*.shtml=weblogic.servlet.ServerSideIncludeServlet
          允許使用SSI,即允許使用.shtml為后綴的擴(kuò)展名
          第790行:
          weblogic.httpd.register.servlets=weblogic.servlet.ServletServlet
          允許使用Servlet,例如URL:
          http://localhost/servlets/foo/hello
          則實(shí)際路徑為:
          /home/servlet/foo/hello.class
          第814行:
          weblogic.httpd.documentRoot=/home/www/
          此行為設(shè)定WEB頁(yè)面的發(fā)布目錄
          第831行:
          weblogic.httpd.servlet.classpath=/home/servlet
          此行用來設(shè)置放置Servlet等class文件的目錄,當(dāng)然這個(gè)目錄還必須在StartWebLogic.sh的CLASSPATH中已經(jīng)存在的
          第861行-第868行:
          861行:#weblogic.httpd.register.*.jhtml=
          862行:# weblogic.servlet.jhtmlc.PageCompileServlet
          863行:#weblogic.httpd.initArgs.*.jhtml=
          864行:# pageCheckSeconds=1,
          865行:# packagePrefix=examples.jhtml,
          866行:# compileCommand=/usr/java/bin/javac,
          867行:# workingDir=/home,
          868行:# verbose=true
          這幾行是用來支持JHTML技術(shù)的,默認(rèn)是不能使用JHTML擴(kuò)展名,如果想使用JHTML,將前面的注釋去掉即可。861行后面的*.jhtml用來注冊(cè)使用擴(kuò)展名為jhtml的任意文件;866行設(shè)置javac的目錄
          第878行-第884行:
          878行:#weblogic.httpd.register.*.jsp=
          879行:# weblogic.servlet.JSPServlet
          880行:#weblogic.httpd.initArgs.*.jsp=
          881行:# pageCheckSeconds=1,
          882行:# compileCommand=/usr/java/bin/javac,
          883行:# workingDir=/home,
          884行:# verbose=true
          這幾行是用來支持JSP的,默認(rèn)是不能使用JSP擴(kuò)展名,如果想使用JSP,將前面的注釋去掉即可。878行后面的*.jsp用來注冊(cè)使用擴(kuò)展名為jsp的任意文件;882行設(shè)置javac的目錄;在WebLogic中如果要運(yùn)行test.jsp文件,是先將這個(gè)文件編譯成_test.class后在運(yùn)行的,所以第883行設(shè)置的目錄就是用來放編譯后的.class文件用的


          JRun (11 Megabytes, JSP, Servlets and EJBs)
          來自
          www.jrun.com/

          WebLogic(44 Megabytes, JSP, Servlets and EJBs)
          來自
          www.beasys.com/

          WebSphere (105 Megabytes, JSP, Servlets and EJBs)
          來自www-4.ibm.com/sofeware/webservers/

          以下的幾個(gè)服務(wù)器可以免費(fèi)下載或者進(jìn)行開發(fā):

          Blazix (1.5 Megabytes, JSP, Servlets and EJBs)
          來自
          www.blazix.com/blazix.html

          ServletExec (3.8 Megabytes, JSP and Servlets)
          來自
          www.unifyeware.com/servletExec/

          JRun (11 Megabytes, JSP, Servlets and EJBs)
          來自
          www.jrun.com/

          WebLogic(44 Megabytes, JSP, Servlets and EJBs)
          來自
          www.beasys.com/

          WebSphere (105 Megabytes, JSP, Servlets and EJBs)
          來自www-4.ibm.com/sofeware/webservers/

          以下的幾個(gè)服務(wù)器可以免費(fèi)下載或者進(jìn)行開發(fā):

          Blazix (1.5 Megabytes, JSP, Servlets and EJBs)
          來自
          www.blazix.com/blazix.html

          ServletExec (3.8 Megabytes, JSP and Servlets)
          來自
          www.unifyeware.com/servletExec/

          JRun (11 Megabytes, JSP, Servlets and EJBs)
          來自
          www.jrun.com/

          WebLogic(44 Megabytes, JSP, Servlets and EJBs)
          來自
          www.beasys.com/

          WebSphere (105 Megabytes, JSP, Servlets and EJBs)
          來自www-4.ibm.com/sofeware/webservers/

          posted @ 2005-11-23 16:32 wader 閱讀(1135) | 評(píng)論 (0)編輯 收藏

          WebLogic 的一些結(jié)構(gòu)和特點(diǎn) (posted on 2005-01-13 16:13 )

          要學(xué)習(xí)好一套系統(tǒng)首先要了解它的結(jié)構(gòu),本文詳細(xì)的介紹 WebLogic 的一些結(jié)構(gòu)和特點(diǎn):

          WebLogic的大部分配置是在 weblogic.properties 里完成的,只要仔細(xì)的研究這個(gè)文件就可以清楚得知關(guān)于 WebLogic 的一些結(jié)構(gòu)和特點(diǎn),下面就對(duì) weblogic.properties 文件里的一些配置項(xiàng)作一些說明:

          weblogic.httpd.documentRoot=public_html/
          這就是WebLogic 的WEB 服務(wù)器的根目錄,即是目錄/weblogic/myserver/public_html/

          weblogic.password.system=sdfjkdshfds
          這個(gè)前文已經(jīng)提到,是設(shè)置管理員密碼。

          weblogic.system.listenPort=7001
          這是設(shè)置 WebLogic 的 WEB 服務(wù)器端口。

          weblogic.httpd.servlet.classpath=/weblogic/myserver/servletclasses
          設(shè)置Servlet存放的路徑

          關(guān)于Servlet

          出于安全的目的,在 WebLogic 下運(yùn)行的 WebLogic 必須在 weblogic.properties 里登記后才能運(yùn)行,例如上文的提到Servlet http://localhost:7001/helloWorld
          它在weblogic.properties 里的登記項(xiàng)是
          weblogic.httpd.register.helloWorld=examples.servlets.HelloWorldServlet
          實(shí)際上,這個(gè) Servlet 的實(shí)際路徑是
          /weblogic/myserver/servletclasses/examples/servlets/HelloWorldServlet.class
          對(duì)照一下weblogic.properties里的登記項(xiàng)和HelloWorldServlet.class文件的路徑,應(yīng)該不難找出其登記Servlet的規(guī)律吧。

          在weblogic.properties里有一下幾個(gè)Servlet的登記項(xiàng):

          weblogic.httpd.register.AdminEvents=admin.AdminEvents
          weblogic.httpd.register.AdminClients=admin.AdminClients weblogic.httpd.register.AdminConnections=admin.AdminConnections weblogic.httpd.register.AdminJDBC=admin.AdminJDBC
          weblogic.httpd.register.AdminLicense=admin.AdminLicense
          weblogic.httpd.register.AdminMain=admin.AdminMain
          weblogic.httpd.register.AdminProps=admin.AdminProps
          weblogic.httpd.register.AdminRealm=admin.AdminRealm
          weblogic.httpd.register.AdminThreads=admin.AdminThreads weblogic.httpd.register.AdminVersion=admin.AdminVersion

          這就是管理員管理 WebLogic 用的Servlet,通過URL訪問http://localhost:7001/AdminMain,在彈出的身份驗(yàn)證對(duì)話框了輸入 system 和在 weblogic.password.system= 設(shè)置的密碼,就可以進(jìn)入 WebLogic 的Web管理界面進(jìn)行管理。

          posted @ 2005-11-23 16:29 wader 閱讀(312) | 評(píng)論 (0)編輯 收藏

          WebLogic安裝 (posted on 2005-01-13 16:07 )

          WebLogic 是一套基于JAVA功能強(qiáng)大的電子商務(wù)套件,提供了許多功能強(qiáng)大的中間件以方便編程人員編寫的JSP、SERVLET 等電子商務(wù)應(yīng)用,可以為企業(yè)提供一個(gè)完整的商務(wù)應(yīng)用解決方案。對(duì)于開發(fā)人員 WebLogic 可以在 www.bea.com 免費(fèi)下載一套完整的 WebLogic,并得到一個(gè)限制了 IP 的license,用于學(xué)習(xí)和開發(fā)基于這個(gè)套件的代碼。而要是需要正式的投入使用的話,那么就必須支付一定的費(fèi)用獲取沒限制的license。由于這個(gè)套件基于這種發(fā)布方式,對(duì)于一般網(wǎng)站開發(fā)人員可以很輕易地得到 WebLogic 用于學(xué)習(xí)開發(fā),當(dāng)然投入使用是另一回事。

          我獲得的 WebLogic5.10是兩個(gè)大大的zip文件,一個(gè)是WebLogic程序包,一個(gè)是資料文檔。因?yàn)槭腔贘AVA,雖然在下載時(shí)有區(qū)分操作系統(tǒng),但是我得到的那套經(jīng)過實(shí)踐發(fā)現(xiàn)在WINNT和LINUX都可以運(yùn)行,下面主要是以LINUX的為例,WINNT的安裝方法也差不多。

          安裝前準(zhǔn)備:

          在安裝前,用戶必須獲得一套對(duì)應(yīng)于用戶的操作系統(tǒng)的JDK(在 www.sun.com 免費(fèi)下載),安裝好后把WebLogic5.10的壓縮包解開,建議放在根目錄上,這樣會(huì)省去很多修改設(shè)置的麻煩,在linux下可以解在其他目錄,然后在根目錄再做一個(gè)硬連接也可以。

          我的安裝的文件目錄是

          /usr/local/jdk1.2/
          /usr/local/weblogic/
          ln -s / /usr/local/weblogic/

          配置weblogic:

          啟動(dòng)weblogic需要執(zhí)行兩個(gè)腳本文件:

          linux:setEnv.sh和startWebLogic.sh

          WINNT對(duì)應(yīng)的是:setEnv.cmd和startWebLogic.cmd

          1、weblogic.properties

          打開/usr/local/weblogic/的 weblogic.properties 文件,找到這一行
          weblogic.password.system=
          這是設(shè)置管理員密碼用的,這個(gè)設(shè)置項(xiàng)不能為空,所以必須設(shè)置一個(gè)可靠的管理員密碼。
          例如:weblogic.password.system=sdfjkdshfds

          設(shè)置運(yùn)行JSP:

          # WEBLOGIC JSP PROPERTIES
          # ------------------------------------------------
          # Sets up automatic page compilation for JSP. Adjust init args for
          # directory locations and uncomment to use.
          #weblogic.httpd.register.*.jsp=#weblogic.servlet.JSPServlet
          #weblogic.httpd.initArgs.*.jsp=#pageCheckSeconds=1,#compileCommand=c:/jdk1.2.1/bin/javac.exe, #workingDir=/weblogic/myserver/classfiles, #verbose=true


          把那些注釋刪去,即改為


          # WEBLOGIC JSP PROPERTIES
          # ------------------------------------------------
          # Sets up automatic page compilation for JSP. Adjust init args for
          # directory locations and uncomment to use.
          weblogic.httpd.register.*.jsp=weblogic.servlet.JSPServlet
          weblogic.httpd.initArgs.*.jsp=pageCheckSeconds=1,compileCommand=c:/jdk1.2.1/bin/javac.exe, workingDir=/weblogic/myserver/classfiles, verbose=true


          要注意的是還要配置好這一行:
          compileCommand=/usr/local/jdk1.2/bin/javac, 這是JDK的JAVA編譯器的路徑。


          2、setEnv.sh

          打開/weblogic/setEnv.sh,找到這一行
          JAVA_HOME=/usr/java
          改為
          JAVA_HOME=/usr/local/jdk1.2/

          3、 startWebLogic.sh

          找到一個(gè)全是大寫的 "LINUX" 字符串,改為 "Linux",很奇怪是為何要這樣是嗎?這是因?yàn)閱?dòng)時(shí),腳本文件調(diào)用了uname 指令來得到系統(tǒng)的名字,再與"LINUX" 字符串比較確認(rèn)是否是linux系統(tǒng),但是uname 指令來返回的系統(tǒng)的名字是Linux,所以我們要改一下,這應(yīng)該是這個(gè)啟動(dòng)腳本的一個(gè)小小的BUG,WINT就不用那么麻煩了。

          運(yùn)行weblogic:

          經(jīng)過簡(jiǎn)單的配置就試運(yùn)行了。

          在目錄/weblogic/下執(zhí)行

          . ./setEnv.sh (大家請(qǐng)留意,我這里有兩個(gè) ".",因?yàn)槲覀冃枰诋?dāng)前的shell下執(zhí)行這個(gè)腳本 )

          ./startWebLogic.sh

          當(dāng)看到成功啟動(dòng) WebLogic 的信息時(shí),說明啟動(dòng)成功了。

          服務(wù)器簡(jiǎn)單的測(cè)試:

          WebLogic 默認(rèn)的WEB端口為7001,我們可以在打開一個(gè)瀏覽器輸入地址
          http://localhost:7001/
          測(cè)試是否能連接得上。

          Servlet的測(cè)試

          如果能連得上得話,那么就可以進(jìn)行下一步的Servlet的測(cè)試,在瀏覽器輸入地址
          http://localhost:7001/helloWorld
          這個(gè)就是WebLogic Servlet的演示(至于怎樣安裝 Servlet請(qǐng)看下文)

          JSP的測(cè)試

          在目錄 /weblogic/myserver/public_html/下建立一個(gè)名為test.jsp的文件

          test.jsp

          <%

          Out.print("test JSP");

          %>

           

          在瀏覽器輸入地址
          http://localhost:7001/test.jsp
          測(cè)試能否看到正確的輸出"test JSP"的信息。

          posted @ 2005-11-23 16:25 wader 閱讀(329) | 評(píng)論 (0)編輯 收藏

          使用Hibernate的一個(gè)完整例子(發(fā)表于 2005-1-9 22:31:46 )

          使用Hibernate的一個(gè)完整例子
          配置
          1、 下載安裝Tomcat,并且下載Hibernate的運(yùn)行環(huán)境(主要包含一些JAR包)。

          2、 把要使用的數(shù)據(jù)庫(kù)的JDBC驅(qū)動(dòng)程序拷貝到%TOMCAT_HOME%\common\lib目錄下。筆者使用的是MYSQL,對(duì)應(yīng)的驅(qū)動(dòng)程序的JAR包為mm.mysql-2.0.4-bin.jar。

          3、 在Tomcat的Webapps目錄下新建一個(gè)Web應(yīng)用,名字為hibernate。

          4、 把Hibernate提供的hibernate2.jar和一些第三方的運(yùn)行庫(kù)拷貝到hibernate\WEB\INF\lib目錄下。(這些第三方的運(yùn)行庫(kù)包含在下載的Hibernate lib目錄下)

          5、 在%TOMCAT_HOME%\conf\server.xml中Web應(yīng)用和數(shù)據(jù)源。在server.xml中加入以下的配置描述。
          例程1 配置web應(yīng)用


          <Context path="/hibernate" docBase="hibernate" debug="0" reloadable="true" crossContext="true"> 
          <Resource name="jdbc/hibernate" auth="Container" type="javax.sql.DataSource"/> 
          <ResourceParams name="jdbc/hibernate"> 
          <parameter> 
          <name>factory</name> 
          <value>org.apache.commons.dbcp.BasicDataSourceFactory</value> 
          </parameter>
          <parameter> 
          <name>driverClassName</name> 
          <value>org.gjt.mm.mysql.Driver</value> 
          </parameter> 
          <parameter> 
          <name>url</name> 
          <value>jdbc:mysql:///test</value> 
          </parameter> 
          <parameter> 
          <name>username</name> 
          <value>root</value> 
          </parameter> 
          <parameter> 
          <name>password</name> 
          <value></value> 
          </parameter> 
          <parameter> 
          <name>maxActive</name> 
          <value>20</value> 
          </parameter>
          <parameter> 
          <name>maxIdle</name> 
          <value>10</value>
          </parameter> 
          <parameter> 
          <name>maxWait</name> 
          <value>-1</value> 
          </parameter> 
          </ResourceParams> 
          </Context>

          在這里,配置了一個(gè)名為hibernate的Web應(yīng)用,并且配置了一個(gè)數(shù)據(jù)源,數(shù)據(jù)源的JNDI名稱為jdbc/hibernate。您需要根據(jù)情況修改數(shù)據(jù)源的鏈接屬性。

          6、 下一步就是書寫Hibernate的配置描述符。可以使用XML的配置描述,也可以使用基于屬性的配置描述。在這里使用基于XML的配置描述。在hibernate\WEB-INF\classes目錄下新建一個(gè)hibernate.cfg.xml文件。然后加入例程2所示的內(nèi)容。



          <!DOCTYPE hibernate-configuration
          PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
          "
          http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd";>

          <hibernate-configuration>
          <session-factory>
          <property name="connection.datasource">java:comp/env/jdbc/hibernate</property>
          <property name="show_sql">false</property>
          <property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>

          <!-- Mapping files -->

          </session-factory>

          </hibernate-configuration>

          注意connection.datasource屬性必須和server.xml中配置的數(shù)據(jù)源的屬性一樣。如果不是使用MYSQL,那么需要更改dialect屬性。

          到現(xiàn)在,配置基本完成,下面我們來開發(fā)一個(gè)最簡(jiǎn)單的應(yīng)用。

          開發(fā)持久對(duì)象、編寫映射描述
          我們使用hibernate來封裝一個(gè)簡(jiǎn)單的數(shù)據(jù)表。這個(gè)表的名字為Courses,它有兩個(gè)字段,一個(gè)是ID,它是Courses表的主鍵;另一個(gè)是name,表示Courses的名字。在數(shù)據(jù)庫(kù)中使用以下的腳本來創(chuàng)建這個(gè)表:

          create table Courses(CourseId varchar(32) not null, name varchar(32), constraint pk_Courses primary key (CourseId) );

          接下來的任務(wù)就是為Courses表書寫持久對(duì)象,如例程3所示。

          例程3 Courses的持久對(duì)象(Courses.java)


          package com.hellking.study.hibernate;

          import java.util.Set;

          /**
          *在hibernate中代表了Course表的類。
          */
          public class Course 
          {
          /**每個(gè)屬性和表的一個(gè)字段對(duì)應(yīng)**/
          private String id;
          private String name;

          /**students表示course中的學(xué)生,在后面才會(huì)用到,暫時(shí)不管**/
          private Set students;

          /**屬性的訪問方法**/
          public void setId(String string) {
          id = string;
          }

          public String getId() {
          return id;
          }

          public void setName(String name)
          {
          this.name=name;
          }
          public String getName()
          {
          return this.name;
          }
          public void setStudents(Set stud)
          {
          this.students=stud;
          }
          public Set getStudents()
          {
          return this.students;
          }
          }

          可以看出,在Course類中也包含了兩個(gè)屬性,id和name,它的屬性和表Courses的字段是一一對(duì)應(yīng)的,并且類型一致。
          書寫好了持久對(duì)象,接下來的任務(wù)就是書寫對(duì)象、關(guān)系映射描述。在hibernate\WEB-INF\classes目錄下新建一個(gè)Course.hbm.xml描述文件,內(nèi)容如例程4所示。
          例程4 Course.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>
          <class
          name="com.hellking.study.hibernate.Course"
          table="Courses"
          dynamic-update="false"
          >

          <id
          name="id"
          column="CourseId"
          type="string"
          unsaved-value="any"
          >
          <generator class="assigned"/>
          </id>

          <property
          name="name"
          type="string"
          update="true"
          insert="true"
          column="Name"
          /> 
          </class>
          </hibernate-mapping>

          在Course.hbm.xml映射文件中,指定了要映射的類和映射的表,并且指定了表的各個(gè)字段和Java對(duì)象中各個(gè)字段的映射關(guān)系,比如Course對(duì)象中的id屬性對(duì)應(yīng)了Courses表的courseId字段。

          接下來的任務(wù)就是在hibernate.cfg.xml中指定這個(gè)映射關(guān)系。如下所示:



          <session-factory>

          <!-- Mapping files --> 
          <mapping resource="Course.hbm.xml"/>
          </session-factory>

          編寫業(yè)務(wù)邏輯
          到此,我們已經(jīng)封裝了一個(gè)名為Courses的表,并且配置完成。接下來的任務(wù)就是在Web應(yīng)用開發(fā)中使用它們,為了演示在Hibernate中對(duì)數(shù)據(jù)庫(kù)的不同類型的操作,我們開發(fā)的Web應(yīng)用有以下的功能:


          增加一個(gè)Course;

          刪除一個(gè)Course;

          按照Course的名字進(jìn)行模糊搜索;

          查看系統(tǒng)中所有的Course。


          雖然我們可以直接在JSP中使用hibernate,但是往往我們不這樣,而是把這些業(yè)務(wù)邏輯封裝在JavaBean中,然后在JSP中通過調(diào)用JavaBean以訪問Hibernate封裝的對(duì)象。

          由于訪問通過使用hibernate有一些共性的操作,在這里我們把這些共性的操作封裝在一個(gè)專門的類中,這樣其它的類可以繼承它,如例程5所示。

          例程5 HibernateBase.java


          package com.hellking.study.hibernate;

          import net.sf.hibernate.*;
          import net.sf.hibernate.cfg.*;
          import java.util.*;
          import java.io.IOException;
          import java.io.PrintWriter;

          public abstract class HibernateBase 
          {
          protected SessionFactory sessionFactory;//會(huì)話工廠,用于創(chuàng)建會(huì)話
          protected Session session;//hibernate會(huì)話
          protected Transaction transaction; //hiberante事務(wù)

          public HibernateBase()throws HibernateException
          {
          this.initHibernate();
          }
          // 幫助方法
          protected void initHibernate()
          throws HibernateException {

          // 裝載配置,構(gòu)造SessionFactory對(duì)象
          sessionFactory = new Configuration().configure().buildSessionFactory();
          }

          /**
          *開始一個(gè)hibernate事務(wù)
          */
          protected void beginTransaction()
          throws HibernateException {

          session = sessionFactory.openSession();
          transaction = session.beginTransaction();
          }

          /**
          *結(jié)束一個(gè)hibernate事務(wù)。
          */
          protected void endTransaction(boolean commit)
          throws HibernateException {

          if (commit) {
          transaction.commit();
          } else {
          //如果是只讀的操作,不需要commit這個(gè)事務(wù)。
          transaction.rollback();
          }
          session.close();
          }
          }

          下面編寫業(yè)務(wù)邏輯類,新建一個(gè)名為CourseBean的JavaBean,并且CourseBean繼承HibernateBase類,代碼如例程6所示。

          例程6 CourseBean.java


          package com.hellking.study.hibernate;

          import net.sf.hibernate.*;
          import net.sf.hibernate.cfg.*;
          import java.util.*;

          /**
          *和course相關(guān)的業(yè)務(wù)邏輯
          */
          public class CourseBean extends HibernateBase
          {
          public CourseBean()throws HibernateException
          {
          super();
          }
          /**
          *增加一個(gè)Course
          */
          public void addCourse(Course st)throws HibernateException
          {
          beginTransaction();
          session.save(st); 
          endTransaction(true);
          }

          /**
          *查詢系統(tǒng)中所有的Course,返回的是包含有Course持久對(duì)象的Iterator。
          */
          public Iterator getAllCourses()throws HibernateException
          {
          String queryString = "select courses from Course as courses";
          beginTransaction();
          Query query = session.createQuery(queryString);
          Iterator it= query.iterate();
          return it;
          }

          /**
          *刪除給定ID的course
          */
          public void deleteCourse(String id)throws HibernateException
          {
          beginTransaction(); 
          Course course=(Course)session.load(Course.class,id); 
          session.delete(course);
          endTransaction(true);
          }

          /**
          *按course的名字進(jìn)行模糊查找,返回的是包含有Course持久對(duì)象的Iterator。
          */
          public Iterator getSomeCourse(String name)throws HibernateException
          {
          String queryString = "select c from Course as c where c.name like :name" 
          beginTransaction();
          Query query = session.createQuery(queryString);
          query.setString("name", "%"+name+"%");
          Iterator it= query.iterate();
          return it;

          }

          在CourseBean封裝了4個(gè)業(yè)務(wù)方法,你可以根據(jù)情況增加其它的業(yè)務(wù)方法。在CourseBean中,通過Hibernate來操作潛在的數(shù)據(jù)庫(kù)資源。

          要保存Course數(shù)據(jù)到數(shù)據(jù)庫(kù),可以通過:



          session.save(Course);

          方法來保存,它相當(dāng)于使用在JDBC中執(zhí)行以下語(yǔ)句:



          Connection con=…
          Statement stmt=con.createStatement();
          stmt.executeUpdate("insert into courses values('"+course.getId(),+"','"+course.getName()+"')");
          con.close();

          可以看出,通過使用Hibernate,可以大大減少數(shù)據(jù)訪問的復(fù)雜度。

          在JSP中調(diào)用業(yè)務(wù)邏輯
          添加數(shù)據(jù)
          CourseBean這個(gè)業(yè)務(wù)對(duì)象封裝了和Hibernate的交互關(guān)系,從而使JSP和Hibernate關(guān)系的解藕。我們來看測(cè)試主頁(yè)面的部分代碼,如例程7所示。

          例程7 測(cè)試Hibernate開發(fā)的應(yīng)用(course.jsp)


          <%@ page import="java.sql.*,java.util.*" errorPage="error.jsp"%> 
          <jsp:useBean id="course" class="com.hellking.study.hibernate.Course" scope="page">
          <jsp:setProperty name="course" property="*"/>
          </jsp:useBean>
          <jsp:useBean id="courseBusiness" class="com.hellking.study.hibernate.CourseBean" scope="page"/>
          <html><body><center>
          <% 
          try
          {
          if(course.getId().equals(null)||course.getId().equals(""));
          else courseBusiness.addCourse(course);

          %>
          成功添加了Course:<br>
          name:<%=course.getName()%>
          Id:<%=course.getId()%>
          <%
          }
          catch(Exception e)
          {

          %> 

          <hr>
          <br>::增加一個(gè)course::<br>
          <form action="course.jsp" method="get" name="add">
          id:<input type=text name="id"><br>
          name:<input type=text name="name"><br>
          <input type=submit value="submit"><br>
          </form>
          <hr>
          ::按名字模糊查找::<br>
          <form action="queryCourse.jsp" method="get" name="queryByName">
          name:<input type=text name="name"><br>
          <input type=submit value="query"><br>
          </form>
          <hr>
          ::刪除一個(gè)Course::<br>
          <form action="deleteCourse.jsp" method="get" name="queryByName">
          id:<input type=text name="id"><br>
          <input type=submit value="delete"><br>
          </form>
          <hr>
          <a href=viewAll.jsp>::查看所有Course::<a>
          </body>
          </html>

          首先通過一個(gè)值對(duì)象Course(這個(gè)類正好是Hibernate使用的持久對(duì)象,這里作為值對(duì)象來傳遞數(shù)據(jù))接收獲得的參數(shù),然后CourseBean的addCourse(Course)方法把數(shù)據(jù)保存到數(shù)據(jù)庫(kù)。可以看出,通過使用Hibernate,把數(shù)據(jù)從表單中添加到數(shù)據(jù)庫(kù)非常簡(jiǎn)單。

          查詢
          下面來看模糊查找的JSP代碼,如例程8所示。
          例程8 按名字模糊查找Course


          <%@ page import="java.sql.*,java.util.*,com.hellking.study.hibernate.Course" errorPage="error.jsp"%> 
          <jsp:useBean id="courseBusiness" class="com.hellking.study.hibernate.CourseBean" scope="page"/>

          <% try
          {
          Iterator it=courseBusiness.getSomeCourse((String)request.getParameter("name"));
          while(it.hasNext())
          {
          Course temp=(Course)it.next();
          out.println("<tr><td>"+temp.getId()+"</td>");
          out.println("<td>"+temp.getName()+"</td></tr>");
          }
          }
          catch(Exception e)
          {
          out.println(e.getMessage());
          }
          %>
          ….

          它實(shí)際上調(diào)用的是CourseBean的Iterator getSomeCourse(String name)方法。我們來回顧一下這個(gè)方法中的代碼:



          /**
          *按course的名字進(jìn)行模糊查找
          */
          public Iterator getSomeCourse(String name)throws HibernateException
          {
          String queryString = "select c from Course as c where c.name like :name" 
          beginTransaction();
          Query query = session.createQuery(queryString);
          query.setString("name", "%"+name+"%");
          Iterator it= query.iterate();
          return it;
          }

          在查詢前,首先調(diào)用beginTransaction方法啟動(dòng)新的Hibernate事務(wù),然后創(chuàng)建一個(gè)Query對(duì)象,在創(chuàng)建這個(gè)對(duì)象時(shí),同時(shí)指定查詢的語(yǔ)句。

          注意,在查詢語(yǔ)句:


          select c from Course as c where c.name like :name"

          中,它雖然和普通的SQL語(yǔ)句相似,但是不同,在數(shù)據(jù)庫(kù)中,使用的表的名字是Courses,而在這個(gè)查詢語(yǔ)句中使用的是Course,它和持久對(duì)象的名字一致,也就是說,這個(gè)查詢的概念是查詢持久對(duì)象,而不是數(shù)據(jù)庫(kù)的記錄。

          創(chuàng)建了查詢對(duì)象Query后,需要設(shè)置查詢的參數(shù),它和在JDBC中PreparedStatement對(duì)象中設(shè)置參數(shù)的方法相似。通過"Iterator it= query.iterate()"語(yǔ)句來執(zhí)行查詢,并且返回一個(gè)Iterator對(duì)象。在這里使用了Hibernate提供的查詢機(jī)制,一般的JDBC查詢返回的是ResultSet對(duì)象,而這里返回的是包含了CourseBean對(duì)象的Iterator。

          要查詢系統(tǒng)中所有的Course,也同樣非常簡(jiǎn)單,可以通過例程9所示的代碼實(shí)現(xiàn)。

          例程9 查詢數(shù)據(jù)庫(kù)中所有的Course



          <jsp:useBean id="courseBusiness" class="com.hellking.study.hibernate.CourseBean" scope="page"/>

          <% try
          {
          Iterator it=courseBusiness.getAllCourses();
          while(it.hasNext())
          {
          Course temp=(Course)it.next();
          out.println("<tr><td>"+temp.getId()+"</td>");
          out.println("<td>"+temp.getName()+"</td></tr>");
          }
          }
          catch(Exception e)
          {
          out.println(e.getMessage());
          }
          %>


          實(shí)際上調(diào)用的是CourseBean的getAllCourses方法,它和getSomeCourse方法機(jī)制一樣,就不再介紹了。

          刪除數(shù)據(jù)
          在JSP中,使用以下的代碼來執(zhí)行刪除操作。
          例程10 刪除數(shù)據(jù)庫(kù)中Courses表的記錄


          <jsp:useBean id="courseBusiness" class="com.hellking.study.hibernate.CourseBean" scope="page"/>

          刪除id為:<%=request.getParameter("id")%>的course::::<br>

          <% try
          {
          courseBusiness.deleteCourse(request.getParameter("id"));
          out.println("刪除成功");

          catch(Exception e)
          {
          out.println("不存在這個(gè)記錄");
          }
          %>

          我們來看CourseBean中執(zhí)行刪除操作的具體代碼:


          /**
          *刪除給定ID的course
          */
          public void deleteCourse(String id)throws HibernateException
          {
          beginTransaction(); 
          Course course=(Course)session.load(Course.class,id); 
          session.delete(course);
          endTransaction(true);
          }

          在這個(gè)方法中,首先開始一個(gè)事務(wù),然后通過session.load(Course.class,id)方法來裝載指定ID的持久對(duì)象,接下來通過"session.delete(course)"來刪除已經(jīng)裝載的course,并且結(jié)束Hibernate事務(wù)。

          總結(jié)
          下面總結(jié)一下使用Hibernate的開發(fā)過程:

          1、 配置Hibernate(一次即可);
          2、 確定數(shù)據(jù)表;

          3、 創(chuàng)建持久對(duì)象;

          4、 編寫對(duì)象和數(shù)據(jù)表的映射描述;

          5、 編寫和業(yè)務(wù)邏輯。

          實(shí)際上,上面的過程和使用EJB沒有什么區(qū)別:在使用EJB時(shí),首先當(dāng)然也是配置環(huán)境,初始化數(shù)據(jù)表;然后創(chuàng)建實(shí)體Bean(對(duì)象于Hibernate的持久對(duì)象);接下來編寫部署描述符(ejb-jar.xml,廠商專有的部署描述),在這些部署描述符里,指定了EJB和數(shù)據(jù)表的映射關(guān)系,如果多個(gè)實(shí)體Bean存在關(guān)聯(lián)關(guān)系,需要描述它們之間的關(guān)系,這些描述對(duì)應(yīng)于Hibernate中持久對(duì)象的描述,如Course.hbm.xml;往往我們并不在應(yīng)用程序中直接操作實(shí)體Bean,而是通過業(yè)務(wù)對(duì)象(如會(huì)話Bean)來操作,這里的會(huì)話Bean可以簡(jiǎn)單的和Hibernate中執(zhí)行業(yè)務(wù)邏輯的JavaBean對(duì)應(yīng)。這里只是簡(jiǎn)單的類比,不是絕對(duì)的,比如我們同樣可以在會(huì)話Bean中訪問Hibernate持久對(duì)象,也就是說使用Hibernate,同樣可以把業(yè)務(wù)邏輯放在會(huì)話Bean中。

          通過本文的學(xué)習(xí),相信讀者對(duì)Hibernate已經(jīng)有了初步的認(rèn)識(shí),并且能夠使用Hibernate開發(fā)簡(jiǎn)單的應(yīng)用。在下一篇中,我們將學(xué)習(xí)怎么使用Hibernate來為復(fù)雜的數(shù)據(jù)表進(jìn)行映射,并且維護(hù)它們之間的關(guān)系。


          參考資料

          http://www.apache.org 下載Tomcat。
          Hibernate的官方網(wǎng)站,
          http://hibernate.bluemars.net/ ,包含了Hibernate最新資料。

          Hibernate中文論壇,hibernate.fankai.com包含了Hibernate較多的參考資料。

          包含了Hibernate技術(shù)討論網(wǎng)站,www.jdon.com,

          于Hibernate、JDO、CMP等技術(shù)的熱烈討論1:
          http://www.jdon.com/jive/thread.jsp?forum=16&thread=6062&start=0&msRange=15

          于Hibernate、JDO、CMP等技術(shù)的熱烈討論2:
          http://www.theserverside.com/discussion/thread.jsp?thread_id=19732

          Hibernate2 Reference document.tion,可以從Hibernate官方網(wǎng)站獲得,非常好的參考資料。

          Hibernate In Action,一本非常專業(yè)的Hibernate參考書,由Hibernate項(xiàng)目主要開發(fā)人員Gavin King 等著,Manning出版社出版。您可以從 
          http://www.theserverside.com 獲得本書的部分章節(jié)。

          posted @ 2005-11-23 16:24 wader 閱讀(411) | 評(píng)論 (0)編輯 收藏

          Hibernate查詢語(yǔ)言:HQL(API文檔)(2005-05-12 11:38 )

          Hibernate查詢語(yǔ)言:HQL


              HQL:Hibernate Qusery Language,如果你已經(jīng)熟悉它,就會(huì)發(fā)現(xiàn)它跟SQL非常相像。不過 你不要被表面的假象迷惑,HQL是面向?qū)ο蟮模∣O,用生命的眼光看待每一個(gè)對(duì)象,他們是如此 鮮活)。如果你對(duì)JAVA和SQL語(yǔ)句有一定了解的話,那么HQL對(duì)你簡(jiǎn)直易如反掌,你完全可以利用在公車上的時(shí)間掌握它。
             
                   以下從幾個(gè)方面進(jìn)行慢慢深入:
                  
                  
          1。大小些敏感
                   大家知道Query是對(duì)大小寫不敏感的,但是在HQL(前面提到它是OO的)中那么對(duì)象類的名稱和屬性確實(shí)大小寫敏感的(符合java編程語(yǔ)法)。
                 如:sElect cat.name from Cat as cat和select cat.name from Cat as cat是一樣的
                 但是:
                     sElect cat.name from CAT as cat和select cat.name from Cat as cat確實(shí)不一樣的。
                    
                
          2。from語(yǔ)句
                 最簡(jiǎn)單的:
                  from eg.Cat
                  它只是簡(jiǎn)單的返回所有eg.Cat的實(shí)例
                  通常我們此時(shí)會(huì)為eg.Cat其個(gè)別名,因?yàn)樵趒uery的其余部分可能會(huì)用到(參看上邊關(guān)于大小寫
                  敏感時(shí)的例子情形),如:
                  from eg.Cat as cat 這里as可以省略。
                  上邊只是單表查詢,多表的情況如下寫法:
                  from eg.Cat,eg.Dog
                  from eg.Cat as cat,eg.Dog as dog
                 
                 
          3。join相關(guān)
                  (inner) join
                  left (outer) join
                  right (outer) join
                  full join
                  HQL同樣對(duì)SQL中的這些特性支持
                   下面插播一個(gè)小話題,關(guān)于上邊的那些特性,我一直都沒怎么用,今天既然說到這里,就想
                  把上邊的幾個(gè)特性的用法說一下,也算對(duì)自己的一個(gè)補(bǔ)充:
                   假設(shè)有兩個(gè)表:部門、員工,下面列舉一些數(shù)據(jù):
                   員工(Employee):
                   ID      Name    DepNo
                   001     Jplateau  01
                   002     Jony      01
                   003     Camel    02
                   部門(Department):
                   ID      Name
                   01     研發(fā)部
                   02     營(yíng)銷部
                   
                   在Hibernate中我們操縱的都是對(duì)象,所以我們操縱的是部門類和員工類
                   1).(inner) join
                   select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name
                    as name2 from Employee as employee join Department as department on employee.DepNo=
                    department.ID  (注意到條件語(yǔ)句我用on 沒有用where)
                   那么執(zhí)行結(jié)果是什么呢?
                   id1 name1 id2 name2
                   ++++++++++++++++++++++++++++++++++++++
                   001 Jplateau 01 研發(fā)部
                   002 Jony     01 研發(fā)部
                   
                   2).left (outer) join
                   select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name
                    as name2 from Employee as employee left join Department as department on employee.DepNo=
                    department.ID
                   那么執(zhí)行結(jié)果又該是什么呢?
                   id1 name1 id2 name2
                   ++++++++++++++++++++++++++++++++++++++
                   001 Jplateau 01 研發(fā)部
                   002 Jony     01 研發(fā)部
                   003 Camel    null null  
                   {就是說此時(shí)我要已第一個(gè)表的記錄多少為準(zhǔn),第二個(gè)表中沒有相應(yīng)紀(jì)錄的時(shí)候填充null}  
                   3).  right (outer) join
                   select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name
                    as name2 from Employee as employee right join Department as department on employee.DepNo=
                    department.ID
                   那么執(zhí)行結(jié)果又該是什么呢?
                   id1 name1 id2 name2
                   ++++++++++++++++++++++++++++++++++++++
                   001 Jplateau 01 研發(fā)部
                   002 Jony     01 研發(fā)部
                   null null     02 營(yíng)銷部  
                   {就是說此時(shí)我要已第二個(gè)表的記錄多少為準(zhǔn),第一個(gè)表中沒有相應(yīng)紀(jì)錄的時(shí)候填充null} 
                   
                 
          4。select語(yǔ)句
                     就是要確定你要從查詢中返回哪些對(duì)象或者哪些對(duì)象的屬性。寫幾個(gè)例子吧:
                     select employee form Employee as employee
                     select employee form Employee as employee where employee.Name like 'J%'
                     select employee.Name form Employee as employee where employee.Name like 'J%'
                     select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name
                    as name2 from Employee as employee right join Department as department on employee.DepNo=
                    department.ID
                   
                     select elements(employee.Name) from Employee as employee
                     (不明白elements到底是做什么用的?望給于說明)
                    
                     等等
                 
          5。數(shù)學(xué)函數(shù)
                     JDO目前好像還不支持此類特性。
                     avg(...), sum(...), min(...), max(...)

                      count(*)

               count(...), count(distinct ...), count(all...)
              
               其用法和SQL基本相同
              
               select distinct employee.name from Employee as employee
               select count(distinct employee.name),count(employee) from Employee as employee
              
            
          6。polymorphism (暫時(shí)不知道如何解釋?)
               from com.test.Animal as animal
               不光得到所有Animal得實(shí)例,而且可以得到所有Animal的子類(如果我們定義了一個(gè)子類Cat)
               一個(gè)比較極端的例子
               from java.lang.Object as o
               可以得到所有持久類的實(shí)例
              
             7。where語(yǔ)句
               定義查詢語(yǔ)句的條件,舉幾個(gè)例子吧:
               from Employee as employee where employee.Name='Jplateau'
               from Employee as employee where employee.Name like 'J%'
               from Employee as employee where employee.Name like '%u'
               在where語(yǔ)句中“=”不光可以比較對(duì)象的屬性,也可以比較對(duì)象,如:
               select animal from com.test.Animal as animal  where animal.name=dog
              
             
          8。表達(dá)式
             
              在SQL語(yǔ)句中大部分的表達(dá)式在HQL中都可以使用:
              mathematical operators +, -, *, /

                     binary comparison operators =, >=, <=, <>, !=, like

                     logical operations and, or, not

                     string concatenation ||

                     SQL scalar functions like upper() and lower()
                    
                     Parentheses ( ) indicate grouping

                     in, between, is null

                     JDBC IN parameters ?

                     named parameters :name, :start_date, :x1 (這種應(yīng)該是另一種"?"的變通解決方法)

                     SQL literals 'foo', 69, '1970-01-01 10:00:01.0'

                     Java public static final constants eg.Color.TABBY
                    
                     其他不必解釋了,在這里我只想對(duì)查詢中的參數(shù)問題說明一下:
                     大家知道在SQL中進(jìn)行傳遞參數(shù)進(jìn)行查詢的時(shí)候,我們通常用PreparedStatement,在語(yǔ)句中寫一大堆的“?”,
                     在hql中也可以用這種方法,如:
                     List mates = sess.find(
                              "select employee.name from Employee as employee " +
                              "where employee.Name=? ",
                              name,
                              Hibernate.STRING
                             );
                     (說明:上面利用Session里的find方法,在hibernate的api Session中重載了很多find方法,它可以滿足你多種形式的查詢)
                     上邊是一個(gè)參數(shù)的情形,這種情況下緊接著引入?yún)?shù)和定義參數(shù)的類型,當(dāng)為多個(gè)參數(shù),調(diào)用另一個(gè)find方法,它的后兩個(gè)
                     參數(shù)都是數(shù)組的形式。
                    
                     還有另外一種方法來解決上邊的問題,JDO也有這樣的方法,不過和hibernate的表現(xiàn)形式上有差別,但他們兩個(gè)骨子里卻是
                     一樣的,如:
                     Query q = sess.createQuery("select employee.name from Employee as employee where employee.Name=:name");
                     q.setString("name", "Jplateau");
                     //當(dāng)有多個(gè)參數(shù)的時(shí)候在此逐一定義
                     Iterator employees = q.iterate();  
                    
                    
          9。order 語(yǔ)句
                     和sql語(yǔ)句沒什么差別,如:
                     select employee.name from Employee as employee where employee.Name like 'J%'  order by employee.ID desc (或者asc)
                    
                    
          10。group by 語(yǔ)句
                     同樣和sql語(yǔ)句沒什么差別,如:
                    
                     select employee.name,employee.DepNo from Employee as employee group by employee.DepNo
                    
                    
          select foo.id, avg( elements(foo.names) ), max( indices(foo.names) ) from eg.Foo foo group by foo.id
                     {Note: You may use the elements and indices constructs inside a select clause, even on databases with no subselects.}
                     誰幫我解釋一下上邊兩句,謝過!

                    
                    
          11。子查詢
                     hibernate同樣支持子查詢,寫幾個(gè)例子:
                    
                     from eg.Cat as fatcat where fatcat.weight > ( select avg(cat.weight) from eg.DomesticCat cat )

          posted @ 2005-11-23 16:14 wader 閱讀(2425) | 評(píng)論 (0)編輯 收藏

          Configuration的其他用法(轉(zhuǎn)貼)(2005-05-27 18:22)

          Configuration的其他用法

            Configuration的configure ()方法還支持帶參數(shù)的訪問方式,你可以指定hbm.xml文件的位置,而不是使用默認(rèn)的classpath下面的hibernate.cfg.xml這種方式,例如:

          Configuration cfg = new Configuration().configure("myexample.xml");

            同時(shí)Configuration還提供了一系列方法用來定制hibernate的加載配置文件的過程,讓你的應(yīng)用更加靈活,常用的是以下幾種:

          addProperties(Element)
          addProperties(Properties)
          setProperties(Properties)
          setProperty(String, String)

            通過以上幾個(gè)方法,除了使用默認(rèn)的hibernate.properties文件,你還可以提供多個(gè).properties配置文件,使用Hibernate的時(shí)候根據(jù)不同的情況使用不同的配置文件,例如:

          Properties properties = Properties.load("my.properties");
          Configuration config = new Configuration().setProperties(properties).configure();

            除了指定.properties文件之外,還可以指定.hbm.xml文件,下面列出幾個(gè)常用的方法:

          addClass(Class)
          addFile(File)
          addFile(String)
          addURL(URL)

            前面我們已經(jīng)講了,configure()方法默認(rèn)是通過訪問hibernate.cfg.xml的<mapping>元素來加載我們提供的.hbm.xml文件,上面列出的方法可以直接指定hbm.xml文件,例如addClass()方法可以直接通過指定class來加載對(duì)應(yīng)的映射文件,hibernate會(huì)將提供的class的全名(包括package)自動(dòng)轉(zhuǎn)化為文件路徑,如net.sf.hibernate.examples.quickstart.Cat.class對(duì)應(yīng)了net/sf/hibernate/examples/quickstart/Cat.hbm.xml,還可以用addFile方法直接指定映射文件。

            例一:

          Configuration config = new Configuration().addClass(Cat.class);

            例二:

          Configuration config = new Configuration().addURL(Configuration.class.getResource ("Cat.hbm.xml"));

            例三:

          Configuration config = new Configuration().addFile("Cat.hbm.xml");

            5、總結(jié)

            Configuration提供的這些方法的好處如下:

            1) 一個(gè)應(yīng)用中往往有很多.hbm.xml映射文件,開發(fā)的過程中如果只是為了測(cè)試某個(gè)或幾個(gè)Java PO(Persistence Object),我們沒有必要把所有的.hbm.xml都加載到內(nèi)存,這樣可以通過addClass或者addFile直接,顯得非常靈活。

            2) 學(xué)習(xí)Hibernate的過程中,往往需要通過練習(xí)來體會(huì)Hibernate提供的各種特征,而很多特征是需要修改配置文件的,如果要觀察相同的代碼在不同的特征下的表現(xiàn),就需要手工改配置文件,這樣太麻煩了,而且容易出錯(cuò),我們可以提供多個(gè)配置文件,每個(gè)配置文件針對(duì)需要的特征而配置,這樣我們?cè)谡{(diào)用程序的時(shí)候,把不同的配置文件作為參數(shù)傳遞進(jìn)去,而程序代碼里面使用setProperties和addFile指定傳入的配置文件參數(shù)就可以了。

            3) 在單元測(cè)試中,特別是在集成測(cè)試?yán)锩妫麄€(gè)過程是自動(dòng)化的,我們不能手工干預(yù)測(cè)試過程,往往需要準(zhǔn)備多個(gè)配置文件針對(duì)不同的測(cè)試案例,這個(gè)時(shí)候setProperties和addFile方法就顯得特別有用了,在不同的測(cè)試案例中用這些方法來指定相應(yīng)的配置文件,這樣就可以做到自動(dòng)化測(cè)試,保證了持續(xù)性。

          posted @ 2005-11-23 16:09 wader 閱讀(750) | 評(píng)論 (0)編輯 收藏

          主站蜘蛛池模板: 彭州市| 富民县| 牟定县| 丹江口市| 长子县| 安泽县| 固阳县| 浑源县| 柘城县| 津市市| 鄢陵县| 万全县| 连平县| 敦化市| 科尔| 南平市| 米泉市| 枣庄市| 江达县| 唐海县| 桃源县| 扶风县| 海安县| 芜湖县| 天峨县| 县级市| 长海县| 乌拉特中旗| 南宁市| 林周县| 岗巴县| 麻栗坡县| 洱源县| 泸水县| 洪湖市| 宜阳县| 抚顺市| 周至县| 灌南县| 贡嘎县| 苏尼特右旗|