一、引言
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对象在哪里,甚至也不知道这个过程通过了网络,它只知道发出的获取名字属性的请求得到了满意的结果而已。
第二步 建立应用程序目录结构
如你所知的,Java程序中目录结构是很重要的,因为Java中的包(package)是与目录相关的,同时,目录结构不同,程序打包生成(jar)的结构也不同,所以必须引起重视。
我们编写的第一个EJB应用程序的目录结构如图二所示,由上可见,所有的java程序都放在securitybeans目录下(它们都属于一个名为securitybeans的package)。客户代码主要由jsp和html文件组成:musecurityjsp.html文件为静态网页,主要用于显示系统的首页,提供用户输入明文/密文的界面,并负责把用户输入的内容提交给下一个页面(SecuriryProcessPage.jsp);SecurityProcessPage.jsp文件为用JSP(Java Server Pages)编写的动态网页,主要用于生成EJB对象实例,并向EJB对象发送加密/解密请求,并在页面上显示加密/解密结果供用户浏览。
EJB轻松进阶
第三步 编写EJB代码
由前述的目录结构可知,EJB代码包括三个Java文件。
1、Security.java是一个接口,它定义了基本的加密、解密调用接口。注意,由于Security接口可生成EJB对象,所以它必须继承自EJBObject接口。其源代码如下:
文件“Security.java”
package securitybeans;
import java.rmi.RemoteException;
import javax.ejb.EJBObject;
public interface Security extends EJBObject
{
public String encrypt( String strSource ) throws RemoteException;
public String decrypt( String strTarget ) throws RemoteException;
}/* Security */
2、SecurityHome接口可生成EJBHome对象,它负责直接与客户打交道,接收客户的请求,返回处理结果。在EJB规范中,SecurityHome必须继承自EJBHome接口。其源代码如下:
文件“SecurityHome.java”
package securitybeans;
import java.rmi.RemoteException;
import javax.ejb.EJBHome;
import javax.ejb.CreateException;
public interface SecurityHome extends EJBHome
{
Security create() throws CreateException, RemoteException;
}/* EJBHome */
3、SecurityBean类才是真正做“正事”的类,它负责对SecurityHome对象传来的字符串执行加密、解密算法,将得到的结果返回给SecurityHome对象。它是一个Stateless SessionBean,按照EJB规范,必须实现SessionBean接口。其源代码如下:
文件“ScurityBean.java”
package securitybeans;
import java.rmi.RemoteException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
public class SecurityBean implements SessionBean
{
public String encrypt( String strSource )
{
String strTarget = "";
for ( int i = strSource.length() - 1; i >= 0; i -- )
{
strTarget += strSource.charAt( i );
}//for
return strTarget;
}//encrypt()
public String decrypt( String strTarget )
{
String strSource = "";
for ( int i = strTarget.length() - 1; i >= 0; i -- )
{
strSource += strTarget.charAt( i );
}//for
return strSource;
}//decrypt()
public void ejbActivate() {}//ejbActivate()
public void ejbRemove() {}//ejbRemove()
public void ejbPassivate() {}//ejbPassivate()
public void setSessionContext( SessionContext sc ) {}//setSessionContext()
public void ejbCreate() {}//ejbCreate()
public void ejbLoad() {}//ejbLoad()
public void ejbStore() {}//ejbStore()
}/* SecurityBean */
SecurityBean中的ejbActivate()、ejbPassivate()等方法都是SessionBean接口中的方法,由于本程序中这里不需要有实际内容,因此直接实现它就可以了。
EJB轻松进阶
第四步 编写客户代码
便完了EJB代码,下面我们来写客户代码。
1、mysecurityjsp.html文件用于显示一个静态的网页,它提供了用户录入明文/密文的界面,使用户能够录入自己的内容然后提交给服务器端。其源代码如下:
文件mysecurityjsp.html
< HTML >
< HEAD >
< TITLE >EJB示例:数据加密、解密演示系统< /TITLE >
< /HEAD >
< BODY BACKGROUND="bg.gif" >
< CENTER >
< H1 >数据加密解密演示系统< IMG SRC="duke.gif" >< /H1 >
< BR >< BR >< BR >
< FORM METHOD="GET" ACTION="SecurityJSPAlias" >
< TABLE WIDTH="700" HEIGHT="300" BORDER="1" >
< TR >
< TD ALIGN="CENTER" >
< H2 >??加密请求窗??< /H2 >
< P >
请输入明文:
< P >
< INPUT TYPE="TEXT" NAME="SOURCECONTENT" >< /INPUT >
< P >
< INPUT TYPE="SUBMIT" VALUE=" 提 交 " >
< INPUT TYPE="RESET" VALUE=" 重 置 " >
< /TD >
< TD ALIGN="CENTER" >
< H2 >??解密请求窗??< /H2 >
< P >
请输入密文:
< P >
< INPUT TYPE="TEXT" NAME="TARGETCONTENT" >< /INPUT >
< P >
< INPUT TYPE="SUBMIT" VALUE=" 提 交 " >
< INPUT TYPE="RESET" VALUE=" 重 置 " >
< /TD >
< /TR >
< /TABLE >
< /FORM >
< /CENTER >
< /BODY >
< /HTML >
2、SecurityProcessPage.jsp文件是用JSP编写的动态网页,它用于处理mysecurityjsp.html提交过来的内容,并查找、生成EJBHome对象,发送加密/解密请求,并将结果传回客户端。其源代码如下:
文件“SecurityProcessPage.jsp”
< %@ page language="java" info="数据加密解密信息处理系统" % >
< %@ page import="java.rmi.*" % >
< %@ page import="javax.naming.*" % >
< %@ page import="javax.rmi.PortableRemoteObject" % >
< %@ page import="securitybeans.*" % >
< HTML >
< HEAD >
< TITLE >EJB示例:数据加密、解密演示系统< /TITLE >
< /HEAD >
< %
SecurityHome shMain = null;
Try
{
shMain = ( SecurityHome )PortableRemoteObject.narrow( new InitialContext().lookup( "mysecurity" ), SecurityHome.class );
}//try
catch( NamingException ne )
{
ne.printStackTrace();
}//catch
Security security = shMain.create();
% >
< BODY BACKGROUND="bg.gif" >
< CENTER >
< H1 >数据加密解密演示系统< IMG SRC="duke.gif" >< /H1 >< BR >< BR >< BR >
< TABLE WIDTH="700" HEIGHT="300" BORDER="1" >
< TR >
< TD ALIGN="CENTER" >
< %
if ( request.getParameter( "SOURCECONTENT" ) != null )
{
% >
加密生成的密文为:< BR >
< %= security.encrypt( request.getParameter( "SOURCECONTENT" ) ) % >
< %
}//if
% >
< /TD >
< TD ALIGN="CENTER" >
< %
if ( request.getParameter( "TARGETCONTENT" ) != null )
{
% >
解密生成的明文为:< BR >
< %= security.encrypt( request.getParameter( "TARGETCONTENT" ) ) % >
< %
}//if
% >
< /TD >
< /TR >
< /TABLE >
< /CENTER >
< /BODY >
< /HTML >
四、运行第一个EJB应用程序
一个完整的EJB应用程序已经写完了,但是事情还远没有完结。要使一个EJB应用程序能够运行,还有很多事情要做。并且,可能这些事情的工作量并不比编程序本身小多少。
第一步 编译EJB代码
html和jsp代码是不需编译的,但securitybeans目录下的三个.java文件必须编译成.class文件才可运行。由于三个Java文件属于一个包,所以要进行联编。
第二步 启动J2EE服务器
打开一个DOS Shell窗口,键入j2ee ?verbose,稍候片刻,当屏幕出现提示“J2EE server startup complete”时,表示j2eesdk自带的J2EE服务器启动成功了。
第三步 打开配置工具
打开一个DOS Shell窗口(如果你现每次打开一个新的DOS Shell窗口麻烦,可以在前一步中键入start j2ee ?verbose,即可自动弹出一个新的窗口,而原窗口不变),键入deploytool,稍候片刻,即可启动j2eesdk自带的配置工具。Deploytool的启动画面如图三所示。
EJB轻松进阶
第四步 新建一个Application
图四 新建一个Application
点击deploytool的File菜单->New->Application,在弹出的对话框中选中SecurityApp所在的目录,并在Display Name中输入任意一个你想在界面上看到的这个应用程序的名称(比如:SecurityApp)。
第五步 新建一个Enterprise Bean
下面就将进入比较关键的部分!
点击deploytool的File菜单->New->Enterprise Bean,将弹出一个New Enterprise Bean Wizard。点击Next按钮略过第一个界面,在第二个界面中输入JAR Display Name为“SecurityJar”,并点击Edit按钮,在弹出的对话框中将securitybeans目录下的三个.java编译后生成的.class文件加入到SecurityJar的内容中去,如图五所示。
图五 将.class文件添加到SecurityJar中
点击Next到第三个界面,注意:
1. 选中Session为Stateless(缺省为Stateful);
2. 输入Enterprise Bean Name为SecurityBean;
3. 选择Enterprise Bean Class为securitybeans.SecurityBean;
4. 选择Remote Home Interface为securitybeans.SecurityHome;
5. 选择Remote Interface为securitybeans.Security。
至此关键的步骤就完成了,以下几个界面你大可以放心的“Next”了。至最后一个界面点击Finish按钮,即完成了一个Enterprise Bean的添加工作。
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对象在哪里,甚至也不知道这个过程通过了网络,它只知道发出的获取名字属性的请求得到了满意的结果而已。
第二步 建立应用程序目录结构
如你所知的,Java程序中目录结构是很重要的,因为Java中的包(package)是与目录相关的,同时,目录结构不同,程序打包生成(jar)的结构也不同,所以必须引起重视。
我们编写的第一个EJB应用程序的目录结构如图二所示,由上可见,所有的java程序都放在securitybeans目录下(它们都属于一个名为securitybeans的package)。客户代码主要由jsp和html文件组成:musecurityjsp.html文件为静态网页,主要用于显示系统的首页,提供用户输入明文/密文的界面,并负责把用户输入的内容提交给下一个页面(SecuriryProcessPage.jsp);SecurityProcessPage.jsp文件为用JSP(Java Server Pages)编写的动态网页,主要用于生成EJB对象实例,并向EJB对象发送加密/解密请求,并在页面上显示加密/解密结果供用户浏览。
EJB轻松进阶
第三步 编写EJB代码
由前述的目录结构可知,EJB代码包括三个Java文件。
1、Security.java是一个接口,它定义了基本的加密、解密调用接口。注意,由于Security接口可生成EJB对象,所以它必须继承自EJBObject接口。其源代码如下:
文件“Security.java”
package securitybeans;
import java.rmi.RemoteException;
import javax.ejb.EJBObject;
public interface Security extends EJBObject
{
public String encrypt( String strSource ) throws RemoteException;
public String decrypt( String strTarget ) throws RemoteException;
}/* Security */
2、SecurityHome接口可生成EJBHome对象,它负责直接与客户打交道,接收客户的请求,返回处理结果。在EJB规范中,SecurityHome必须继承自EJBHome接口。其源代码如下:
文件“SecurityHome.java”
package securitybeans;
import java.rmi.RemoteException;
import javax.ejb.EJBHome;
import javax.ejb.CreateException;
public interface SecurityHome extends EJBHome
{
Security create() throws CreateException, RemoteException;
}/* EJBHome */
3、SecurityBean类才是真正做“正事”的类,它负责对SecurityHome对象传来的字符串执行加密、解密算法,将得到的结果返回给SecurityHome对象。它是一个Stateless SessionBean,按照EJB规范,必须实现SessionBean接口。其源代码如下:
文件“ScurityBean.java”
package securitybeans;
import java.rmi.RemoteException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
public class SecurityBean implements SessionBean
{
public String encrypt( String strSource )
{
String strTarget = "";
for ( int i = strSource.length() - 1; i >= 0; i -- )
{
strTarget += strSource.charAt( i );
}//for
return strTarget;
}//encrypt()
public String decrypt( String strTarget )
{
String strSource = "";
for ( int i = strTarget.length() - 1; i >= 0; i -- )
{
strSource += strTarget.charAt( i );
}//for
return strSource;
}//decrypt()
public void ejbActivate() {}//ejbActivate()
public void ejbRemove() {}//ejbRemove()
public void ejbPassivate() {}//ejbPassivate()
public void setSessionContext( SessionContext sc ) {}//setSessionContext()
public void ejbCreate() {}//ejbCreate()
public void ejbLoad() {}//ejbLoad()
public void ejbStore() {}//ejbStore()
}/* SecurityBean */
SecurityBean中的ejbActivate()、ejbPassivate()等方法都是SessionBean接口中的方法,由于本程序中这里不需要有实际内容,因此直接实现它就可以了。
EJB轻松进阶
第四步 编写客户代码
便完了EJB代码,下面我们来写客户代码。
1、mysecurityjsp.html文件用于显示一个静态的网页,它提供了用户录入明文/密文的界面,使用户能够录入自己的内容然后提交给服务器端。其源代码如下:
文件mysecurityjsp.html
< HTML >
< HEAD >
< TITLE >EJB示例:数据加密、解密演示系统< /TITLE >
< /HEAD >
< BODY BACKGROUND="bg.gif" >
< CENTER >
< H1 >数据加密解密演示系统< IMG SRC="duke.gif" >< /H1 >
< BR >< BR >< BR >
< FORM METHOD="GET" ACTION="SecurityJSPAlias" >
< TABLE WIDTH="700" HEIGHT="300" BORDER="1" >
< TR >
< TD ALIGN="CENTER" >
< H2 >??加密请求窗??< /H2 >
< P >
请输入明文:
< P >
< INPUT TYPE="TEXT" NAME="SOURCECONTENT" >< /INPUT >
< P >
< INPUT TYPE="SUBMIT" VALUE=" 提 交 " >
< INPUT TYPE="RESET" VALUE=" 重 置 " >
< /TD >
< TD ALIGN="CENTER" >
< H2 >??解密请求窗??< /H2 >
< P >
请输入密文:
< P >
< INPUT TYPE="TEXT" NAME="TARGETCONTENT" >< /INPUT >
< P >
< INPUT TYPE="SUBMIT" VALUE=" 提 交 " >
< INPUT TYPE="RESET" VALUE=" 重 置 " >
< /TD >
< /TR >
< /TABLE >
< /FORM >
< /CENTER >
< /BODY >
< /HTML >
2、SecurityProcessPage.jsp文件是用JSP编写的动态网页,它用于处理mysecurityjsp.html提交过来的内容,并查找、生成EJBHome对象,发送加密/解密请求,并将结果传回客户端。其源代码如下:
文件“SecurityProcessPage.jsp”
< %@ page language="java" info="数据加密解密信息处理系统" % >
< %@ page import="java.rmi.*" % >
< %@ page import="javax.naming.*" % >
< %@ page import="javax.rmi.PortableRemoteObject" % >
< %@ page import="securitybeans.*" % >
< HTML >
< HEAD >
< TITLE >EJB示例:数据加密、解密演示系统< /TITLE >
< /HEAD >
< %
SecurityHome shMain = null;
Try
{
shMain = ( SecurityHome )PortableRemoteObject.narrow( new InitialContext().lookup( "mysecurity" ), SecurityHome.class );
}//try
catch( NamingException ne )
{
ne.printStackTrace();
}//catch
Security security = shMain.create();
% >
< BODY BACKGROUND="bg.gif" >
< CENTER >
< H1 >数据加密解密演示系统< IMG SRC="duke.gif" >< /H1 >< BR >< BR >< BR >
< TABLE WIDTH="700" HEIGHT="300" BORDER="1" >
< TR >
< TD ALIGN="CENTER" >
< %
if ( request.getParameter( "SOURCECONTENT" ) != null )
{
% >
加密生成的密文为:< BR >
< %= security.encrypt( request.getParameter( "SOURCECONTENT" ) ) % >
< %
}//if
% >
< /TD >
< TD ALIGN="CENTER" >
< %
if ( request.getParameter( "TARGETCONTENT" ) != null )
{
% >
解密生成的明文为:< BR >
< %= security.encrypt( request.getParameter( "TARGETCONTENT" ) ) % >
< %
}//if
% >
< /TD >
< /TR >
< /TABLE >
< /CENTER >
< /BODY >
< /HTML >
四、运行第一个EJB应用程序
一个完整的EJB应用程序已经写完了,但是事情还远没有完结。要使一个EJB应用程序能够运行,还有很多事情要做。并且,可能这些事情的工作量并不比编程序本身小多少。
第一步 编译EJB代码
html和jsp代码是不需编译的,但securitybeans目录下的三个.java文件必须编译成.class文件才可运行。由于三个Java文件属于一个包,所以要进行联编。
第二步 启动J2EE服务器
打开一个DOS Shell窗口,键入j2ee ?verbose,稍候片刻,当屏幕出现提示“J2EE server startup complete”时,表示j2eesdk自带的J2EE服务器启动成功了。
第三步 打开配置工具
打开一个DOS Shell窗口(如果你现每次打开一个新的DOS Shell窗口麻烦,可以在前一步中键入start j2ee ?verbose,即可自动弹出一个新的窗口,而原窗口不变),键入deploytool,稍候片刻,即可启动j2eesdk自带的配置工具。Deploytool的启动画面如图三所示。
EJB轻松进阶
第四步 新建一个Application
图四 新建一个Application
点击deploytool的File菜单->New->Application,在弹出的对话框中选中SecurityApp所在的目录,并在Display Name中输入任意一个你想在界面上看到的这个应用程序的名称(比如:SecurityApp)。
第五步 新建一个Enterprise Bean
下面就将进入比较关键的部分!
点击deploytool的File菜单->New->Enterprise Bean,将弹出一个New Enterprise Bean Wizard。点击Next按钮略过第一个界面,在第二个界面中输入JAR Display Name为“SecurityJar”,并点击Edit按钮,在弹出的对话框中将securitybeans目录下的三个.java编译后生成的.class文件加入到SecurityJar的内容中去,如图五所示。
图五 将.class文件添加到SecurityJar中
点击Next到第三个界面,注意:
1. 选中Session为Stateless(缺省为Stateful);
2. 输入Enterprise Bean Name为SecurityBean;
3. 选择Enterprise Bean Class为securitybeans.SecurityBean;
4. 选择Remote Home Interface为securitybeans.SecurityHome;
5. 选择Remote Interface为securitybeans.Security。
至此关键的步骤就完成了,以下几个界面你大可以放心的“Next”了。至最后一个界面点击Finish按钮,即完成了一个Enterprise Bean的添加工作。