posts - 66,  comments - 11,  trackbacks - 0
为将企业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 王永庆 阅读(112) 评论(0)  编辑  收藏 所属分类: EJB学习笔记

只有注册用户登录后才能发表评论。


网站导航:
 
<2009年10月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用链接

留言簿(1)

随笔分类

随笔档案

关注blogs

搜索

  •  

最新评论

阅读排行榜

评论排行榜