WADER

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

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

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

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

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

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

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

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

          Role(角色)的實現(xiàn)機制就比較復(fù)雜了。其實每個LDAP實體本身都有一個“nsrole”的屬性。如果某個角色賦予這個用戶的話,就會在這個用戶的“nsrole”(其實是nsroleDN,這個會在以后解釋)的屬性中添加一個角色的記錄。如果當(dāng)前用戶有10個角色(例如,他又是領(lǐng)導(dǎo),又是員工,又是管理員,又是教授....),那么在這個用戶的"nsrole"屬性中會有10條記錄(Role的DN)。這種實現(xiàn)方式非常適合下面的操作: 列舉當(dāng)前用戶擁有的所有的角色,因為在用戶的“nsrole”屬性中記錄了所有的角色。因此給一個用戶授權(quán)通常使用角色,這是因為從用戶信息中就能很快獲得當(dāng)前用戶所有的角色,以及相關(guān)的權(quán)限。

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

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

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

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

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

          Lucene in Action(中文版)

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

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

          UI項目的團隊組合(來自微軟的借鑒)

          UI項目的團隊組合(來自微軟的借鑒)


          2006.06.11????

          來源:ChinaUI

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

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

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

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

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

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

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

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

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

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

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

          客戶教育或文檔團隊:(User Education,or UE Team)
          ? 文檔組長(UE Lead):負責(zé)管理文檔小組。
          ? 文檔編輯(UE Editor):負責(zé)具體的文檔編輯和撰寫。

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

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

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

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

          二、與ORACLE數(shù)據(jù)庫的連接 
          WEBLOGIC6.0通過ORACLE客戶端訪問ORACLE,所以在WEBLOGIC6.0所在的機器上要正確安裝ORACLE客戶端才行。WEBLOGIC6.0對ORACLE提供TYPE2的JDBC DRIVER支持,是一些動態(tài)連接庫(NT 是.DLL,UNIX是.SO)文件,在$WL_HOME\bin下,以O(shè)CI開頭的幾個目錄中。具體采用哪個目錄下庫文件,與ORACLE SERVER端及CLIENT端的版本及ORACLE API的版本有關(guān),可參考WEBLOGIC6.0的聯(lián)機文檔。要把這些庫所在的路徑加到系統(tǒng)的環(huán)境變量中,否則訪問數(shù)據(jù)庫時,WEBLOGIC6.0會報以下錯誤: 
          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ǒng)的LIBRARY PATH中,如在SUN上,要加到LD_LIBRARY_PATH環(huán)境變量中,方法如下: 
          export LD_LIBRARY_PATH=/bea/weblogic6.0/oci816_8:$ORACLE_HOME/lib 
          在HP平臺上,要加到SHLIB_PATH環(huán)境變量中,如: 
          export SHLIB_PATH=/bea/ weblogic6.0/lib/hpux11/oci816_8:$ORACLE_HOME/lib 

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

          對訪問權(quán)限的設(shè)置有兩種方式: 
          1、 在WEBLOGIC6.O的控制臺中設(shè)置,把結(jié)果保存到fileRealm.properties中,即采用WEBLOGIC6.0的file realm.感覺對DATABASE POOL,EJB等比較好用,對JSP,SERVER及某個目錄設(shè)置訪問控制表比較難。我試了很多次都沒成功。它可對WEB用戶(通過瀏覽器訪問)和普通用戶(通過JAVA客戶端等訪問)起作用。 
          2、在WEB.XML,WEBLOGIC.XML中設(shè)置,只能對WEB用戶起作用。下面舉個例子說明這種方式。 
          如:在一個名為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之間的開始通訊時,是否采用SSL建立連接。?lt;security-role>中定義角色名。

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

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

          以下的幾個服務(wù)器可以免費下載或者進行開發(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ā)布一個由JSP/SERVLET開發(fā)的網(wǎng)站,除了需要相應(yīng)的WEB服務(wù)器來響應(yīng)普通網(wǎng)頁的請求外還需要專門的應(yīng)用服務(wù)器來響應(yīng)動態(tài)網(wǎng)頁JSP/SERVLET的請求。對于商業(yè)用戶來說,目前最流行的應(yīng)用服務(wù)器軟件要數(shù)BEA公司開發(fā)的WebLogic,下面介紹的是WebLogic5.1的版本。
          先將WebLogic解壓到/usr目錄下,需要修改WebLogic安裝目錄下的StartWebLogic.sh腳本文件來來設(shè)置你的CLASSPATH和JAVA_HOME,最后也是通過這個腳本文件來啟動服務(wù)。現(xiàn)在啟動的服務(wù)還不支持JSP/EJB/Servlet等技術(shù),所以還需要修改WebLogic安裝目錄下的weblogic.properties文件。下面就詳細介紹如何來配置這個文件。
          ------------------------------------------------------------------------------------------
          第98行:
          weblogic.system.listenPort=80
          設(shè)置HTTP端口,默認是7001
          第114行:
          weblogic.password.system=11111111
          設(shè)置啟動Console的密碼,默認密碼長度為8位
          第139行:
          weblogic.system.SSLListenPort=7002
          設(shè)置SSL端口,默認是7002
          第236行:
          weblogic.system.minPasswordLen=8
          設(shè)置最小密碼長度,默認為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,
          默認情況是不允許使用EJB,如果要使用可以把前面的注釋去掉,再設(shè)置你的EJB的路徑
          第539行-第543行:
          增加用戶列表,命令格式如下:
          weblogic.password.[username]=XXX
          例如:
          weblogic.password.xxx=11111111
          第604行:
          weblogic.httpd.session.enable=true
          允許在服務(wù)器端使用session;session在開發(fā)電子商務(wù)程序時非常有用
          第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,默認情況是不允許使用,如果要使用JDBC POOL可以將前面的注釋去掉,不過首先你的JDBC驅(qū)動程序必須是在StartWebLogic.sh的CLASSPATH中已經(jīng)存在的。其中663行是設(shè)置JDBC POOL的名字(如db2Pool);664和665行是注冊JDBC驅(qū)動程序以及連接的數(shù)據(jù)庫;667行為缺省的連接數(shù);668行為連接池中最大連接數(shù);674行為連接數(shù)據(jù)庫的用戶名和密碼
          第767行:
          weblogic.httpd.register.*.shtml=weblogic.servlet.ServerSideIncludeServlet
          允許使用SSI,即允許使用.shtml為后綴的擴展名
          第790行:
          weblogic.httpd.register.servlets=weblogic.servlet.ServletServlet
          允許使用Servlet,例如URL:
          http://localhost/servlets/foo/hello
          則實際路徑為:
          /home/servlet/foo/hello.class
          第814行:
          weblogic.httpd.documentRoot=/home/www/
          此行為設(shè)定WEB頁面的發(fā)布目錄
          第831行:
          weblogic.httpd.servlet.classpath=/home/servlet
          此行用來設(shè)置放置Servlet等class文件的目錄,當(dāng)然這個目錄還必須在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ù)的,默認是不能使用JHTML擴展名,如果想使用JHTML,將前面的注釋去掉即可。861行后面的*.jhtml用來注冊使用擴展名為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的,默認是不能使用JSP擴展名,如果想使用JSP,將前面的注釋去掉即可。878行后面的*.jsp用來注冊使用擴展名為jsp的任意文件;882行設(shè)置javac的目錄;在WebLogic中如果要運行test.jsp文件,是先將這個文件編譯成_test.class后在運行的,所以第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/

          以下的幾個服務(wù)器可以免費下載或者進行開發(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/

          以下的幾個服務(wù)器可以免費下載或者進行開發(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) | 評論 (0)編輯 收藏

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

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

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

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

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

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

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

          關(guān)于Servlet

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

          在weblogic.properties里有一下幾個Servlet的登記項:

          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,在彈出的身份驗證對話框了輸入 system 和在 weblogic.password.system= 設(shè)置的密碼,就可以進入 WebLogic 的Web管理界面進行管理。

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

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

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

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

          安裝前準(zhǔn)備:

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

          我的安裝的文件目錄是

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

          配置weblogic:

          啟動weblogic需要執(zhí)行兩個腳本文件:

          linux:setEnv.sh和startWebLogic.sh

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

          1、weblogic.properties

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

          設(shè)置運行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

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

          運行weblogic:

          經(jīng)過簡單的配置就試運行了。

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

          . ./setEnv.sh (大家請留意,我這里有兩個 ".",因為我們需要在當(dāng)前的shell下執(zhí)行這個腳本 )

          ./startWebLogic.sh

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

          服務(wù)器簡單的測試:

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

          Servlet的測試

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

          JSP的測試

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

          test.jsp

          <%

          Out.print("test JSP");

          %>

           

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

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

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

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

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

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

          4、 把Hibernate提供的hibernate2.jar和一些第三方的運行庫拷貝到hibernate\WEB\INF\lib目錄下。(這些第三方的運行庫包含在下載的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>

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

          6、 下一步就是書寫Hibernate的配置描述符??梢允褂肵ML的配置描述,也可以使用基于屬性的配置描述。在這里使用基于XML的配置描述。在hibernate\WEB-INF\classes目錄下新建一個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ā)一個最簡單的應(yīng)用。

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

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

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

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


          package com.hellking.study.hibernate;

          import java.util.Set;

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

          /**students表示course中的學(xué)生,在后面才會用到,暫時不管**/
          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類中也包含了兩個屬性,id和name,它的屬性和表Courses的字段是一一對應(yīng)的,并且類型一致。
          書寫好了持久對象,接下來的任務(wù)就是書寫對象、關(guān)系映射描述。在hibernate\WEB-INF\classes目錄下新建一個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映射文件中,指定了要映射的類和映射的表,并且指定了表的各個字段和Java對象中各個字段的映射關(guān)系,比如Course對象中的id屬性對應(yīng)了Courses表的courseId字段。

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



          <session-factory>

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

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


          增加一個Course;

          刪除一個Course;

          按照Course的名字進行模糊搜索;

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


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

          由于訪問通過使用hibernate有一些共性的操作,在這里我們把這些共性的操作封裝在一個專門的類中,這樣其它的類可以繼承它,如例程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;//會話工廠,用于創(chuàng)建會話
          protected Session session;//hibernate會話
          protected Transaction transaction; //hiberante事務(wù)

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

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

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

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

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

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

          下面編寫業(yè)務(wù)邏輯類,新建一個名為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();
          }
          /**
          *增加一個Course
          */
          public void addCourse(Course st)throws HibernateException
          {
          beginTransaction();
          session.save(st); 
          endTransaction(true);
          }

          /**
          *查詢系統(tǒng)中所有的Course,返回的是包含有Course持久對象的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的名字進行模糊查找,返回的是包含有Course持久對象的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個業(yè)務(wù)方法,你可以根據(jù)情況增加其它的業(yè)務(wù)方法。在CourseBean中,通過Hibernate來操作潛在的數(shù)據(jù)庫資源。

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



          session.save(Course);

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



          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這個業(yè)務(wù)對象封裝了和Hibernate的交互關(guān)系,從而使JSP和Hibernate關(guān)系的解藕。我們來看測試主頁面的部分代碼,如例程7所示。

          例程7 測試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>::增加一個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>
          ::刪除一個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>

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

          查詢
          下面來看模糊查找的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());
          }
          %>
          ….

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



          /**
          *按course的名字進行模糊查找
          */
          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方法啟動新的Hibernate事務(wù),然后創(chuàng)建一個Query對象,在創(chuàng)建這個對象時,同時指定查詢的語句。

          注意,在查詢語句:


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

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

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

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

          例程9 查詢數(shù)據(jù)庫中所有的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());
          }
          %>


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

          刪除數(shù)據(jù)
          在JSP中,使用以下的代碼來執(zhí)行刪除操作。
          例程10 刪除數(shù)據(jù)庫中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("不存在這個記錄");
          }
          %>

          我們來看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);
          }

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

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

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

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

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

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

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

          通過本文的學(xué)習(xí),相信讀者對Hibernate已經(jīng)有了初步的認識,并且能夠使用Hibernate開發(fā)簡單的應(yīng)用。在下一篇中,我們將學(xué)習(xí)怎么使用Hibernate來為復(fù)雜的數(shù)據(jù)表進行映射,并且維護它們之間的關(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項目主要開發(fā)人員Gavin King 等著,Manning出版社出版。您可以從 
          http://www.theserverside.com 獲得本書的部分章節(jié)。

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

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

          Hibernate查詢語言:HQL


              HQL:Hibernate Qusery Language,如果你已經(jīng)熟悉它,就會發(fā)現(xiàn)它跟SQL非常相像。不過 你不要被表面的假象迷惑,HQL是面向?qū)ο蟮模∣O,用生命的眼光看待每一個對象,他們是如此 鮮活)。如果你對JAVA和SQL語句有一定了解的話,那么HQL對你簡直易如反掌,你完全可以利用在公車上的時間掌握它。
             
                   以下從幾個方面進行慢慢深入:
                  
                  
          1。大小些敏感
                   大家知道Query是對大小寫不敏感的,但是在HQL(前面提到它是OO的)中那么對象類的名稱和屬性確實大小寫敏感的(符合java編程語法)。
                 如: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確實不一樣的。
                    
                
          2。from語句
                 最簡單的:
                  from eg.Cat
                  它只是簡單的返回所有eg.Cat的實例
                  通常我們此時會為eg.Cat其個別名,因為在query的其余部分可能會用到(參看上邊關(guān)于大小寫
                  敏感時的例子情形),如:
                  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同樣對SQL中的這些特性支持
                   下面插播一個小話題,關(guān)于上邊的那些特性,我一直都沒怎么用,今天既然說到這里,就想
                  把上邊的幾個特性的用法說一下,也算對自己的一個補充:
                   假設(shè)有兩個表:部門、員工,下面列舉一些數(shù)據(jù):
                   員工(Employee):
                   ID      Name    DepNo
                   001     Jplateau  01
                   002     Jony      01
                   003     Camel    02
                   部門(Department):
                   ID      Name
                   01     研發(fā)部
                   02     營銷部
                   
                   在Hibernate中我們操縱的都是對象,所以我們操縱的是部門類和員工類
                   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  (注意到條件語句我用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  
                   {就是說此時我要已第一個表的記錄多少為準(zhǔn),第二個表中沒有相應(yīng)紀(jì)錄的時候填充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 營銷部  
                   {就是說此時我要已第二個表的記錄多少為準(zhǔn),第一個表中沒有相應(yīng)紀(jì)錄的時候填充null} 
                   
                 
          4。select語句
                     就是要確定你要從查詢中返回哪些對象或者哪些對象的屬性。寫幾個例子吧:
                     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 (暫時不知道如何解釋?)
               from com.test.Animal as animal
               不光得到所有Animal得實例,而且可以得到所有Animal的子類(如果我們定義了一個子類Cat)
               一個比較極端的例子
               from java.lang.Object as o
               可以得到所有持久類的實例
              
             7。where語句
               定義查詢語句的條件,舉幾個例子吧:
               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語句中“=”不光可以比較對象的屬性,也可以比較對象,如:
               select animal from com.test.Animal as animal  where animal.name=dog
              
             
          8。表達式
             
              在SQL語句中大部分的表達式在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
                    
                     其他不必解釋了,在這里我只想對查詢中的參數(shù)問題說明一下:
                     大家知道在SQL中進行傳遞參數(shù)進行查詢的時候,我們通常用PreparedStatement,在語句中寫一大堆的“?”,
                     在hql中也可以用這種方法,如:
                     List mates = sess.find(
                              "select employee.name from Employee as employee " +
                              "where employee.Name=? ",
                              name,
                              Hibernate.STRING
                             );
                     (說明:上面利用Session里的find方法,在hibernate的api Session中重載了很多find方法,它可以滿足你多種形式的查詢)
                     上邊是一個參數(shù)的情形,這種情況下緊接著引入?yún)?shù)和定義參數(shù)的類型,當(dāng)為多個參數(shù),調(diào)用另一個find方法,它的后兩個
                     參數(shù)都是數(shù)組的形式。
                    
                     還有另外一種方法來解決上邊的問題,JDO也有這樣的方法,不過和hibernate的表現(xiàn)形式上有差別,但他們兩個骨子里卻是
                     一樣的,如:
                     Query q = sess.createQuery("select employee.name from Employee as employee where employee.Name=:name");
                     q.setString("name", "Jplateau");
                     //當(dāng)有多個參數(shù)的時候在此逐一定義
                     Iterator employees = q.iterate();  
                    
                    
          9。order 語句
                     和sql語句沒什么差別,如:
                     select employee.name from Employee as employee where employee.Name like 'J%'  order by employee.ID desc (或者asc)
                    
                    
          10。group by 語句
                     同樣和sql語句沒什么差別,如:
                    
                     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同樣支持子查詢,寫幾個例子:
                    
                     from eg.Cat as fatcat where fatcat.weight > ( select avg(cat.weight) from eg.DomesticCat cat )

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

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

          Configuration的其他用法

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

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

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

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

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

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

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

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

            前面我們已經(jīng)講了,configure()方法默認是通過訪問hibernate.cfg.xml的<mapping>元素來加載我們提供的.hbm.xml文件,上面列出的方法可以直接指定hbm.xml文件,例如addClass()方法可以直接通過指定class來加載對應(yīng)的映射文件,hibernate會將提供的class的全名(包括package)自動轉(zhuǎn)化為文件路徑,如net.sf.hibernate.examples.quickstart.Cat.class對應(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) 一個應(yīng)用中往往有很多.hbm.xml映射文件,開發(fā)的過程中如果只是為了測試某個或幾個Java PO(Persistence Object),我們沒有必要把所有的.hbm.xml都加載到內(nèi)存,這樣可以通過addClass或者addFile直接,顯得非常靈活。

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

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

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

          僅列出標(biāo)題
          共2頁: 1 2 下一頁 
          主站蜘蛛池模板: 台山市| 嘉鱼县| 新密市| 江川县| 天长市| 新巴尔虎右旗| 杨浦区| 日照市| 富源县| 浦江县| 辽阳县| 盐池县| 临朐县| 县级市| 巴中市| 六枝特区| 阿合奇县| 五华县| 靖江市| 阿瓦提县| 黄石市| 通渭县| 大宁县| 沁阳市| 固安县| 义马市| 龙门县| 福泉市| 巴里| 湘阴县| 水富县| 宁强县| 财经| 衡水市| 五原县| 宿迁市| 昌黎县| 财经| 册亨县| 松滋市| 北票市|