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),這個以后再將。
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):負責具體的文檔編輯和撰寫。
以上只是一個大約的組合模式。不同的團隊有各自的側重點和變化。在很大程度上這些也受到具體的產品的影響。我想我在微軟的產品部門的其他同事們會再做補充。希望這些信息能對國內的軟件開發公司能有參考價值。我們希望通過這樣的交流,我們能為中國軟件開發事業的進一步發展盡我們的一點微薄之力。
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>中定義角色名。
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,最后也是通過這個腳本文件來啟動服務?,F在啟動的服務還不支持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/
要學習好一套系統首先要了解它的結構,本文詳細的介紹 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管理界面進行管理。
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"的信息。
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 )
Configuration cfg = new Configuration().configure("myexample.xml"); |
addProperties(Element) addProperties(Properties) setProperties(Properties) setProperty(String, String) |
Properties properties = Properties.load("my.properties"); Configuration config = new Configuration().setProperties(properties).configure(); |
addClass(Class) addFile(File) addFile(String) addURL(URL) |
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"); |