目录
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)只需要开发人员给出一个主接口的定义,接口中方法的实现由容器来完成。一般情况下,习惯将主接口的命名规则规定为
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的名称、方法的名称和参数等。