转载:
http://dev.21tx.com/java/ejb/编写第一个EJB应用程序 
   搞清了基本的分布式对象应用程序机理,下面我们就来实地做一个简单的EJB应用程序,一步一步找着做,你会发现——它真的不难! 
   EJB中的Beans有两种,一种是会话Bean(SessionBean),一种是实体Bean(EntityBean)。其中,SessionBean又分为有状态(Stateful)和无状态(Stateless)两种,EntityBean又分为容器管理(Container Managed)和自管理(Bean Managed)两种。我们要做的第一个EJB应用程序是:写一个无状态会话Bean(Stateless SessionBean)。 
这个程序的功能是: 实现一个远程加密、解密演示系统,用户把一段明文发到
服务器端,服务器端执行一定的加密算法(按先后顺序倒排)得到密文,然后把加密完成后的密文发到客户端显示给用户;用户还可发一段加密后的密文到服务器端,服务器端执行一定的解密算法(倒排)得到明文,然后回传显示给用户。 
注: 这里使用的是
Windows平台,并且假定
JDK已经装好,并且认为你至少是编过一个
Java程序的程序员。 
第一步 下载、安装J2EE开发工具箱    编写EJB应用程序必须下载相关的工具箱才行,作为学习试验之用,不须采用很高档的
应用服务器(比如:
WebLogic、WebSphere等),只需采用SUN公司提供的免费开发包就可以了,下载地址为:ftp://202.116.77.69/development/Java/j2sdkee1.2/j2sdkee-img_java ejb/2_1-win.exe。 
   下载后执行这个应用程序,即可完成J2EESDK的本地安装(假定安装在C:\j2sdkee1.3目录)。安装之后还不能立刻用,需要把C:\j2sdkee1.3\lib\j2ee.jar加到系统的ClassPath变量中去,装过JDK的朋友对此肯定不会陌生。做完这些后,最终系统的ClassPath应该至少有.;C:\j2sdk1.4.0-beta3\lib\tools.jar; C:\j2sdk1.4.0-beta3\lib\dt.jar;C:\j2sdkee1.3\lib\j2ee.jar这几项。 
   然后,把C:\j2sdkee1.3\bin目录加到系统的Path变量中,也就是说,系统的Path变量至少应该有%PATH%;C:\j2sdkee1.3\bin;C:\j2sdk1.4.0-beta3\bin这几项。 
以上两步其实和配置
J2SE的方法类似,配过JDK的朋友一定不陌生。
第二步 建立应用程序目录结构    如你所知的,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代码包括三个
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代码,下面我们来写客户代码。 
   1、mysecurity
JSP.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的启动画面如图三所示。 

图三 deploytool的启动画面
新建一个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的添加工作。 
新建一个Web Component 
这个步骤与上一步骤类似    点击deploytool的File菜单->New->Web Component,将弹出一个New Web Component Wizard。点击Next按钮略过第一个界面,在第二个界面中输入WAR Display Name为“SecurityWar”,并点击Edit按钮,在弹出的对话框中将ClientCode目录下的几个客户代码文件加入到SecurityWar的内容中去,如图六所示。 

图六 将ClientCode目录下的文件添加到SecurityJar中 
   点击Next进入第三个界面,选择the type of web component you are creating为
JSP。点击Next进入第四个界面,注意: 
1、 选中JSP FileName为SecurityProcessPage.jsp; 
2、 输入Web Component Name为SecurityProcessPage。 
   两次点击Next按钮进入第五个界面,点击Add按钮,给该Web Component添加一个别名为SecurityAlias。 
   至此主要的步骤就完成了,以下几个界面只需放心点击Next按钮即可,至最后一个界面,点击Finish按钮,即完成了一个Web Component的添加工作。 
第七步 修改JNDI和RootContext    添加完了两个主要的组件之后,还要修改两个配置,才能最后完成EJB的配置。 

图七 SecurityApp的JNDI Names标签页的设置 
   在deploytool主界面左边的树形结构中点击SecurityApp节点,主界面的右边就会显示出四个标签页。在这四个标签页中,JNDI Names标签页需加上mysecurity为JNDI Name,如图七所示;WebContext标签页中需加上SecurityRoot为SecurityWar的ContextRoot,如图八所示。 

图八 SecurityApp的Web Context标签页的设置 
第八步 校验J2EE应用程序    完成以上七个步骤后,整个EJB的配置工作就基本完成了,下面只需简单两个步骤就大功告成,不过也要做好功亏一篑的准备! 
   在deploytool主界面左边的树形结构中点击SecurityApp节点,再点击deploytool的Tools菜单->Verifier…菜单项,在弹出窗口中点击OK按钮,deploytool将自动对EJB应用程序进行测试校验,检查有没有配置错误。稍候片刻,如果提示“There were no failed tests.”,则恭喜你大功告成。如果提示有错,则需要返回去仔细重新检查一步步配置,看看有没有地方疏漏了。配置错误可是很容易出的哟,你要有思想准备。
发布J2EE应用程序 
   如果通过了第八步,则第九步就完全是例行公事了。 
   点击deploytool的Tools菜单->Deploy…菜单项,会弹出一个发布向导对话框窗口,只管放心点击Next到最后一个界面,至最后一个界面点击“Finish”按钮,等待Deployment Progress至最后完成,如图九所示,就彻底搞定了! 

图九 发布完成后的Deployment Progress 
第十步 欣赏程序运行效果    接下来打开一个浏览器窗口,输入http://localhost:8000/SecurityRoot,就可以欣赏到你第一个EJB应用程序的运行效果了。 
   第一个页面如图十所示,显示的是一个数据录入页面,用户可录入一些想要加密/解密的内容,点击提交按钮就可到下一个页面。 
   第二个页面如图十一所示,显示的是对用户请求内容的加密/解密处理结果。 

图十 运行效果第一个页面(加密/解密请求窗) 

图十一 运行效果第二个页面(加密/解密结果显示页) 
   万事开头难,有了第一个EJB应用程序运行通过的体验,以后就好办了。希望本文能为你开个好头! 
	
posted on 2006-10-23 15:24 
jackstudio 阅读(632) 
评论(1)  编辑  收藏  所属分类: 
java 、
ejb