ejb轻松进阶
一、引言
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即可看到结果。
一、引言
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即可看到结果。
闽公网安备 35060202000074号