来源:硅谷动力作者:中流砥柱
一.导言
EJB(Enterprise JavaBeans)是Java编程中比较高级的内容,也是Java程序员从入门级晋升到大师级的门槛。SUN认证Java程序员(SCJP)和SUN认证Java开发人员(SCJD)之间的一个重要区别是,SCJP不测试EJB,但SCJD测试。随着越来越多的企业采用J2EE平台开发电子商务应用系统,EJB开发已经成为当今Java程序员必须面对的问题。
首先用一个例程介绍一般分布式对象应用的基本原理,然后从基本的下载、安装、配置开始逐步介绍EJB的编程方法,让学习EJB成为一件轻松有趣的事情。
二、典型的分布式对象程序
不管是CORBA还是RMI,它们实现分布式对象的策略都是相似的。我们可以用一个简单的程序例子来模拟一个分布式对象程序的组成。
此示例模拟远程请求对象属性的过程。网络上有一个远程对象Dog,现在我们要获取它的name (strName)属性。程序在客户端设置一个stub (Dog_Stub)类,在服务器端启动一个skeleton (Dog_Skeleton)类。两个类都实现了dog接口,Dog_Stub和Dog_Skeleton通过Socket进行远程通信。当客户端DogClient向Dog_Stub发送获取name属性的请求时,Dog_Stub对象通过Socket将方法名“getName()”作为字符串发送给远程Dog_Skeleton对象。Dog_Skeleton对象接收到这个字符串后,根据字符串的内容执行DogServer对象的getName()方法得到狗的名字,然后通过Socket返回给DogStub对象。整个过程都是通过网络实现的,但是对于客户端程序DogClient来说,它并不知道真正的狗对象在哪里,甚至不知道这个过程已经通过了网络。它只知道获取name属性的请求已经被满足。
事实上,CORBA或Java RMI也是以类似的方式实现的,但远没有那么简单。这个程序对于解释分布式对象应用程序的执行机制非常有用。
程序源代码如下:
记录Dog.java
公共接口狗
{
公共字符串getName()引发异常;
}/*狗*/
记录DogClient.java
公共类狗客户端
{
公共静态void main( String[] args)引发异常
{
狗狗=new Dog _ Stub();
string strName=dog . getname();
system . out . println( name: strName );
}//main()
}/*狗客户端*/
记录DogServer.java
公共类DogServer实现Dog
{
字符串strName
intAge
公共字符串getName()引发异常
{
返回strName
}//getName()
公共狗服务器(字符串输入)
{
strName=strNameInput
}//DogServer()
公共静态void main( String[] args)引发异常
{
new Dog _ Skeleton(new Dog server( TOMCAT ));
}//main()
}/* DogServer */
文件Dog_Skeleton.java
导入Java . io . *;
导入Java . net . *;
公共类Dog_Skeleton扩展线程
{
静态服务器套接字ss=null
DogServer ds
公共Dog_Skeleton( DogServer dsInput)抛出异常
{
ds=dsInput
if ( ss==null)
ss=新服务器套接字(8000);
this . start();
}//狗_骷髅()
公共同步void运行()
{
尝试
{
而(ss!=空)
{
socket socket=ss . accept();
ObjectInputStream ois=new ObjectInputStream(socket . getinputstream());
object output stream OOS=new object output stream(socket . get output stream());
String strMethodName=(String)ois . read object();
if(strmethodname . equals( getName()))
OOS . writeobject(ds . getname());
OOS . flush();
ois . close();
OOS . close();
socket . close();
}//当
}//尝试
捕捉(例外e)
{
e . printstacktrace();
}//捕捉
}//run()
}/*狗_骷髅*/
文件Dog_Stub.java
导入Java . io . *;
导入Java . net . *;
公共类Dog_Stub实现Dog
{
插座插座;
ObjectOutputStream oos
对象输入流操作系统:
public Dog_Stub()抛出异常
{
套接字=新套接字(‘武帝’,8000);
OOS=新对象输出流(套接字。getutputstream());
ois=新对象输入流(套接字。getinpertstream());
}//Dog _存根()
公共字符串getname()引发异常
{
OOS。writeobject( getname());
Oos.flush():
返回(字符串)ois。read object();
}//getName()
}/*狗狗_Stub */
运行该分布式对象程序时,首先运行狗服务器,然后在客户端运行狗客户端客户端即可看到结果。