当前位置:文档之家› 跟我学EJB 分布式编程技术——利用J2eeSdk13实现EJB编程和部署

跟我学EJB 分布式编程技术——利用J2eeSdk13实现EJB编程和部署

跟我学EJB 分布式编程技术——利用J2eeSdk13实现EJB编程和部署
跟我学EJB 分布式编程技术——利用J2eeSdk13实现EJB编程和部署

目录

1.1利用J2sdkee1.3进行EJB的开发 (2)

1.1.1EJB开发过程概述 (2)

1.1.2打包生成*.ear文件的准备工作 (11)

1.1.3设计和编写EJB部署文件 (22)

1.1.4发布部署示例项目中相关的*.ear文件 (25)

1.1.5执行EJB的客户程序 (27)

1.1.6如何取消所部署的EJB组件 (30)

1.1.7如何打开或者关闭J2EEApp应用程序 (31)

1.1利用J2sdkee1.3进行EJB的开发

1.1.1EJB开发过程概述

1、EJB开发过程

EJB开发基本上都遵循如下的六个步骤:

1)编写构成Bean的各个类与接口的.java文件。

2)将.java文件编译为.class文件。

3)编写部署描述文件。

4)用Jar工具生成Ejb-jar(或者ear)文件。

5)配置EJB服务器,并启动EJB容器。将Ejb-jar文件部署到容器中。

6)编程客户端的测试程序代码以访问EJB组件中所提供的业务方法

每个步骤使用的工具不同,都会生成相应的阶段产品。关于对开发过程的理解和掌握,大家会随着后面讨论的深入而逐渐加深。

2、启动Sun J2EE服务器:如果在前面已经启动了则不需要

(1)设置环境变量

set J2EE_HOME=C:\j2sdkee1.3;

set JAVA_HOME=C:\j2sdk1.4.0;

(2)启动J2EE 服务器

J2ee -verbose 重定向所有日志输出到当前命令窗口

J2ee -version 显示版本号

J2ee -stop 停止j2ee服务器

3、编程各个java文件并在JCreator中进行编译它们

(1)为了能够在JCreate中能够编译EJB 组件的Java程序,应该首先在JCreator中引用j2sdkee1.3\lib下j2ee.jar包文件到JCreator的classpath设置中,这样才能够在JCreator中对EJB的各个接口和类的程序进行编译。

(2)分别编程EJB组件的各个类程序:下面以一个“美元”和“人民币”相互转换的实例来说明

●编程设计REMOTE接口

REMOTE接口主要负责定制商业方法(或者业务逻辑方法),并且必须从EJBObject 接口进行继承,在该接口中声明出各个业务方法,这些商业方法是由服务器端的企业组件实现的。

客户端通过该接口与EJB对象相互作用,EJB容器供应商实现该接口(由EJB容器生成的、实现了Remote接口的EJB对象将包含javax.ejb. EJBObject接口定义的所有方法)。根据 Java接口的特性,在REMOTE接口中定义了的业务方法,则必须在BEAN的实现类中都实现它们。

//本接口需要引入的类或接口

import javax.ejb.EJBObject;

import java.rmi.RemoteException;

public interface Converter extends EJBObject //(1)必须继承EJBObject { //(2)以下为定义业务逻辑方法,每种方法都应该声明RemoteException的异常抛出

public double dollarToYen(double dollars) throws RemoteException;

public double yenToEuro(double yen) throws RemoteException;

}

●编程设计Home接口

HOME接口主要是用来规范容器相关的操作方法,它定义了允许远程客户创建、查找和删除EJB对象的各种方法(HOME接口对象是制造EJB对象的工厂),其中最主要的是定义创建方法(create())并且必须从EJBHome接口进行继承。

HOME接口允许客户端进行如下操作。

·创建一个EJB对象

·删除一个EJB对象

·为EJB Bean获取javax.ejb.EJBMetaData接口

HOME主接口定义一个或多个初始化功能的create(...)方法,每个方法定义了一种创建会话对象的方式,并且与Bean的实现类中的ejbCreate ()方法右对应的关系(参数列表相同,但create ()方法返回为void,而在Home接口中的ejbCreate ()方法则返回为Remote接口类型的对象)。

create方法的参数用来初始化创建的会话对象的状态。对于带参数的create方法主要是用来初始化创建的会话对象的状态,一般适用于有状态的会话Bean。

对于无状态的会话Bean,它本身不需维持自身的状态,所以不需要个性化的创建方法,即create方法是不带有参数的。

另外,无状态的SessionBean不能声明实例变量,每个方法只能操作方法传来的参数,如果需要在引用期间维持一些数据状态,以在其它方法中可以引用,则可以把Bean设计成有状态会话Bean。

//本接口需要引入的类或接口

import java.io.Serializable;

import java.rmi.RemoteException;

import javax.ejb.CreateException;

import javax.ejb.EJBHome;

//(1)只需要开发人员给出一个主接口的定义,接口中方法的实现由容器来完成。一般情况下,习惯将主接口的命名规则规定为Home

public interface ConverterHome extends EJBHome

{//(2)定义一个create()方法,用来获得一个实例Bean的引用,返回的对象类型是组件接口类

Converter create() throws RemoteException, CreateException;

}

编程设计该EJB的Bean 程序:本例为一个Session Bean并且为无状态类型。

一个Session Bean代表了与客户的一个对话, 一旦服务器或客户崩溃, Session Beans 就不存在了。在该Session Bean中实现自己的业务逻辑方法,并且必须实现SessionBean 接口。

//本类需要引入的类或接口

import java.rmi.RemoteException;

import javax.ejb.SessionBean;

import javax.ejb.SessionContext;

public class ConverterBean implements SessionBean //(1)必须实现SessionBean 接口

{

private SessionContext sessionContext; //由于是个会话EJB,因此声明会话上下文

//(2)以下为供客户端调用的业务逻辑方法

public double dollarToYen(double dollars)

{

return dollars * 121.6000;

}

public double yenToEuro(double yen)

{

return yen * 0.0077;

}

public ConverterBean()

{

}

//(3)以下为接口SessionBean中定义的各个生命周期方法,在本程序中必须实现

public void ejbCreate() // HOME中声明的create方法的影射实现

{

}

public void ejbRemove()

{

}

public void ejbActivate()

{

ejbActivate()方法不适用于无状态会话Bean,因此,这个方法是空的。

}

public void ejbPassivate()

{

ejbPassivate()方法不适用于无状态会话Bean,因此,这个方法是空的。

}

public void setSessionContext(SessionContext sc)

{ sessionContext =sc;

//保存上下文环境,以便与容器进行交互。EJB容器将所有的状态信息存放在一个对象中,这个对象称为//EJB Context对象。容器通过调用setSessionContext将Bean和Context关联。

}

}

(3)编程使用该EJB组件的客户端程序,其主要步骤为:

●定位本地接口

Context initial = new InitialContext(); //创建JNDI命名上下文

Object objref = initial.lookup("MyConverter"); //查找与JNDI命名为MyConverter绑定的对象

//造型指向ConverterHome对象的引用为目标类型

ConverterHome home = (ConverterHome) PortableRemoteObject.narrow(objref, ConverterHome.class);

●创建企业组件(EJB)

客户端通过调用本地接口ConverterHome对象的create方法创建ConverterBean类对象,create 方法返回组件Converter类型的对象。然后,远程方法定义的在ConverterBean实现的商业方法可以被客户端调用。当客户端调用create 方法时,EJB容器将实例化ConverterBean对象,然后调用ConverterBean.ejbCreate 方法。

Converter currencyConverter = home.create();

●调用商业方法

客户调用Converter对象的方法,EJB容器将相应的调用运行在J2EE服务器中的ConverterBean类对象实例中的对应的方法。

double amount = currencyConverter.dollarToYen(100.00);

(4)编程使用该EJB组件的客户端程序所应该注意的问题

●在下面的客户程序中的InitialContext类的对象主要用来获取当前客户应用程序的

上下文环境,而方法lookup从组件池中根据部署组件时的JNDI名来查找一个JNDI

对象,并取得一个EJB Home主接口的对象的引用。然后通过Home主接口对象中的

create()方法创建出远程的EJB对象并获得对它的引用。

要注意的是:lookup()方法返回的是一个Object类型的远程主接口对象的存根,为此需

要使用javax.rmi.PortableRemoteObject的narrow()方法来获取一个具体的对象引用。

●narrow()方法:第一个参数是lookup()方法返回的对象,第二个参数是要得到的引

用类型。我们通过narrow()方法并经过造型得到了一个具体的对象实例引用,然后

再调用create()方法获取一个具体组件接口的实例引用,然后就可以与本地一样去

引用这个实例。

●使用完毕后不要忘记将实例的引用指向一个Null以释放它。

//本类需要引入的类或接口

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.rmi.PortableRemoteObject;

//import Converter; //在JDK1.4的编译环境中不需要对它们进行引用

//import ConverterHome;

public class ConverterClient

{

public static void main(String[] args)

{

try

{

/*

调用InitialContext()以得到JNDI命名层次的根;lookup()方法被用来得到Home对象

*/

Context initial = new InitialContext();

Object objref = initial.lookup("MyConverter"); //“MyConverter”为JNDI

的名称

// 客户端使用JNDI来查找会话Bean的主接口

ConverterHome home =

(ConverterHome)PortableRemoteObject.narrow(objref,ConverterHome.class);

Converter currencyConverter = home.create();

double amount = currencyConverter.dollarToYen(100.00); System.out.println(String.valueOf(amount));

amount = currencyConverter.yenToEuro(100.00);

System.out.println(String.valueOf(amount));

currencyConverter.remove();

}

catch (Exception ex)

{

System.err.println("Caught an unexpected exception!"); ex.printStackTrace();

}

}

}

(5)然后分别对各个*.java文件进行编译

(6)最终生成其所对应的各个*.class文件

1.1.2打包生成*.ear文件的准备工作

为了能够对上面的各个*.class文件进行打包以生成*.ear文件,首先做如下的准备工作。

1、启动 J2sdkee1.3中所自带的发布工具deploytool(在启动它之前应该先启动J2EE的服务器,可以直接双击在C:\j2sdkee1.3\bin目录下的deploytool.bat文件)。

然后将出现如下的状态提示

2、进入该程序的图形用户界面

3、对上面的各个*.class文件进行打包以生成*.ear文件

(1)概述:主要涉及如下的几个步骤

●创建一个新的应用程序

●创建出Bean程序所对应的各个*.class的EJB Jar文件

●给该EJB定义一个JNDI的名称

(2)打包之前首先要创建一个新的应用程序

●选择File—New---Application以创建一个新的应用程序

●选择该应用程序所要存储的目录(本例为c:\temp,也即定位存放.ear文件的目录),

并输入该应用程序的文件名称(本例为J2EEApp)。

●然后点击对话框内的New Application按钮后,将出现如下的画面

●最后,点击OK将创建出该应用程序

(3)创建出前面程序所对应的各个*.class的EJB Jar文件,以实现对它们进行打包。

EJB Beans被打包到一个EJB JAR文件(*.ear)中, 它与常规的JAR文件相似, 但包含了一个序列化的DeploymentDescriptor类实例, 其中包括了对安全、事务行为等的设置和Web组件;

然后, 你应该使用服务器厂商提供的部署工具在EJB服务器上安装Bean。一旦Bean被安装到了服务器上, 则客户可调用实例的远程方法。

首先,选择File---New---Enterprise Bean

●出现提示画面,在该画面中主要是列出所要进行的各个步骤

●按Next按钮,在下面的对话框内,选择“Edit”按钮以添加该EJB所对应的各个*.class

文件,并且最后在“JAR Display Name”栏中输入名称为:FirstSessionEjb

●点击右面的“Edit”按钮,在对话框内选择Bean的各个三个*.class文件,最后点

击“Add”按钮

●在点击Add按钮后,将出现如下的画面

●然后再按OK按钮

按Next按钮进入下一步,在该步中主要选择本程序中的EJB Bean所对应的各个类(Enterprise Bean Class、Remote Interface和Remote Home Interface等),并且将bean的类型选择为Stateless(无状态的会话Bean)。

●按下一步按钮,将进入“事务”管理的方式设置。对本例可以选择为

“Container-Managed”由容器来管理组件的事务,并且Transaction Attribute选择为Required。

●在下面的几步中,都采用缺省设置

在下面的客户验证的方式对话框内,点击“Deployment Setting”按钮,在所弹出的对话框内选择客户验证的方式(Support Client Choice)。

最后按下“OK”按钮后,将出现如下的显示

最后,再点击“Next”按钮,将出现部署描述信息汇总提示对话框。在此对话框内,可以了解该 EJB Bean的各个方面的信息,如EJB Bean的名称、方法的名称和参数等。

相关主题
文本预览
相关文档 最新文档