一、引言 
          
  EJB(Enterprise JavaBeans)是Java程序设计中比较高级的内容,也是Java程序员由入门级向高手级前进的门槛。SUN公司认证Java程序员(SCJP)与SUN公司认证Java开发员(SCJD)之间的一个显著区别就是:SCJP不考EJB,而SCJD要考。随着越来越多的企业采用J2EE平台开发电子商务应用系统,EJB开发已成为今天的Java程序员必须要面对的问题。 
  本文首先以一个例程介绍了一般分布式对象应用程序的基本原理,然后从基本的下载、安装、配置开始,逐步介绍EJB程序编程的方法,从而使EJB的学习成为一件轻松而有趣的事情。 
二、典型的分布式对象程序 
  不管是CORBA还是RMI,其实现分布式对象的策略都是相似的,我们可以用一个简单的程序例子来模拟一个分布式对象程序的构成。 
 
这个例子模拟了一个远程请求对象属性的过程。有一个远程对象Dog在网络上,现在要得到它的名字(strName)属性。程序在客户端设一个存根(Dog_Stub)类,在服务器端启动一个骨架(dog_Skeleton)类,这两个类都实现了Dog接口,Dog_Stub与Dog_Skeleton通过Socket进行远程通信。当客户程序DogClient向Dog_Stub发出获取名字属性的请求时,Dog_Stub对象把方法名“getName()”作为一个字符串通过Socket发给远程的Dog_Skeleton对象,Dog_Skeleton对象收到这个字符串后再根据字符串的内容执行DogServer对象的getName()方法,得到Dog的名字,然后又通过Socket返回给DogStub对象。整个流程通过网络实现,但对于客户程序DogClient来讲,它并不知道真正的Dog对象在哪里,甚至也不知道这个过程通过了网络,它只知道发出的获取名字属性的请求得到了满意的结果而已。
  事实上,CORBA或Java RMI的实现方式与此类似,只不过远没有这么简单而已。这个程序对于说明分布式对象应用程序的执行机理是很有用的。 
程序源代码如下所示: 
文件Dog.java 
public interface Dog 
{ 
public String getName() throws Exception; 
}/* Dog */ 
文件DogClient.java 
public class DogClient 
{ 
public static void main( String[] args ) throws Exception 
{ 
Dog dog = new Dog_Stub(); 
String strName = dog.getName(); 
System.out.println( "姓名:" + strName ); 
}//main() 
}/* DogClient */ 
文件DogServer.java 
public class DogServer implements Dog 
{ 
String strName; 
int intAge; 
public String getName() throws Exception 
{ 
return strName; 
}//getName() 
public DogServer( String strNameInput ) 
{ 
strName = strNameInput; 
}//DogServer() 
public static void main( String[] args ) throws Exception 
{ 
New Dog_Skeleton( new DogServer( "TOMCAT" ) ); 
}//main() 
}/* DogServer */ 
文件Dog_Skeleton.java 
import java.io.*; 
import java.net.*; 
public class Dog_Skeleton extends Thread 
{ 
static ServerSocket ss = null; 
DogServer ds; 
public Dog_Skeleton( DogServer dsInput ) throws Exception 
{ 
ds = dsInput; 
if ( ss == null ) 
ss = new ServerSocket( 8000 ); 
this.start(); 
}//Dog_Skeleton() 
public synchronized void run() 
{ 
Try 
{ 
while ( ss != null ) 
{ 
Socket socket = ss.accept(); 
ObjectInputStream ois = new ObjectInputStream( socket.getInputStream() ); 
ObjectOutputStream oos = new ObjectOutputStream( socket.getOutputStream() ); 
String strMethodName = ( String )ois.readObject(); 
if ( strMethodName.equals( "getName()" ) ) 
oos.writeObject( ds.getName() ); 
oos.flush(); 
ois.close(); 
oos.close(); 
socket.close(); 
}//while 
}//try 
catch( Exception e ) 
{ 
e.printStackTrace(); 
}//catch 
}//run() 
}/* Dog_Skeleton */ 
文件Dog_Stub.java 
import java.io.*; 
import java.net.*; 
Public class Dog_Stub implements Dog 
{ 
Socket socket; 
ObjectOutputStream oos; 
ObjectInputStream ois; 
public Dog_Stub() throws Exception 
{ 
socket = new Socket( "wudi", 8000 ); 
Oos = new ObjectOutputStream( socket.getOutputStream() ); 
Ois = new ObjectInputStream( socket.getInputStream() ); 
}//Dog_Stub() 
public String getName() throws Exception 
{ 
Oos.writeObject( "getName()" ); 
Oos.flush(); 
return ( String )ois.readObject(); 
}//getName() 
}/* Dog_Stub */ 
运行该分布式对象程序时,首先运行DogServer,然后在客户端运行DogClient即可看到结果。