EJB轻松进阶

本文聚焦EJB程序开发,先介绍分布式对象程序原理,接着从目录结构搭建、EJB代码编写、客户代码编写逐步展开,涵盖Security等接口及类的实现。还给出了加密解密示例,最后阐述运行EJB应用程序的步骤,包括编译代码、启动服务器、配置工具等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、引言  
 
  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的添加工作。 
 
Files contained in javax.ejb.jar: META-INF/MANIFEST.MF javax.ejb.AccessLocalException.class javax.ejb.AccessTimeout.class javax.ejb.ActivationConfigProperty.class javax.ejb.AfterBegin.class javax.ejb.AfterCompletion.class javax.ejb.ApplicationException.class javax.ejb.Asynchronous.class javax.ejb.AsyncResult.class javax.ejb.BeforeCompletion.class javax.ejb.ConcurrencyManagement.class javax.ejb.ConcurrencyManagementType.class javax.ejb.ConcurrentAccessException.class javax.ejb.ConcurrentAccessTimeoutException.class javax.ejb.CreateException.class javax.ejb.DependsOn.class javax.ejb.DuplicateKeyException.class javax.ejb.EJB.class javax.ejb.EJBAccessException.class javax.ejb.EJBContext.class javax.ejb.EJBException.class javax.ejb.EJBHome.class javax.ejb.EJBLocalHome.class javax.ejb.EJBLocalObject.class javax.ejb.EJBMetaData.class javax.ejb.EJBObject.class javax.ejb.EJBs.class javax.ejb.EJBTransactionRequiredException.class javax.ejb.EJBTransactionRolledbackException.class javax.ejb.embeddable.EJBContainer.class javax.ejb.EnterpriseBean.class javax.ejb.EntityBean.class javax.ejb.EntityContext.class javax.ejb.FinderException.class javax.ejb.Handle.class javax.ejb.HomeHandle.class javax.ejb.IllegalLoopbackException.class javax.ejb.Init.class javax.ejb.Local.class javax.ejb.LocalBean.class javax.ejb.LocalHome.class javax.ejb.Lock.class javax.ejb.LockType.class javax.ejb.MessageDriven.class javax.ejb.MessageDrivenBean.class javax.ejb.MessageDrivenContext.class javax.ejb.NoMoreTimeoutsException.class javax.ejb.NoSuchEJBException.class javax.ejb.NoSuchEntityException.class javax.ejb.NoSuchObjectLocalException.class javax.ejb.ObjectNotFoundException.class javax.ejb.PostActivate.class javax.ejb.PrePassivate.class javax.ejb.Remote.class javax.ejb.RemoteHome.class javax.ejb.Remove.class javax.ejb.RemoveException.class javax.ejb.Schedule.class javax.ejb.ScheduleExpression.class javax.ejb.Schedules.class javax.ejb.SessionBean.class javax.ejb.SessionContext.class javax.ejb.Session
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值