1. 安裝可以從以下網址下載一個J2EE(j2sdkee-1_3-beta2-win.exe):http://java.sun.com/J2EE/j2sdkee-beta/index.Html。也許你已裝了舊版的J2EE SDK 產品,如果是,在安裝新下載的J2EE之前請先卸載或刪掉舊版的J2EE SDK。運行j2sdkee-1_3-beta2-win.exe,按安裝步驟安裝好J2EE。這裡假設你的J2EE安裝在:C:\j2sdkee1.3 目錄下。 2. 設置環境變量在運行J2EE SDK之前,你必須設置以下環境變量: J2EE_HOME - 你的J2EE SDK所安裝的目錄。如本例中的:C:\j2sdkee1.3 。 JAVA_HOME - 你的Java 2 SDK 所安裝的目錄。 PATH - 設置為你安裝J2EE SDK目錄下的bin目錄。如本例的的:C:\j2sdkee1.3\bin 。 ClassPath - 增添%J2EE_HOME%\lib\j2ee.jar到ClassPath中。本例中也可寫為:C:\j2sdkee1.3\lib\j2ee.jar 3. 運行J2EE DOS命令行敲入以下命令: %J2EE_HOME%\bin\j2ee -verbose 顯示以下信息表示運行成功:(不同的版本顯示可能不同) J2EE server listen port: 1050 Naming service started:1050 Binding DataSource, name = jdbc/EstoreDB, url = jdbc:cloudscape:rmi:CloudscapeDB;create=true Binding DataSource, name = jdbc/DB2, url = jdbc:cloudscape:rmi:CloudscapeDB;create=true Binding DataSource, name = jdbc/Cloudscape, url = jdbc:cloudscape:rmi:CloudscapeDB;create=true Binding DataSource, name = jdbc/InventoryDB, url = jdbc:cloudscape:rmi:CloudscapeDB;create=true Binding DataSource, name = jdbc/DB1, url = jdbc:cloudscape:rmi:CloudscapeDB;create=true Binding DataSource, name = jdbc/XACloudscape, url = jdbc/XACloudscape__xa Binding DataSource, name = jdbc/XACloudscape__xa, dataSource = COM.cloudscape.core.RemoteXaDataSource@330913 Starting JMS service ... Initialization complete - waiting for client requests Binding : < JMS Destination : jms/Queue , javax.jms.Queue > Binding : < JMS Destination : jms/Topic , javax.jms.Topic > Binding : < JMS Cnx Factory : jms/TopicConnectionFactory , Topic , No properties > Binding : < JMS Cnx Factory : TopicConnectionFactory , Topic , No properties > Binding : < JMS Cnx Factory : jms/QueueConnectionFactory , Queue , No properties > Binding : < JMS Cnx Factory : QueueConnectionFactory , Queue , No propertIEs > Starting web service at port:8000 Starting secure web service at port:7000 Apache Tomcat/4.0-b4-dev Starting web service at port:9191 apache Tomcat/4.0-b4-dev J2EE server startup complete. 啟動成功後,在IE浏 覽 器 中 訪 問 HTTP://localhost:8000 可 以 看 到 默 認 的 主 頁 信 息 。 4. 編寫和運行HelloWorld程序 J2EE應用程序一般使用RMI(遠程方法調用)來完成客戶端與服務器的交互。當然,其間也少不了EJB的作用。本例為一個J2EE應用程序:客戶端向服務器發送一個問候語:“Hello,Remote Object”。服務器收到該問候語後打印該問候語,並返回一字符串作為應答。客戶端收到此應答後打印它。 RemoteInterface.java /** * 第一步: * 定義一個新的接口繼承javax.ejb.EJBObject。新定義的接口中的每一個方法都必須拋出 * java.rmi.RemoteException異常。 */ public interface RemoteInterface extends javax.ejb.EJBObject { public String message(String str)throws java.rmi.RemoteException; } RemoteObject.java /** * 第二步: * 定義一個類來實現javax.ejb.SessionBean接口。並在該類中實現在第一步中編寫的接口中所定義的方法。 */ public class RemoteObject implements javax.ejb.SessionBean { public String message(String str)throws java.rmi.RemoteException { System.out.println("Remote Object Received From Client: \""+str+"\""); //打印(從客戶端)接收到的字符串。 return "Hello,I'm Remote Object,I received your message: \'"+str+"\'"; //返回一應答字符串。 } public RemoteObject() {} public void ejbCreate() {} public void ejbRemove() {} public void ejbActivate() {} public void ejbPassivate() {} public void setSessionContext(javax.ejb.SessionContext sc) {} } RemoteHome.java /** * 第三步: * 定義一個類繼承javax.ejb.EJBHome 。 */ public interface RemoteHome extends javax.ejb.EJBHome { RemoteInterface create()throws java.rmi.RemoteException,javax.ejb.CreateException; } Client.java /** * 第四步: * 定義客戶端類。 */ public class Client { public static void main(String[] args) { try { javax.naming.Context initContext=new javax.naming.InitialContext(); Object obj=initContext.lookup("HelloWorld"); //遠程查找,由名字得到對應的對象。 RemoteHome home=(RemoteHome)javax.rmi.PortableRemoteObject.narrow(obj,RemoteHome.class); RemoteInterface remote=home.create(); String receiveFromRemote=remote.message("Hello,Remote Object!"); //遠程方法調用 System.out.println("Client Received From Remote Object: \""+receiveFromRemote+"\""); } catch(Exception e) { e.printStackTrace(); } } } 假設以上四個Java文件存於C:\HelloWorld\下,編譯它們如:C:\HelloWorld>javac *.java 。 5. 部署應用程序啟動Application Dopolyment Tool:新開一個Dos窗口,鍵入以下命令,%J2EE_HOME%\bin\deploytool 。該工具啟動速度可能比較慢,要耐心等待。啟動成功後會出現主界面(此時不要關閉Dos窗口)。在該界面中選 擇 File菜 單 ,再選New Application項。在 Application File Name 輸 入 :C:\HelloWorld\HelloWorld.ear 。在 Application Disply Name 輸 入 你所喜歡的顯示名如:HelloWorld。點 擊 OK,在主界面的樹形結構Files-->Applications下將增加新的一項:HelloWorld。這意味著產生了一個新的應用程序。接下來我們要做的就是部署該應用程序。在主界面的樹形結構下選中HelloWorld,然後再在主界面的File菜單中選取New-->Enterprise Bean,在彈出的名為“New Enterprise Bean - Introduction”窗口中選取Next跳過第一步,在接下來的一步中,Create New EJB File in Application項中選HelloWorld,在EJB Display Name中填上你喜歡的名字如:Hello World EJB,點擊Edit按鈕,在彈出的窗口中,Start Directory中填:C:\HelloWorld\,在Available Files中展開樹形結構C:\HelloWorld\,選取RemoteInterface.class、RemoteObject.class、RemoteHome.class、Client.class四項,點Add按鈕添加,然後按OK確定。此時在Contents框中增加了該四個class。點Next進入下一步。Session項選Stateless,意為不保存session狀態。Enterprise Bean Class選RemoteObject。Enterprise Bean Name中填上你喜歡的名字如:Hello World Bean。Remote Home Interface中選RemoteHome,Remote Interface中選RemoteInterface。選Next進入下一步。接下來的步驟可直接點Finish。這時主界面的樹形結構中Files-->Application-->Hello World中將出現Hello World EJB-->Hello World Bean子項。在主界面的樹形結構下選中Hello World,然後再在主界面的Tools菜單中選取Deploy,將彈出新的窗口名為“Deploy Hello World - Introduction”。Object to deploy中選Hello World,Target server中選localhost,選中Retuen Client Jar,在Client Jar File Name中填上:C:\HelloWorld\HelloWorldClient.jar。選Next進入下一步,在Application框的JNDI Name框中雙擊並填上HelloWorld,注意必須與Client.java中Object obj=initContext.lookup("HelloWorld")的“HelloWorld”保持一致。點Next進入下一步。點Finish完成。這時將出現Deployment Progress窗口。如果有誤,該窗口將出現異常信息。如果一切正常,點OK便完成了部署工作。 6. 運行應用程序新開一個Dos窗口。進入C:\HelloWorld\Classes目錄下運行:C:\ HelloWorld\Classes>java -classpath %J2EE_HOME%\lib\j2ee.jar;.;HelloWorldClient.jar; Client 。運行成功則出現如下信息:Client Received From Remote Object: "Hello,I'm Remote Object,I received your message: 'Hello,Remote Object!'" 。而服務端DOS窗口(j2ee -verbose)中出現如下信息:Remote Object Received From ClIEnt: "Hello,Remote Object!" 。 本程序很適J2EE的入門,簡單而明了。本程序由Charly設計編寫,並由其本人多次運行確保無誤。如不能正常運行,請檢查你的環境變量設置是否正確,最好不要直接將以上各命令Copy到DOS窗口中運行,某些字符可能受中文全角字符的影響而不被識別。另外如果某個應用程序部署不成功,可以使用Application Deployment Tool主界面的Edit菜單的Delete項將這個應用程序(如:Hello World)或其子項刪掉。此工具的右鍵功能幾乎沒有,愦憾。 7. 總結 Sun為rmi、Servlet(JSP)、JavaBean等Java技術搖旗吶喊已有多年。J2EE的出現不可謂不是一個大的綜合和封裝。它的出現應該說是這些技術走向成熟的結果。舉個例子,JSP技術去年(2000年)在大中華范圍的書店中都少有介紹,幾近沒有。現在業已鋪天蓋地。ASP似乎已成明日黃花,不過Microsoft C#的推出是否會讓它有所改變?有待觀察。面對競爭對手的壓力,Sun自然對J2EE寄予厚望。應該說,Sun的Java設計一直都很規格和嚴謹。在這方面,當今還沒有其它哪門語言能與之匹敵。J2EE的設計自然也是大手筆。J2EE被設計成多層次的結構。客戶端可包括浏覽器,桌面應用程序,甚至其它設備如PDA程序。服務端可以為Web服務和應用(Application)服務,這分別是Servlet(JSP)和rmi技術的體現。客戶端通過網絡協議向服務端提出請求(Web服務或應用服務),該請求如果需要後台企業信息系統(如數據庫)支持,服務端則直接或在EJB支持下來操作後台企業信息系統(如數據庫),並將結果返回至客戶端;如果不需要後台企業信息系統(數據庫)支持,服務端則直接或在EJB支持下處理該請求,並將結果返回至客戶端。當然其間各環節都少不了安全控制:J2EE的標 准 的 公 開 存 取 控 制 規 則 。應該說,J2EE的Web應用會取得很大成功,因為Servlet(JSP)在Web方面有數不盡的優勢:速度快(比ASP、PHP可能快好幾倍)、跨平台、穩定(這不能不說是得益於Java的規格和嚴謹)、成熟(實際應用已久且應用廣泛)、功能強大。而J2EE的應用服務應該也算不錯,只是其使用的標准界面Swing實在是太耗資源且效率低。君不見,當今用Swing寫的程序哪個不存在以下情形:程序啟動時象國產拖拉機,轟隆轟隆地響--那是讀硬盤的聲音(有些誇張,但不過分);界面刷新慢,明顯的延時;操作不方便,快捷鍵和右鍵功能少(當然這與軟件生產者有關,但Swing要負一部分責任)。此如說Sun的Forte4Java、J2EE SDK、Oracle的Jdeveloper、IBM的Websphere都有此症。作為程序員,我們也許還能接受,以不斷提升硬件來迷補其不足(雖然至今還是不足)。但作為客戶企業,你用Swing給人家做了一個ERP或其中的某一環節,用起來有如此頑症,怎麼向人家解釋?向他(她)說,這是用Swing寫的,所以很慢?對不起,人家不會關心你用什麼寫的,人家給你的也許只有抱怨。除了界面部分外,J2EE的應用服務應該說是很不錯的,如分布式計算。 附:J2EE模型 ClIEnt-Side Server-Side Server-Side Enterprise Presentation Presentation Business Logic Information System +-------------+ +----------+ +----------+ +----------+ | Browser | | Web | | EJB | | | | | | Server | | Container| | | | +-------+ | | +------+ | | +------+ | | | | |Pure | | | |JSP | | | |EJB | | | | | |Html | | | | | | | | | | | | | +-------+ | | +------+ | | +------+ | | | | |<:::::>| |<:::::>| |<:::::>|+--------+| | +-------+ | | +------+ | | +------+ | || || | |Java | | | |JSP | | | |EJB | | || || | |Applet | | | | | | | | | | || || | +-------+ | | +------+ | | +------+ | || || +-------------+ | | | | ||Database|| | |<::::::|::::::::::|::::::>|| & || +-------------+ | | | | ||legacy || | Desktop | | | | | ||Systems || |+-----------+| |+--------+| | +------+ | || || ||Java ||<:::::>||Java ||<:::::>| |EJB | |<:::::>|| || ||Application|| ||Servlet || | | | | || || |+-----------+| |+--------+| | +------+ | |+--------+| +-------------+ | | | | | | | | | | | | +-------------+ | | | | | | |Other Device | | | | | | | | +-------+ | |+--------+| |+--------+| | | | |J2EE | |<:::::>||J2EE ||<:::::>||J2EE ||<:::::>| | | |ClIEnt | | ||Platform|| ||Platform|| | | | +-------+ | |+--------+| |+--------+| | | +-------------+ +----------+ +----------+ +----------+