技术开发 频道

Enterprise Java Beans轻松进阶之一

【IT168 技术文档】

一、引言
 
  EJB(Enterprise JavaBeans)是Java程序设计中比较高级的内容,也是Java程序员由入门级向高手级前进的门槛。SUN公司认证Java程序员(SCJP)与SUN公司认证Java开发员(SCJD)之间的一个显著区别就是:SCJP不考EJB,而SCJD要考。随着越来越多的企业采用J2EE平台开发电子商务应用系统,EJB开发已成为今天的Java程序员必须要面对的问题。
 
二、典型的分布式对象程序
 
  不管是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即可看到结果。
0
相关文章