一区二区三区不卡在线,综合久久国产,亚洲国产日韩精品http://www.aygfsteel.com/wader/java,swt,hibernate,struts,xml,spring,ant,cvs,uml,db,serverzh-cnSat, 17 May 2025 07:25:37 GMTSat, 17 May 2025 07:25:37 GMT60在LDAP中使用角色(Role)和組(Group)來管理用戶http://www.aygfsteel.com/wader/archive/2007/09/24/147742.htmlwaderwaderMon, 24 Sep 2007 03:32:00 GMThttp://www.aygfsteel.com/wader/archive/2007/09/24/147742.htmlhttp://www.aygfsteel.com/wader/comments/147742.htmlhttp://www.aygfsteel.com/wader/archive/2007/09/24/147742.html#Feedback0http://www.aygfsteel.com/wader/comments/commentRss/147742.htmlhttp://www.aygfsteel.com/wader/services/trackbacks/147742.htmlLDAP(輕量級目錄服務器)越來越被廣泛的使用,特別是在管理海量用戶信息和管理身份認證信息的時候,LDAP被國內大多數企業所使用,從中國電信,中國移動,新浪,和許多省市政府部門都使用LDAP來管理用戶身份的信息。下面重點介紹在LDAP中管理用戶的一些概念和技巧。

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

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

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

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

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

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

另外還有一些準則來幫助判斷在設計時到底使用Group還是Role。

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

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

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



wader 2007-09-24 11:32 發表評論
]]>
Lucene in Action(中文版)http://www.aygfsteel.com/wader/archive/2007/09/09/wader-lucene.htmlwaderwaderSun, 09 Sep 2007 03:45:00 GMThttp://www.aygfsteel.com/wader/archive/2007/09/09/wader-lucene.htmlhttp://www.aygfsteel.com/wader/comments/143745.htmlhttp://www.aygfsteel.com/wader/archive/2007/09/09/wader-lucene.html#Feedback0http://www.aygfsteel.com/wader/comments/commentRss/143745.htmlhttp://www.aygfsteel.com/wader/services/trackbacks/143745.html閱讀全文

wader 2007-09-09 11:45 發表評論
]]>
UI項目的團隊組合(來自微軟的借鑒)http://www.aygfsteel.com/wader/archive/2006/06/12/52118.htmlwaderwaderMon, 12 Jun 2006 01:47:00 GMThttp://www.aygfsteel.com/wader/archive/2006/06/12/52118.htmlhttp://www.aygfsteel.com/wader/comments/52118.htmlhttp://www.aygfsteel.com/wader/archive/2006/06/12/52118.html#Feedback0http://www.aygfsteel.com/wader/comments/commentRss/52118.htmlhttp://www.aygfsteel.com/wader/services/trackbacks/52118.html

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


2006.06.11????

來源:ChinaUI

UI設計人員是對產品的使用界面進行設計和訂正的人員。 Usability Engineer是檢驗UI設計的合理性的人員。

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

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

Usability Engineer 所做的事和UI設計人員不同。他們是將UI設計的模型版,找客戶來進行實用和使用性能的檢驗調查和測試,并根據調查結果對UI設計提出進行修改的意見。也就是說,他們的工作是檢驗UI設計的合理性,有點像測試人員對程序進行檢驗的功能??梢哉f,Usability Engineer 和UI設計人員的關系像測試人員與開發編程人員的關系。

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

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

合理的開發團隊組合應該是什么? 允許我拋磚引玉,先談一下微軟的經驗:

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

開發團隊:(Development Team)
? 開發團隊領導(Development Manager): 負責管理各個開發小組,并對開發編程的工作做總體的規劃。
? 開發組長(Development Lead): 負責管理開發工程師,也參加對開發編程的工作做總體的規劃。
? 開發工程師(Develop Engineer,or Developer):負責具體的編程開發。
? 構架師(Architect): 大的產品團隊有一兩個資深工程師專門做整體系統的設計規劃。

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

產品可用性團隊:(Usability Team)
? 產品可用性工程師(Usability Engineer): 做使用性能的調查和測試,采訪客戶或將客戶邀請來做調查。
? 界面設計師(UI Designer): 負責具體的界面設計。
? 產品設計師 (Product Designer): 負責產品的總體設計,特別是硬件產品。

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

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



wader 2006-06-12 09:47 發表評論
]]>
weblogic配置 (posted on 2005-01-13 16:21 )http://www.aygfsteel.com/wader/archive/2005/11/23/21147.htmlwaderwaderWed, 23 Nov 2005 08:34:00 GMThttp://www.aygfsteel.com/wader/archive/2005/11/23/21147.htmlhttp://www.aygfsteel.com/wader/comments/21147.htmlhttp://www.aygfsteel.com/wader/archive/2005/11/23/21147.html#Feedback0http://www.aygfsteel.com/wader/comments/commentRss/21147.htmlhttp://www.aygfsteel.com/wader/services/trackbacks/21147.html

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

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

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

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

*************************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>中定義角色名。



wader 2005-11-23 16:34 發表評論
]]>
weblogic.properties 設置(posted on 2005-01-13 16:16 )http://www.aygfsteel.com/wader/archive/2005/11/23/21145.htmlwaderwaderWed, 23 Nov 2005 08:32:00 GMThttp://www.aygfsteel.com/wader/archive/2005/11/23/21145.htmlhttp://www.aygfsteel.com/wader/comments/21145.htmlhttp://www.aygfsteel.com/wader/archive/2005/11/23/21145.html#Feedback0http://www.aygfsteel.com/wader/comments/commentRss/21145.htmlhttp://www.aygfsteel.com/wader/services/trackbacks/21145.html以下的幾個服務器可以免費下載或者進行開發:

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

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

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

以下的幾個服務器可以免費下載或者進行開發:

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/

以下的幾個服務器可以免費下載或者進行開發:

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/



wader 2005-11-23 16:32 發表評論
]]>
WebLogic 的一些結構和特點 (posted on 2005-01-13 16:13 )http://www.aygfsteel.com/wader/archive/2005/11/23/21143.htmlwaderwaderWed, 23 Nov 2005 08:29:00 GMThttp://www.aygfsteel.com/wader/archive/2005/11/23/21143.htmlhttp://www.aygfsteel.com/wader/comments/21143.htmlhttp://www.aygfsteel.com/wader/archive/2005/11/23/21143.html#Feedback0http://www.aygfsteel.com/wader/comments/commentRss/21143.htmlhttp://www.aygfsteel.com/wader/services/trackbacks/21143.html

要學習好一套系統首先要了解它的結構,本文詳細的介紹 WebLogic 的一些結構和特點:

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

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

weblogic.password.system=sdfjkdshfds
這個前文已經提到,是設置管理員密碼。

weblogic.system.listenPort=7001
這是設置 WebLogic 的 WEB 服務器端口。

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

關于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文件的路徑,應該不難找出其登記Servlet的規律吧。

在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= 設置的密碼,就可以進入 WebLogic 的Web管理界面進行管理。



wader 2005-11-23 16:29 發表評論
]]>
WebLogic安裝 (posted on 2005-01-13 16:07 )http://www.aygfsteel.com/wader/archive/2005/11/23/21142.htmlwaderwaderWed, 23 Nov 2005 08:25:00 GMThttp://www.aygfsteel.com/wader/archive/2005/11/23/21142.htmlhttp://www.aygfsteel.com/wader/comments/21142.htmlhttp://www.aygfsteel.com/wader/archive/2005/11/23/21142.html#Feedback0http://www.aygfsteel.com/wader/comments/commentRss/21142.htmlhttp://www.aygfsteel.com/wader/services/trackbacks/21142.html

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

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

安裝前準備:

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

我的安裝的文件目錄是

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

配置weblogic:

啟動weblogic需要執行兩個腳本文件:

linux:setEnv.sh和startWebLogic.sh

WINNT對應的是:setEnv.cmd和startWebLogic.cmd

1、weblogic.properties

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

設置運行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",很奇怪是為何要這樣是嗎?這是因為啟動時,腳本文件調用了uname 指令來得到系統的名字,再與"LINUX" 字符串比較確認是否是linux系統,但是uname 指令來返回的系統的名字是Linux,所以我們要改一下,這應該是這個啟動腳本的一個小小的BUG,WINT就不用那么麻煩了。

運行weblogic:

經過簡單的配置就試運行了。

在目錄/weblogic/下執行

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

./startWebLogic.sh

當看到成功啟動 WebLogic 的信息時,說明啟動成功了。

服務器簡單的測試:

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"的信息。



wader 2005-11-23 16:25 發表評論
]]>
使用Hibernate的一個完整例子(發表于 2005-1-9 22:31:46 )http://www.aygfsteel.com/wader/archive/2005/11/23/21141.htmlwaderwaderWed, 23 Nov 2005 08:24:00 GMThttp://www.aygfsteel.com/wader/archive/2005/11/23/21141.htmlhttp://www.aygfsteel.com/wader/comments/21141.htmlhttp://www.aygfsteel.com/wader/archive/2005/11/23/21141.html#Feedback0http://www.aygfsteel.com/wader/comments/commentRss/21141.htmlhttp://www.aygfsteel.com/wader/services/trackbacks/21141.html 使用Hibernate的一個完整例子 配置
1、 下載安裝Tomcat,并且下載Hibernate的運行環境(主要包含一些JAR包)。

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

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

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

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


<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應用,并且配置了一個數據源,數據源的JNDI名稱為jdbc/hibernate。您需要根據情況修改數據源的鏈接屬性。

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



<!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中配置的數據源的屬性一樣。如果不是使用MYSQL,那么需要更改dialect屬性。

到現在,配置基本完成,下面我們來開發一個最簡單的應用。

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

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

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

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


package com.hellking.study.hibernate;

import java.util.Set;

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

/**students表示course中的學生,在后面才會用到,暫時不管**/
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的字段是一一對應的,并且類型一致。
書寫好了持久對象,接下來的任務就是書寫對象、關系映射描述。在hibernate\WEB-INF\classes目錄下新建一個Course.hbm.xml描述文件,內容如例程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對象中各個字段的映射關系,比如Course對象中的id屬性對應了Courses表的courseId字段。

接下來的任務就是在hibernate.cfg.xml中指定這個映射關系。如下所示:



<session-factory>

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

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


增加一個Course;

刪除一個Course;

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

查看系統中所有的Course。


雖然我們可以直接在JSP中使用hibernate,但是往往我們不這樣,而是把這些業務邏輯封裝在JavaBean中,然后在JSP中通過調用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;//會話工廠,用于創建會話
protected Session session;//hibernate會話
protected Transaction transaction; //hiberante事務

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

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

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

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

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

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

下面編寫業務邏輯類,新建一個名為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相關的業務邏輯
*/
public class CourseBean extends HibernateBase
{
public CourseBean()throws HibernateException
{
super();
}
/**
*增加一個Course
*/
public void addCourse(Course st)throws HibernateException
{
beginTransaction();
session.save(st); 
endTransaction(true);
}

/**
*查詢系統中所有的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個業務方法,你可以根據情況增加其它的業務方法。在CourseBean中,通過Hibernate來操作潛在的數據庫資源。

要保存Course數據到數據庫,可以通過:



session.save(Course);

方法來保存,它相當于使用在JDBC中執行以下語句:



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

可以看出,通過使用Hibernate,可以大大減少數據訪問的復雜度。

在JSP中調用業務邏輯
添加數據
CourseBean這個業務對象封裝了和Hibernate的交互關系,從而使JSP和Hibernate關系的解藕。我們來看測試主頁面的部分代碼,如例程7所示。

例程7 測試Hibernate開發的應用(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使用的持久對象,這里作為值對象來傳遞數據)接收獲得的參數,然后CourseBean的addCourse(Course)方法把數據保存到數據庫。可以看出,通過使用Hibernate,把數據從表單中添加到數據庫非常簡單。

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

它實際上調用的是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;
}

在查詢前,首先調用beginTransaction方法啟動新的Hibernate事務,然后創建一個Query對象,在創建這個對象時,同時指定查詢的語句。

注意,在查詢語句:


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

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

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

要查詢系統中所有的Course,也同樣非常簡單,可以通過例程9所示的代碼實現。

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


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

刪除數據
在JSP中,使用以下的代碼來執行刪除操作。
例程10 刪除數據庫中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中執行刪除操作的具體代碼:


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

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

總結
下面總結一下使用Hibernate的開發過程:

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

3、 創建持久對象;

4、 編寫對象和數據表的映射描述;

5、 編寫和業務邏輯。

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

通過本文的學習,相信讀者對Hibernate已經有了初步的認識,并且能夠使用Hibernate開發簡單的應用。在下一篇中,我們將學習怎么使用Hibernate來為復雜的數據表進行映射,并且維護它們之間的關系。


參考資料

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

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

包含了Hibernate技術討論網站,www.jdon.com,

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

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

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

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


wader 2005-11-23 16:24 發表評論
]]>
Hibernate查詢語言:HQL(API文檔)(2005-05-12 11:38 )http://www.aygfsteel.com/wader/archive/2005/11/23/21139.htmlwaderwaderWed, 23 Nov 2005 08:14:00 GMThttp://www.aygfsteel.com/wader/archive/2005/11/23/21139.htmlhttp://www.aygfsteel.com/wader/comments/21139.htmlhttp://www.aygfsteel.com/wader/archive/2005/11/23/21139.html#Feedback0http://www.aygfsteel.com/wader/comments/commentRss/21139.htmlhttp://www.aygfsteel.com/wader/services/trackbacks/21139.htmlHibernate查詢語言:HQL


    HQL:Hibernate Qusery Language,如果你已經熟悉它,就會發現它跟SQL非常相像。不過 你不要被表面的假象迷惑,HQL是面向對象的(OO,用生命的眼光看待每一個對象,他們是如此 鮮活)。如果你對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的其余部分可能會用到(參看上邊關于大小寫
        敏感時的例子情形),如:
        from eg.Cat as cat 這里as可以省略。
        上邊只是單表查詢,多表的情況如下寫法:
        from eg.Cat,eg.Dog
        from eg.Cat as cat,eg.Dog as dog
       
       
3。join相關
        (inner) join
        left (outer) join
        right (outer) join
        full join
        HQL同樣對SQL中的這些特性支持
         下面插播一個小話題,關于上邊的那些特性,我一直都沒怎么用,今天既然說到這里,就想
        把上邊的幾個特性的用法說一下,也算對自己的一個補充:
         假設有兩個表:部門、員工,下面列舉一些數據:
         員工(Employee):
         ID      Name    DepNo
         001     Jplateau  01
         002     Jony      01
         003     Camel    02
         部門(Department):
         ID      Name
         01     研發部
         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)
         那么執行結果是什么呢?
         id1 name1 id2 name2
         ++++++++++++++++++++++++++++++++++++++
         001 Jplateau 01 研發部
         002 Jony     01 研發部
         
         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
         那么執行結果又該是什么呢?
         id1 name1 id2 name2
         ++++++++++++++++++++++++++++++++++++++
         001 Jplateau 01 研發部
         002 Jony     01 研發部
         003 Camel    null null  
         {就是說此時我要已第一個表的記錄多少為準,第二個表中沒有相應紀錄的時候填充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
         那么執行結果又該是什么呢?
         id1 name1 id2 name2
         ++++++++++++++++++++++++++++++++++++++
         001 Jplateau 01 研發部
         002 Jony     01 研發部
         null null     02 營銷部  
         {就是說此時我要已第二個表的記錄多少為準,第一個表中沒有相應紀錄的時候填充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。數學函數
           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 (這種應該是另一種"?"的變通解決方法)

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

           Java public static final constants eg.Color.TABBY
          
           其他不必解釋了,在這里我只想對查詢中的參數問題說明一下:
           大家知道在SQL中進行傳遞參數進行查詢的時候,我們通常用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方法,它可以滿足你多種形式的查詢)
           上邊是一個參數的情形,這種情況下緊接著引入參數和定義參數的類型,當為多個參數,調用另一個find方法,它的后兩個
           參數都是數組的形式。
          
           還有另外一種方法來解決上邊的問題,JDO也有這樣的方法,不過和hibernate的表現形式上有差別,但他們兩個骨子里卻是
           一樣的,如:
           Query q = sess.createQuery("select employee.name from Employee as employee where employee.Name=:name");
           q.setString("name", "Jplateau");
           //當有多個參數的時候在此逐一定義
           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 )



wader 2005-11-23 16:14 發表評論
]]>
Configuration的其他用法(轉貼)(2005-05-27 18:22)http://www.aygfsteel.com/wader/archive/2005/11/23/21138.htmlwaderwaderWed, 23 Nov 2005 08:09:00 GMThttp://www.aygfsteel.com/wader/archive/2005/11/23/21138.htmlhttp://www.aygfsteel.com/wader/comments/21138.htmlhttp://www.aygfsteel.com/wader/archive/2005/11/23/21138.html#Feedback0http://www.aygfsteel.com/wader/comments/commentRss/21138.htmlhttp://www.aygfsteel.com/wader/services/trackbacks/21138.htmlConfiguration的其他用法

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

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

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

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

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

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

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

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

  前面我們已經講了,configure()方法默認是通過訪問hibernate.cfg.xml的<mapping>元素來加載我們提供的.hbm.xml文件,上面列出的方法可以直接指定hbm.xml文件,例如addClass()方法可以直接通過指定class來加載對應的映射文件,hibernate會將提供的class的全名(包括package)自動轉化為文件路徑,如net.sf.hibernate.examples.quickstart.Cat.class對應了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、總結

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

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

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

  3) 在單元測試中,特別是在集成測試里面,整個過程是自動化的,我們不能手工干預測試過程,往往需要準備多個配置文件針對不同的測試案例,這個時候setProperties和addFile方法就顯得特別有用了,在不同的測試案例中用這些方法來指定相應的配置文件,這樣就可以做到自動化測試,保證了持續性。


wader 2005-11-23 16:09 發表評論
]]>
主站蜘蛛池模板: 南召县| 喜德县| 盐池县| 井研县| 铜山县| 灌阳县| 敦煌市| 米泉市| 清苑县| 朝阳区| 呼和浩特市| 镇巴县| 阳东县| 淳安县| 阜新| 正安县| 合肥市| 新闻| 望谟县| 林口县| 墨玉县| 大石桥市| 湟源县| 金山区| 凤凰县| 耿马| 介休市| 龙井市| 凌云县| 小金县| 镇远县| 长顺县| 璧山县| 安龙县| 习水县| 临澧县| 成武县| 巨野县| 永清县| 开阳县| 江西省|