posts - 66,  comments - 11,  trackbacks - 0
          為將企業(yè)Bean的中間件服務(wù)需求告知EJB容器,開發(fā)者還需生成部署描述符。
          <?xml version="1.0" encoding="UTF-8"?>
          <ejb-jar version="2.1" xmlns="http://java.sun.com/xml/ns/j2ee"
           xmlns:xsi
          ="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation
          ="http://java.sun.com/xml/ns/j2ee
           http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd"
          >
          <!-- 
              <ejb-name>:企業(yè)Bean的昵稱。在部署描述符的其他地方能夠引用它,供設(shè)置其他參數(shù)使用。
              <home>:Home接口的全限定名。
              <remote>:遠程接口的全限定名。
              <local-home>:本地Home接口的全限定名。
              <local>:本地接口的全限定名。
              <ejb-class>:企業(yè)Bean類的全限定名。
              <session-type>:標識企業(yè)Bean是有狀態(tài)的,還是無狀態(tài)的。
              <transaction-type>:事務(wù)類型。
           
          -->
              
          <enterprise-beans>
                  
          <session>
                      
          <ejb-name>Hello</ejb-name>
                      
          <home>examples.HelloHome</home>
                      
          <remote>examples.Hello</remote>
                      
          <local-home>examples.HelloLocalHome</local-home>
                      
          <local>examples.HelloLocal</local>
                      
          <ejb-class>examples.HelloBean</ejb-class>
                      
          <session-type>Stateless</session-type>
                      
          <transaction-type>Container</transaction-type>
                  
          </session>
              
          </enterprise-beans>
          </ejb-jar>

          Ejb-jar文件:
          HelloWorld EJB組件準備好了之后只需將他們打包成Ejb-jar文件。手工創(chuàng)建jar文件
          jar cf HelloWorld.jar *

          注意:ejb-jar.xml文件必須放置在META-INF子目錄中。當EJB容器初次打開Ejb-jar文件時,將在ejb-jar.xml中查找Ejb-jar所包含的EJB組件信息。

          如何調(diào)用EJB組件:
          目前,存在2類客戶:
          1、基于Java RMI-IIOP的客戶。這類客戶使用JNDI,即通過網(wǎng)絡(luò)查找對象。另外,它們使用JTA控制事務(wù)。
          2、CORBA客戶。這類客戶村尋CORBA標準。這對于使用其他語言訪問EJB組件的客戶而言,意義深遠,CORBA客戶使用CORBA命名服務(wù),即通過網(wǎng)絡(luò)查找對象。
          訪問EJB組件的步驟:
          1、查找Home對象
          2、使用Home對象創(chuàng)建EJB對象
          3、調(diào)用EJB對象的業(yè)務(wù)方法
          4、銷毀EJB對象

          查找Home對象:
          開發(fā)EJB應(yīng)用的最主要目標之一是,應(yīng)用代碼能夠"一次編寫,到處運行".如果將已部署在機器A上的EJB應(yīng)用遷移到機器B上,EJB應(yīng)用代碼不需要改動,因為EJB實現(xiàn)了位置透明性。
          借助于命名和目錄服務(wù)能夠?qū)崿F(xiàn)EJB的位置透明性。命名和目錄服務(wù)是能夠在網(wǎng)絡(luò)中存儲和查找資源的產(chǎn)品。

          在企業(yè)部署場景中,EJB服務(wù)器使用命名服務(wù)存儲位置信息,而這些位置信息是用于標識資源的,其中的資源涉及到EJB Home對象、企業(yè)Bean環(huán)境屬性、數(shù)據(jù)庫JDBC驅(qū)動、消息服務(wù)驅(qū)動和其他資源等。通過使用命名服務(wù),應(yīng)用代碼不用將具體機器或資源名硬編碼在代碼中,這就是EJB所具備的位置透明性,它使得代碼具有便攜性。

          為實現(xiàn)位置透明性,EJB容器需要屏蔽掉Home對象的具體位置,使得EJB組件的客戶代碼感知不到其具體位置。客戶不用將Home對象宿主的機器名硬編碼于代碼中。相反,使用JNDI就能夠查找到Home對象。物理上,Home對象可以存在于網(wǎng)絡(luò)上的任何地方,比如在運行EJB容器的同一進程地址空間中,其他機器上的EJB容器中。

          客戶為定位Home對象,它必須提供企業(yè)Bean的Home對象的JNDI昵稱。客戶使用該昵稱標識所需的Home對象。一旦將EJB組件部署到容器中,容器會自動將HelloHome昵稱綁定到Home對象。因此,在對已部署EJB組件的物理機器位置不知情時,開發(fā)者能夠在任一機器上使用該昵稱查找到上述Home對象,借助于JNDI能夠查找到它。JNDI能夠在網(wǎng)絡(luò)上查找命名服務(wù),或在JNDI樹中查找到Home對象,當然,Home對象也可能位于客戶同一進程中,最后一旦找到Home對象,客戶將獲得對它的引用。
          package com.wyq.ejb;

          import java.util.Properties;

          import javax.naming.Context;
          import javax.naming.InitialContext;

          /**
           * 客戶代碼實例,用于調(diào)用簡單、無狀態(tài)會話Bean中的方法。
           *
           
          */
          public class HelloClient {

              
              
          public static void main(String[] args)throws Exception {
                  
          /*
                   * 設(shè)置屬性,用于JNDI初始化,從命令行讀入屬性。
                   
          */
                  Properties props 
          = System.getProperties();
                  
          /*
                   * 初始上下文是連接到JNDI樹的入口。
                   * 借助于環(huán)境屬性,能夠完成JNDI驅(qū)動、服務(wù)器的網(wǎng)絡(luò)地址等的設(shè)置
                   
          */
                  Context ctx 
          = new InitialContext(props);
                  
          /*
                   * 獲得對Home對象的引用。Home對象是創(chuàng)建EJB對象的工廠。
                   
          */
                  Object obj 
          = ctx.lookup("HelloHome");
                  
          /*
                   * Home對象是RMI-IIOP對象。因此,需要借助于特殊的RMI-IIOP造型操作將它們造型成RMI-IIOP對象
                   
          */
                  HelloHome home 
          =(HelloHome)javax.rmi.PortableRemoteObject.narrow(obj,HelloHome.class);
                  
          /*
                   * 使用工廠,來創(chuàng)建Hello EJB對象。
                   
          */
                  Hello hello 
          = home.create();
                  
          /*
                   * 調(diào)用EJB對象的hello()方法。它會將調(diào)用委派給EJB Bean類實例。一旦接收到響應(yīng)結(jié)果,它便會返回。
                   
          */
                  System.out.println(hello.hello());
                  
          /*
                   * 在使用完EJB對象后,需要銷毀它。EJB容器負責(zé)銷毀EJB對象。
                   
          */
                  hello.remove();

              }

          }

          posted on 2009-10-31 12:36 王永慶 閱讀(137) 評論(0)  編輯  收藏 所屬分類: EJB學(xué)習(xí)筆記
          <2009年10月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          關(guān)注blogs

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 正安县| 庄河市| 衡阳市| 南阳市| 昌乐县| 樟树市| 万荣县| 平乐县| 北辰区| 海盐县| 丽水市| 樟树市| 黄梅县| 营山县| 永胜县| 抚宁县| 广平县| 河北省| 乌鲁木齐县| 泸溪县| 锦屏县| 木里| 资阳市| 黔西县| 昆山市| 青海省| 巴塘县| 秭归县| 铅山县| 滨海县| 涡阳县| 元谋县| 滁州市| 普格县| 孝义市| 睢宁县| 高密市| 西宁市| 新河县| 承德市| 宿迁市|