轉載:http://dev.21tx.com/java/ejb/

          編寫第一個EJB應用程序

             搞清了基本的分布式對象應用程序機理,下面我們就來實地做一個簡單的EJB應用程序,一步一步找著做,你會發現——它真的不難!

             EJB中的Beans有兩種,一種是會話Bean(SessionBean),一種是實體Bean(EntityBean)。其中,SessionBean又分為有狀態(Stateful)和無狀態(Stateless)兩種,EntityBean又分為容器管理(Container Managed)和自管理(Bean Managed)兩種。我們要做的第一個EJB應用程序是:寫一個無狀態會話Bean(Stateless SessionBean)。

          這個程序的功能是: 實現一個遠程加密、解密演示系統,用戶把一段明文發到服務器端,服務器端執行一定的加密算法(按先后順序倒排)得到密文,然后把加密完成后的密文發到客戶端顯示給用戶;用戶還可發一段加密后的密文到服務器端,服務器端執行一定的解密算法(倒排)得到明文,然后回傳顯示給用戶。

          注: 這里使用的是Windows平臺,并且假定JDK已經裝好,并且認為你至少是編過一個Java程序的程序員。

          第一步 下載、安裝J2EE開發工具箱

             編寫EJB應用程序必須下載相關的工具箱才行,作為學習試驗之用,不須采用很高檔的應用服務器(比如:WebLogic、WebSphere等),只需采用SUN公司提供的免費開發包就可以了,下載地址為:ftp://202.116.77.69/development/Java/j2sdkee1.2/j2sdkee-img_java ejb/2_1-win.exe。

             下載后執行這個應用程序,即可完成J2EESDK的本地安裝(假定安裝在C:\j2sdkee1.3目錄)。安裝之后還不能立刻用,需要把C:\j2sdkee1.3\lib\j2ee.jar加到系統的ClassPath變量中去,裝過JDK的朋友對此肯定不會陌生。做完這些后,最終系統的ClassPath應該至少有.;C:\j2sdk1.4.0-beta3\lib\tools.jar; C:\j2sdk1.4.0-beta3\lib\dt.jar;C:\j2sdkee1.3\lib\j2ee.jar這幾項。

             然后,把C:\j2sdkee1.3\bin目錄加到系統的Path變量中,也就是說,系統的Path變量至少應該有%PATH%;C:\j2sdkee1.3\bin;C:\j2sdk1.4.0-beta3\bin這幾項。

          以上兩步其實和配置J2SE的方法類似,配過JDK的朋友一定不陌生。

          第二步 建立應用程序目錄結構

             如你所知的,Java程序中目錄結構是很重要的,因為Java中的包(package)是與目錄相關的,同時,目錄結構不同,程序打包生成(jar)的結構也不同,所以必須引起重視。

             我們編寫的第一個EJB應用程序的目錄結構如圖二所示,由上可見,所有的java程序都放在securitybeans目錄下(它們都屬于一個名為securitybeans的package)。客戶代碼主要由JSP和html文件組成:musecurityjsp.html文件為靜態網頁,主要用于顯示系統的首頁,提供用戶輸入明文/密文的界面,并負責把用戶輸入的內容提交給下一個頁面(SecuriryProcessPage.jsp);SecurityProcessPage.jsp文件為用JSP(Java Server Pages)編寫的動態網頁,主要用于生成EJB對象實例,并向EJB對象發送加密/解密請求,并在頁面上顯示加密/解密結果供用戶瀏覽。


          ?編寫EJB代碼

             由前述的目錄結構可知,EJB代碼包括三個Java文件。

             1、Security.java是一個接口,它定義了基本的加密、解密調用接口。注意,由于Security接口可生成EJB對象,所以它必須繼承自EJBObject接口。其源代碼如下:

          文件“Security.java”

          package securitybeans;

          import java.rmi.RemoteException;

          import javax.ejb.EJBObject;

          public interface Security extends EJBObject

          {

          public String encrypt( String strSource ) throws RemoteException;

          public String decrypt( String strTarget ) throws RemoteException;

          }/* Security */

             2、SecurityHome接口可生成EJBHome對象,它負責直接與客戶打交道,接收客戶的請求,返回處理結果。在EJB規范中,SecurityHome必須繼承自EJBHome接口。其源代碼如下:

          文件“SecurityHome.java”

          package securitybeans;

          import java.rmi.RemoteException;

          import javax.ejb.EJBHome;

          import javax.ejb.CreateException;

          public interface SecurityHome extends EJBHome

          {

          Security create() throws CreateException, RemoteException;

          }/* EJBHome */

             3、SecurityBean類才是真正做“正事”的類,它負責對SecurityHome對象傳來的字符串執行加密、解密算法,將得到的結果返回給SecurityHome對象。它是一個Stateless SessionBean,按照EJB規范,必須實現SessionBean接口。其源代碼如下:

          文件“ScurityBean.java”

          package securitybeans;

          import java.rmi.RemoteException;

          import javax.ejb.SessionBean;

          import javax.ejb.SessionContext;

          public class SecurityBean implements SessionBean

          {

          public String encrypt( String strSource )

          {

          String strTarget = "";

          for ( int i = strSource.length() - 1; i >= 0; i -- )

          {

          strTarget += strSource.charAt( i );

          }//for


          return strTarget;

          }//encrypt()


          public String decrypt( String strTarget )

          {

          String strSource = "";


          for ( int i = strTarget.length() - 1; i >= 0; i -- )

          {

          strSource += strTarget.charAt( i );

          }//for


          return strSource;

          }//decrypt()


          public void ejbActivate() {}//ejbActivate()

          public void ejbRemove() {}//ejbRemove()

          public void ejbPassivate() {}//ejbPassivate()

          public void setSessionContext( SessionContext sc ) {}//setSessionContext()

          public void ejbCreate() {}//ejbCreate()

          public void ejbLoad() {}//ejbLoad()

          public void ejbStore() {}//ejbStore()

          }/* SecurityBean */

             SecurityBean中的ejbActivate()、ejbPassivate()等方法都是SessionBean接口中的方法,由于本程序中這里不需要有實際內容,因此直接實現它就可以了。


          編寫客戶代碼

             便完了EJB代碼,下面我們來寫客戶代碼。

             1、mysecurityJSP.html文件用于顯示一個靜態的網頁,它提供了用戶錄入明文/密文的界面,使用戶能夠錄入自己的內容然后提交給服務器端。其源代碼如下:

          文件mysecurityjsp.html

          < HTML >
          < HEAD >
          < TITLE >EJB示例:數據加密、解密演示系統< /TITLE >
          < /HEAD >
          < BODY BACKGROUND="bg.gif" >

          < CENTER >

          < H1 >數據加密解密演示系統< IMG SRC="duke.gif" >< /H1 >
          < BR >< BR >< BR >
          < FORM METHOD="GET" ACTION="SecurityJSPAlias" >
          < TABLE WIDTH="700" HEIGHT="300" BORDER="1" >
          < TR >
          < TD ALIGN="CENTER" >
          < H2 >——加密請求窗——< /H2 >
          < P >
          請輸入明文:
          < P >
          < INPUT TYPE="TEXT" NAME="SOURCECONTENT" >< /INPUT >
          < P >
          < INPUT TYPE="SUBMIT" VALUE=" 提 交 " >
          < INPUT TYPE="RESET" VALUE=" 重 置 " >
          < /TD >
          < TD ALIGN="CENTER" >
          < H2 >——解密請求窗——< /H2 >
          < P >
          請輸入密文:
          < P >
          < INPUT TYPE="TEXT" NAME="TARGETCONTENT" >< /INPUT >
          < P >
          < INPUT TYPE="SUBMIT" VALUE=" 提 交 " >
          < INPUT TYPE="RESET" VALUE=" 重 置 " >
          < /TD >
          < /TR >
          < /TABLE >
          < /FORM >

          < /CENTER >

          < /BODY >
          < /HTML >

             2、SecurityProcessPage.jsp文件是用JSP編寫的動態網頁,它用于處理mysecurityjsp.html提交過來的內容,并查找、生成EJBHome對象,發送加密/解密請求,并將結果傳回客戶端。其源代碼如下:

          文件“SecurityProcessPage.jsp”

          < %@ page language="Java" info="數據加密解密信息處理系統" % >
          < %@ page import="java.rmi.*" % >
          < %@ page import="javax.naming.*" % >
          < %@ page import="javax.rmi.PortableRemoteObject" % >
          < %@ page import="securitybeans.*" % >

          < HTML >
          < HEAD >
          < TITLE >EJB示例:數據加密、解密演示系統< /TITLE >
          < /HEAD >
          < %
          SecurityHome shMain = null;
          Try
          {
          shMain = ( SecurityHome )PortableRemoteObject.narrow( new InitialContext().lookup( "mysecurity" ), SecurityHome.class );
          }//try
          catch( NamingException ne )
          {
          ne.printStackTrace();
          }//catch
          Security security = shMain.create();
          % >
          < BODY BACKGROUND="bg.gif" >
          < CENTER >
          < H1 >數據加密解密演示系統< IMG SRC="duke.gif" >< /H1 >< BR >< BR >< BR >
          < TABLE WIDTH="700" HEIGHT="300" BORDER="1" >
          < TR >
          < TD ALIGN="CENTER" >
          < %
          if ( request.getParameter( "SOURCECONTENT" ) != null )
          {
          % >
          加密生成的密文為:< BR >
          < %= security.encrypt( request.getParameter( "SOURCECONTENT" ) ) % >
          < %
          }//if
          % >
          < /TD >
          < TD ALIGN="CENTER" >
          < %
          if ( request.getParameter( "TARGETCONTENT" ) != null )
          {
          % >
          解密生成的明文為:< BR >
          < %= security.encrypt( request.getParameter( "TARGETCONTENT" ) ) % >
          < %
          }//if
          % >
          < /TD >
          < /TR >
          < /TABLE >
          < /CENTER >
          < /BODY >
          < /HTML >


          運行第一個EJB應用程序

             一個完整的EJB應用程序已經寫完了,但是事情還遠沒有完結。要使一個EJB應用程序能夠運行,還有很多事情要做。并且,可能這些事情的工作量并不比編程序本身小多少。

          第一步 編譯EJB代碼

             html和JSP代碼是不需編譯的,但securitybeans目錄下的三個.Java文件必須編譯成.class文件才可運行。由于三個Java文件屬于一個包,所以要進行聯編。

          第二步 啟動J2EE服務器

             打開一個DOS Shell窗口,鍵入j2ee –verbose,稍候片刻,當屏幕出現提示“J2EE server startup complete”時,表示j2eesdk自帶的J2EE服務器啟動成功了。

          第三步 打開配置工具

             打開一個DOS Shell窗口(如果你現每次打開一個新的DOS Shell窗口麻煩,可以在前一步中鍵入start j2ee –verbose,即可自動彈出一個新的窗口,而原窗口不變),鍵入deploytool,稍候片刻,即可啟動j2eesdk自帶的配置工具。Deploytool的啟動畫面如圖三所示。


          圖三 deploytool的啟動畫面

          新建一個Application


          圖四 新建一個Application


             點擊deploytool的File菜單->New->Application,在彈出的對話框中選中SecurityApp所在的目錄,并在Display Name中輸入任意一個你想在界面上看到的這個應用程序的名稱(比如:SecurityApp)。

          第五步 新建一個EntERPrise Bean

             下面就將進入比較關鍵的部分!

             點擊deploytool的File菜單->New->Enterprise Bean,將彈出一個New Enterprise Bean Wizard。點擊Next按鈕略過第一個界面,在第二個界面中輸入JAR Display Name為“SecurityJar”,并點擊Edit按鈕,在彈出的對話框中將securitybeans目錄下的三個.Java編譯后生成的.class文件加入到SecurityJar的內容中去,如圖五所示。


          圖五 將.class文件添加到SecurityJar中


             點擊Next到第三個界面,注意:

          1. 選中Session為Stateless(缺省為Stateful);

          2. 輸入Enterprise Bean Name為SecurityBean;

          3. 選擇Enterprise Bean Class為securitybeans.SecurityBean;

          4. 選擇Remote Home Interface為securitybeans.SecurityHome;

          5. 選擇Remote Interface為securitybeans.Security。

             至此關鍵的步驟就完成了,以下幾個界面你大可以放心的“Next”了。至最后一個界面點擊Finish按鈕,即完成了一個Enterprise Bean的添加工作。


          新建一個Web Component

          這個步驟與上一步驟類似


             點擊deploytool的File菜單->New->Web Component,將彈出一個New Web Component Wizard。點擊Next按鈕略過第一個界面,在第二個界面中輸入WAR Display Name為“SecurityWar”,并點擊Edit按鈕,在彈出的對話框中將ClientCode目錄下的幾個客戶代碼文件加入到SecurityWar的內容中去,如圖六所示。


          圖六 將ClientCode目錄下的文件添加到SecurityJar中


             點擊Next進入第三個界面,選擇the type of web component you are creating為JSP。點擊Next進入第四個界面,注意:

          1、 選中JSP FileName為SecurityProcessPage.jsp;

          2、 輸入Web Component Name為SecurityProcessPage。

             兩次點擊Next按鈕進入第五個界面,點擊Add按鈕,給該Web Component添加一個別名為SecurityAlias。

             至此主要的步驟就完成了,以下幾個界面只需放心點擊Next按鈕即可,至最后一個界面,點擊Finish按鈕,即完成了一個Web Component的添加工作。

          第七步 修改JNDI和RootContext

             添加完了兩個主要的組件之后,還要修改兩個配置,才能最后完成EJB的配置。


          圖七 SecurityApp的JNDI Names標簽頁的設置


             在deploytool主界面左邊的樹形結構中點擊SecurityApp節點,主界面的右邊就會顯示出四個標簽頁。在這四個標簽頁中,JNDI Names標簽頁需加上mysecurity為JNDI Name,如圖七所示;WebContext標簽頁中需加上SecurityRoot為SecurityWar的ContextRoot,如圖八所示。


          圖八 SecurityApp的Web Context標簽頁的設置


          第八步 校驗J2EE應用程序

             完成以上七個步驟后,整個EJB的配置工作就基本完成了,下面只需簡單兩個步驟就大功告成,不過也要做好功虧一簣的準備!

             在deploytool主界面左邊的樹形結構中點擊SecurityApp節點,再點擊deploytool的Tools菜單->Verifier…菜單項,在彈出窗口中點擊OK按鈕,deploytool將自動對EJB應用程序進行測試校驗,檢查有沒有配置錯誤。稍候片刻,如果提示“There were no failed tests.”,則恭喜你大功告成。如果提示有錯,則需要返回去仔細重新檢查一步步配置,看看有沒有地方疏漏了。配置錯誤可是很容易出的喲,你要有思想準備。



          發布J2EE應用程序

             如果通過了第八步,則第九步就完全是例行公事了。

             點擊deploytool的Tools菜單->Deploy…菜單項,會彈出一個發布向導對話框窗口,只管放心點擊Next到最后一個界面,至最后一個界面點擊“Finish”按鈕,等待Deployment Progress至最后完成,如圖九所示,就徹底搞定了!


          圖九 發布完成后的Deployment Progress


          第十步 欣賞程序運行效果

             接下來打開一個瀏覽器窗口,輸入http://localhost:8000/SecurityRoot,就可以欣賞到你第一個EJB應用程序的運行效果了。

             第一個頁面如圖十所示,顯示的是一個數據錄入頁面,用戶可錄入一些想要加密/解密的內容,點擊提交按鈕就可到下一個頁面。

             第二個頁面如圖十一所示,顯示的是對用戶請求內容的加密/解密處理結果。


          圖十 運行效果第一個頁面(加密/解密請求窗)


          圖十一 運行效果第二個頁面(加密/解密結果顯示頁)


             萬事開頭難,有了第一個EJB應用程序運行通過的體驗,以后就好辦了。希望本文能為你開個好頭!

          posted on 2006-10-23 15:24 jackstudio 閱讀(618) 評論(1)  編輯  收藏 所屬分類: javaejb
          主站蜘蛛池模板: 辽宁省| 醴陵市| 卫辉市| 中西区| 洛宁县| 甘南县| 娄底市| 泸溪县| 泗阳县| 宜阳县| 伊川县| 广灵县| 新闻| 明星| 泸州市| 江都市| 大埔区| 白玉县| 固镇县| 陇西县| 丹棱县| 清徐县| 姜堰市| 长宁县| 台湾省| 泗洪县| 远安县| 马关县| 晋中市| 山东省| 郑州市| 利津县| 屯昌县| 东源县| 德州市| 泰宁县| 徐州市| 吉水县| 邢台市| 永昌县| 昌乐县|