发新话题
打印

[转载]Enterprise Java Beans轻松进阶之一

[转载]Enterprise Java Beans轻松进阶之一

文章作者: 太阳

一、引言

EJB(Enterprise JavaBeans)是Java程序设计中比较高级的内容,也是Java程序员由入门级向高手级前进的门槛。SUN公司认证Java程序员(SCJP)与SUN公司认证Java开发员(SCJD)之间的一个显著区别就是:SCJP不考EJB,而SCJD要考。随着越来越多的企业采用J2EE平台开发电子商务应用系统,EJB开发已成为今天的Java程序员必须要面对的问题。

二、典型的分布式对象程序

不管是CORBA还是RMI,其实现分布式对象的策略都是相似的,我们可以用一个简单的程蚶永茨D庖桓龇植际蕉韵蟪绦虻墓钩伞?BR>
这个例子模拟了一个远程请求对象属性的过程。有一个远程对象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即可看到结果。

TOP

发新话题