为将企业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组件的客户代码感知不到其具体位置。客户不用将Home对象宿主的机器名硬编码于代码中。相反,使用JNDI就能够查找到Home对象。物理上,Home对象可以存在于网络上的任何地方,比如在运行EJB容器的同一进程地址空间中,其他机器上的EJB容器中。
客户为定位Home对象,它必须提供企业Bean的Home对象的JNDI昵称。客户使用该昵称标识所需的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
王永庆 阅读(120)
评论(0) 编辑 收藏 所属分类:
EJB学习笔记