為將企業Bean的中間件服務需求告知EJB容器,開發者還需生成部署描述符。
<?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>:企業Bean的昵稱。在部署描述符的其他地方能夠引用它,供設置其他參數使用。
<home>:Home接口的全限定名。
<remote>:遠程接口的全限定名。
<local-home>:本地Home接口的全限定名。
<local>:本地接口的全限定名。
<ejb-class>:企業Bean類的全限定名。
<session-type>:標識企業Bean是有狀態的,還是無狀態的。
<transaction-type>:事務類型。
-->
<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文件。手工創建jar文件
jar cf HelloWorld.jar *
注意:ejb-jar.xml文件必須放置在META-INF子目錄中。當EJB容器初次打開Ejb-jar文件時,將在ejb-jar.xml中查找Ejb-jar所包含的EJB組件信息。
如何調用EJB組件:
目前,存在2類客戶:
1、基于Java RMI-IIOP的客戶。這類客戶使用JNDI,即通過網絡查找對象。另外,它們使用JTA控制事務。
2、CORBA客戶。這類客戶村尋CORBA標準。這對于使用其他語言訪問EJB組件的客戶而言,意義深遠,CORBA客戶使用CORBA命名服務,即通過網絡查找對象。
訪問EJB組件的步驟:
1、查找Home對象
2、使用Home對象創建EJB對象
3、調用EJB對象的業務方法
4、銷毀EJB對象
查找Home對象:
開發EJB應用的最主要目標之一是,應用代碼能夠"一次編寫,到處運行".如果將已部署在機器A上的EJB應用遷移到機器B上,EJB應用代碼不需要改動,因為EJB實現了位置透明性。
借助于命名和目錄服務能夠實現EJB的位置透明性。命名和目錄服務是能夠在網絡中存儲和查找資源的產品。
在企業部署場景中,EJB服務器使用命名服務存儲位置信息,而這些位置信息是用于標識資源的,其中的資源涉及到EJB Home對象、企業Bean環境屬性、數據庫JDBC驅動、消息服務驅動和其他資源等。通過使用命名服務,應用代碼不用將具體機器或資源名硬編碼在代碼中,這就是EJB所具備的位置透明性,它使得代碼具有便攜性。
為實現位置透明性,EJB容器需要屏蔽掉Home對象的具體位置,使得EJB組件的客戶代碼感知不到其具體位置??蛻舨挥脤ome對象宿主的機器名硬編碼于代碼中。相反,使用JNDI就能夠查找到Home對象。物理上,Home對象可以存在于網絡上的任何地方,比如在運行EJB容器的同一進程地址空間中,其他機器上的EJB容器中。
客戶為定位Home對象,它必須提供企業Bean的Home對象的JNDI昵稱??蛻羰褂迷撽欠Q標識所需的Home對象。一旦將EJB組件部署到容器中,容器會自動將HelloHome昵稱綁定到Home對象。因此,在對已部署EJB組件的物理機器位置不知情時,開發者能夠在任一機器上使用該昵稱查找到上述Home對象,借助于JNDI能夠查找到它。JNDI能夠在網絡上查找命名服務,或在JNDI樹中查找到Home對象,當然,Home對象也可能位于客戶同一進程中,最后一旦找到Home對象,客戶將獲得對它的引用。
package com.wyq.ejb;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
/**
* 客戶代碼實例,用于調用簡單、無狀態會話Bean中的方法。
*
*/
public class HelloClient {
public static void main(String[] args)throws Exception {
/*
* 設置屬性,用于JNDI初始化,從命令行讀入屬性。
*/
Properties props = System.getProperties();
/*
* 初始上下文是連接到JNDI樹的入口。
* 借助于環境屬性,能夠完成JNDI驅動、服務器的網絡地址等的設置
*/
Context ctx = new InitialContext(props);
/*
* 獲得對Home對象的引用。Home對象是創建EJB對象的工廠。
*/
Object obj = ctx.lookup("HelloHome");
/*
* Home對象是RMI-IIOP對象。因此,需要借助于特殊的RMI-IIOP造型操作將它們造型成RMI-IIOP對象
*/
HelloHome home =(HelloHome)javax.rmi.PortableRemoteObject.narrow(obj,HelloHome.class);
/*
* 使用工廠,來創建Hello EJB對象。
*/
Hello hello = home.create();
/*
* 調用EJB對象的hello()方法。它會將調用委派給EJB Bean類實例。一旦接收到響應結果,它便會返回。
*/
System.out.println(hello.hello());
/*
* 在使用完EJB對象后,需要銷毀它。EJB容器負責銷毀EJB對象。
*/
hello.remove();
}
}
posted on 2009-10-31 12:36
王永慶 閱讀(130)
評論(0) 編輯 收藏 所屬分類:
EJB學習筆記