<?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 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();
}
}
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();
}
}