﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava--随笔分类-ejb</title><link>http://www.blogjava.net/jackstudio/category/12676.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 03 Mar 2007 08:56:59 GMT</lastBuildDate><pubDate>Sat, 03 Mar 2007 08:56:59 GMT</pubDate><ttl>60</ttl><item><title>EJB轻松进阶</title><link>http://www.blogjava.net/jackstudio/archive/2006/10/23/76764.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Mon, 23 Oct 2006 07:24:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/10/23/76764.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/76764.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/10/23/76764.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/76764.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/76764.html</trackback:ping><description><![CDATA[转载：<a href="http://dev.21tx.com/java/ejb/">http://dev.21tx.com/java/ejb/</a><br /><br /><strong>编写第一个EJB应用程序 <br /><br /></strong>　　 搞清了基本的分布式对象应用程序机理，下面我们就来实地做一个简单的EJB应用程序，一步一步找着做，你会发现——它真的不难！ <br /><br />　　 EJB中的Beans有两种，一种是会话Bean（SessionBean），一种是实体Bean（EntityBean）。其中，SessionBean又分为有状态（Stateful）和无状态（Stateless）两种，EntityBean又分为容器管理（Container Managed）和自管理（Bean Managed）两种。我们要做的第一个EJB应用程序是：写一个无状态会话Bean（Stateless SessionBean）。 <br /><br /><strong>这个程序的功能是： </strong>实现一个远程加密、解密演示系统，用户把一段明文发到<a href="http://www.21tx.com/server/" target="_blank"><font color="#3366cc">服务器</font></a>端，服务器端执行一定的加密算法（按先后顺序倒排）得到密文，然后把加密完成后的密文发到客户端显示给用户；用户还可发一段加密后的密文到服务器端，服务器端执行一定的解密算法（倒排）得到明文，然后回传显示给用户。 <br /><br /><strong>注： </strong>这里使用的是<a href="http://dev.21tx.com/os/windows/" target="_blank"><font color="#3366cc">Windows</font></a>平台，并且假定<a href="http://dev.21tx.com/java/base/jdk/" target="_blank"><font color="#3366cc">JDK</font></a>已经装好，并且认为你至少是编过一个<a href="http://dev.21tx.com/java/" target="_blank"><font color="#3366cc">Java</font></a>程序的程序员。 <br /><br /><strong>第一步 <a href="http://dl.21tx.com/" target="_blank"><font color="#3366cc">下载</font></a>、安装<a href="http://dev.21tx.com/java/j2ee/" target="_blank"><font color="#3366cc">J2EE</font></a>开发工具箱 </strong><br /><br />　　 编写EJB应用程序必须下载相关的工具箱才行，作为学习试验之用，不须采用很高档的<a href="http://dev.21tx.com/java/as/" target="_blank"><font color="#3366cc">应用服务器</font></a>（比如：<a href="http://dev.21tx.com/web/" target="_blank"><font color="#3366cc">Web</font></a>Logic、WebSphere等），只需采用SUN公司提供的免费开发包就可以了，下载地址为：ftp://202.116.77.69/development/Java/j2sdkee1.2/j2sdkee-img_java ejb/2_1-win.exe。 <br /><br />　　 下载后执行这个应用程序，即可完成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这几项。 <br /><br />　　 然后，把C:\j2sdkee1.3\bin目录加到系统的Path变量中，也就是说，系统的Path变量至少应该有%PATH%;C:\j2sdkee1.3\bin;C:\j2sdk1.4.0-beta3\bin这几项。 <br /><br />以上两步其实和配置<a href="http://dev.21tx.com/java/j2se/" target="_blank"><font color="#3366cc">J2SE</font></a>的方法类似，配过JDK的朋友一定不陌生。<br /><br /><strong>第二步 建立应用程序目录结构 </strong><br /><br />　　 如你所知的，Java程序中目录结构是很重要的，因为Java中的包（package）是与目录相关的，同时，目录结构不同，程序打包生成（jar）的结构也不同，所以必须引起重视。 <br /><p align="center"><img src="http://image.21tx.com/image/20050421/16262.gif" border="1" /></p>　　 我们编写的第一个EJB应用程序的目录结构如图二所示，由上可见，所有的java程序都放在securitybeans目录下（它们都属于一个名为securitybeans的package）。客户代码主要由<a href="http://dev.21tx.com/java/jsp/" target="_blank"><font color="#3366cc">JSP</font></a>和html文件组成：musecurityjsp.html文件为静态网页，主要用于显示系统的首页，提供用户输入明文/密文的界面，并负责把用户输入的内容提交给下一个页面（SecuriryProcessPage.jsp）；SecurityProcessPage.jsp文件为用JSP（Java Server Pages）编写的动态网页，主要用于生成EJB对象实例，并向EJB对象发送加密/解密请求，并在页面上显示加密/解密结果供用户浏览。<br /><br /><br /><strong> 编写EJB代码 <br /><br /></strong>　　 由前述的目录结构可知，EJB代码包括三个<a href="http://dev.21tx.com/java/" target="_blank"><font color="#3366cc">Java</font></a>文件。 <br /><br />　　 1、Security.java是一个接口，它定义了基本的加密、解密调用接口。注意，由于Security接口可生成EJB对象，所以它必须继承自EJBObject接口。其源代码如下： <br /><br />文件“Security.java” <br /><br />package securitybeans; <br /><br />import java.rmi.RemoteException; <br /><br />import javax.ejb.EJBObject; <br /><br />public interface Security extends EJBObject <br /><br />{ <br /><br />public String encrypt( String strSource ) throws RemoteException; <br /><br />public String decrypt( String strTarget ) throws RemoteException; <br /><br />}/* Security */ <br /><br />　　 2、SecurityHome接口可生成EJBHome对象，它负责直接与客户打交道，接收客户的请求，返回处理结果。在EJB规范中，SecurityHome必须继承自EJBHome接口。其源代码如下： <br /><br />文件“SecurityHome.java” <br /><br />package securitybeans; <br /><br />import java.rmi.RemoteException; <br /><br />import javax.ejb.EJBHome; <br /><br />import javax.ejb.CreateException; <br /><br />public interface SecurityHome extends EJBHome <br /><br />{ <br /><br />Security create() throws CreateException, RemoteException; <br /><br />}/* EJBHome */ <br /><br />　　 3、SecurityBean类才是真正做“正事”的类，它负责对SecurityHome对象传来的字符串执行加密、解密算法，将得到的结果返回给SecurityHome对象。它是一个Stateless SessionBean，按照EJB规范，必须实现SessionBean接口。其源代码如下： <br /><br />文件“ScurityBean.java” <br /><br />package securitybeans; <br /><br />import java.rmi.RemoteException; <br /><br />import javax.ejb.SessionBean; <br /><br />import javax.ejb.SessionContext; <br /><br />public class SecurityBean implements SessionBean <br /><br />{ <br /><br />public String encrypt( String strSource ) <br /><br />{ <br /><br />String strTarget = ""; <br /><br />for ( int i = strSource.length() - 1; i &gt;= 0; i -- ) <br /><br />{ <br /><br />strTarget += strSource.charAt( i ); <br /><br />}//for <br /><br /><br />return strTarget; <br /><br />}//encrypt() <br /><br /><br />public String decrypt( String strTarget ) <br /><br />{ <br /><br />String strSource = ""; <br /><br /><br />for ( int i = strTarget.length() - 1; i &gt;= 0; i -- ) <br /><br />{ <br /><br />strSource += strTarget.charAt( i ); <br /><br />}//for <br /><br /><br />return strSource; <br /><br />}//decrypt() <br /><br /><br />public void ejbActivate() {}//ejbActivate() <br /><br />public void ejbRemove() {}//ejbRemove() <br /><br />public void ejbPassivate() {}//ejbPassivate() <br /><br />public void setSessionContext( SessionContext sc ) {}//setSessionContext() <br /><br />public void ejbCreate() {}//ejbCreate() <br /><br />public void ejbLoad() {}//ejbLoad() <br /><br />public void ejbStore() {}//ejbStore() <br /><br />}/* SecurityBean */ <br /><br />　　 SecurityBean中的ejbActivate()、ejbPassivate()等方法都是SessionBean接口中的方法，由于本程序中这里不需要有实际内容，因此直接实现它就可以了。<br /><br /><br /><strong>编写客户代码 <br /><br /></strong>　　 便完了EJB代码，下面我们来写客户代码。 <br /><br />　　 1、mysecurity<a href="http://dev.21tx.com/java/jsp/" target="_blank"><font color="#3366cc">JSP</font></a>.html文件用于显示一个静态的网页，它提供了用户录入明文/密文的界面，使用户能够录入自己的内容然后提交给<a href="http://www.21tx.com/server/" target="_blank"><font color="#3366cc">服务器</font></a>端。其源代码如下： <br /><br />文件mysecurityjsp.html <br /><br />&lt; HTML &gt; <br />&lt; HEAD &gt; <br />&lt; TITLE &gt;EJB示例：数据加密、解密演示系统&lt; /TITLE &gt; <br />&lt; /HEAD &gt; <br />&lt; BODY BACKGROUND="bg.gif" &gt; <br /><br />&lt; CENTER &gt; <br /><br />&lt; H1 &gt;数据加密解密演示系统&lt; IMG SRC="duke.gif" &gt;&lt; /H1 &gt; <br />&lt; BR &gt;&lt; BR &gt;&lt; BR &gt; <br />&lt; FORM METHOD="GET" ACTION="SecurityJSPAlias" &gt; <br />&lt; TABLE WIDTH="700" HEIGHT="300" BORDER="1" &gt; <br />&lt; TR &gt; <br />&lt; TD ALIGN="CENTER" &gt; <br />&lt; H2 &gt;——加密请求窗——&lt; /H2 &gt; <br />&lt; P &gt; <br />请输入明文： <br />&lt; P &gt; <br />&lt; INPUT TYPE="TEXT" NAME="SOURCECONTENT" &gt;&lt; /INPUT &gt; <br />&lt; P &gt; <br />&lt; INPUT TYPE="SUBMIT" VALUE=" 提 交 " &gt; <br />&lt; INPUT TYPE="RESET" VALUE=" 重 置 " &gt; <br />&lt; /TD &gt; <br />&lt; TD ALIGN="CENTER" &gt; <br />&lt; H2 &gt;——解密请求窗——&lt; /H2 &gt; <br />&lt; P &gt; <br />请输入密文： <br />&lt; P &gt; <br />&lt; INPUT TYPE="TEXT" NAME="TARGETCONTENT" &gt;&lt; /INPUT &gt; <br />&lt; P &gt; <br />&lt; INPUT TYPE="SUBMIT" VALUE=" 提 交 " &gt; <br />&lt; INPUT TYPE="RESET" VALUE=" 重 置 " &gt; <br />&lt; /TD &gt; <br />&lt; /TR &gt; <br />&lt; /TABLE &gt; <br />&lt; /FORM &gt; <br /><br />&lt; /CENTER &gt; <br /><br />&lt; /BODY &gt; <br />&lt; /HTML &gt; <br /><br />　　 2、SecurityProcessPage.jsp文件是用JSP编写的动态网页，它用于处理mysecurityjsp.html提交过来的内容，并查找、生成EJBHome对象，发送加密/解密请求，并将结果传回客户端。其源代码如下： <br /><br />文件“SecurityProcessPage.jsp” <br /><br />&lt; %@ page language="<a href="http://dev.21tx.com/java/" target="_blank"><font color="#3366cc">Java</font></a>" info="数据加密解密信息处理系统" % &gt; <br />&lt; %@ page import="java.rmi.*" % &gt; <br />&lt; %@ page import="javax.naming.*" % &gt; <br />&lt; %@ page import="javax.rmi.PortableRemoteObject" % &gt; <br />&lt; %@ page import="securitybeans.*" % &gt; <br /><br />&lt; HTML &gt; <br />&lt; HEAD &gt; <br />&lt; TITLE &gt;EJB示例：数据加密、解密演示系统&lt; /TITLE &gt; <br />&lt; /HEAD &gt; <br />&lt; % <br />SecurityHome shMain = null; <br />Try <br />{ <br />shMain = ( SecurityHome )PortableRemoteObject.narrow( new InitialContext().lookup( "mysecurity" ), SecurityHome.class ); <br />}//try <br />catch( NamingException ne ) <br />{ <br />ne.printStackTrace(); <br />}//catch <br />Security security = shMain.create(); <br />% &gt; <br />&lt; BODY BACKGROUND="bg.gif" &gt; <br />&lt; CENTER &gt; <br />&lt; H1 &gt;数据加密解密演示系统&lt; IMG SRC="duke.gif" &gt;&lt; /H1 &gt;&lt; BR &gt;&lt; BR &gt;&lt; BR &gt; <br />&lt; TABLE WIDTH="700" HEIGHT="300" BORDER="1" &gt; <br />&lt; TR &gt; <br />&lt; TD ALIGN="CENTER" &gt; <br />&lt; % <br />if ( request.getParameter( "SOURCECONTENT" ) != null ) <br />{ <br />% &gt; <br />加密生成的密文为：&lt; BR &gt; <br />&lt; %= security.encrypt( request.getParameter( "SOURCECONTENT" ) ) % &gt; <br />&lt; % <br />}//if <br />% &gt; <br />&lt; /TD &gt; <br />&lt; TD ALIGN="CENTER" &gt; <br />&lt; % <br />if ( request.getParameter( "TARGETCONTENT" ) != null ) <br />{ <br />% &gt; <br />解密生成的明文为：&lt; BR &gt; <br />&lt; %= security.encrypt( request.getParameter( "TARGETCONTENT" ) ) % &gt; <br />&lt; % <br />}//if <br />% &gt; <br />&lt; /TD &gt; <br />&lt; /TR &gt; <br />&lt; /TABLE &gt; <br />&lt; /CENTER &gt; <br />&lt; /BODY &gt; <br />&lt; /HTML &gt; <br /><br /><br /><strong>运行第一个EJB应用程序 <br /><br /></strong>　　 一个完整的EJB应用程序已经写完了，但是事情还远没有完结。要使一个EJB应用程序能够运行，还有很多事情要做。并且，可能这些事情的工作量并不比编程序本身小多少。 <br /><br /><strong>第一步 编译EJB代码 </strong><br /><br />　　 html和<a href="http://dev.21tx.com/java/jsp/" target="_blank"><font color="#3366cc">JSP</font></a>代码是不需编译的，但securitybeans目录下的三个.<a href="http://dev.21tx.com/java/" target="_blank"><font color="#3366cc">Java</font></a>文件必须编译成.class文件才可运行。由于三个Java文件属于一个包，所以要进行联编。 <br /><br /><strong>第二步 启动<a href="http://dev.21tx.com/java/j2ee/" target="_blank"><font color="#3366cc">J2EE</font></a><a href="http://www.21tx.com/server/" target="_blank"><font color="#3366cc">服务器</font></a></strong><br /><br />　　 打开一个DOS Shell窗口，键入j2ee –verbose，稍候片刻，当屏幕出现提示“J2EE server startup complete”时，表示j2eesdk自带的J2EE服务器启动成功了。 <br /><br /><strong>第三步 打开配置工具 </strong><br /><br />　　 打开一个DOS Shell窗口（如果你现每次打开一个新的DOS Shell窗口麻烦，可以在前一步中键入start j2ee –verbose，即可自动弹出一个新的窗口，而原窗口不变），键入deploytool，稍候片刻，即可启动j2eesdk自带的配置工具。Deploytool的启动画面如图三所示。 <br /><p align="center"><img src="http://image.21tx.com/image/20050421/16253.jpg" width="500" /><br />图三 deploytool的启动画面</p><strong>新建一个Application </strong><p align="center"><strong><img src="http://image.21tx.com/image/20050421/16239.jpg" width="500" /><br /></strong>图四 新建一个Application </p><br />　　 点击deploytool的File菜单－&gt;New－&gt;Application，在弹出的对话框中选中SecurityApp所在的目录，并在Display Name中输入任意一个你想在界面上看到的这个应用程序的名称（比如：SecurityApp）。 <br /><br /><strong>第五步 新建一个Ent<a href="http://dev.21tx.com/corp/solution/erp/" target="_blank"><font color="#3366cc">ERP</font></a>rise Bean </strong><br /><br />　　 下面就将进入比较关键的部分！ <br /><br />　　 点击deploytool的File菜单－&gt;New－&gt;Enterprise Bean，将弹出一个New Enterprise Bean Wizard。点击Next按钮略过第一个界面，在第二个界面中输入JAR Display Name为“SecurityJar”，并点击Edit按钮，在弹出的对话框中将securitybeans目录下的三个.<a href="http://dev.21tx.com/java/" target="_blank"><font color="#3366cc">Java</font></a>编译后生成的.class文件加入到SecurityJar的内容中去，如图五所示。 <br /><p align="center"><img src="http://image.21tx.com/image/20050421/16248.jpg" /><br />图五 将.class文件添加到SecurityJar中</p><br />　　 点击Next到第三个界面，注意： <br /><br />1. 选中Session为Stateless（缺省为Stateful）； <br /><br />2. 输入Enterprise Bean Name为SecurityBean； <br /><br />3. 选择Enterprise Bean Class为securitybeans.SecurityBean； <br /><br />4. 选择Remote Home Interface为securitybeans.SecurityHome； <br /><br />5. 选择Remote Interface为securitybeans.Security。 <br /><br />　　 至此关键的步骤就完成了，以下几个界面你大可以放心的“Next”了。至最后一个界面点击Finish按钮，即完成了一个Enterprise Bean的添加工作。 <br /><br /><br /><strong>新建一个</strong><a href="http://dev.21tx.com/web/" target="_blank"><font color="#3366cc"><strong>Web</strong></font></a><strong> Component <br /><br />这个步骤与上一步骤类似 </strong><br /><br />　　 点击deploytool的File菜单－&gt;New－&gt;Web Component，将弹出一个New Web Component Wizard。点击Next按钮略过第一个界面，在第二个界面中输入WAR Display Name为“SecurityWar”，并点击Edit按钮，在弹出的对话框中将ClientCode目录下的几个客户代码文件加入到SecurityWar的内容中去，如图六所示。 <br /><p align="center"><img src="http://image.21tx.com/image/20050421/16219.jpg" /><br />图六 将ClientCode目录下的文件添加到SecurityJar中 </p><br />　　 点击Next进入第三个界面，选择the type of web component you are creating为<a href="http://dev.21tx.com/java/jsp/" target="_blank"><font color="#3366cc">JSP</font></a>。点击Next进入第四个界面，注意： <br /><br />1、 选中JSP FileName为SecurityProcessPage.jsp； <br /><br />2、 输入Web Component Name为SecurityProcessPage。 <br /><br />　　 两次点击Next按钮进入第五个界面，点击Add按钮，给该Web Component添加一个别名为SecurityAlias。 <br /><br />　　 至此主要的步骤就完成了，以下几个界面只需放心点击Next按钮即可，至最后一个界面，点击Finish按钮，即完成了一个Web Component的添加工作。 <br /><br /><strong>第七步 修改JNDI和RootContext </strong><br /><br />　　 添加完了两个主要的组件之后，还要修改两个配置，才能最后完成EJB的配置。 <br /><p align="center"><img src="http://image.21tx.com/image/20050421/16227.jpg" /><br />图七 SecurityApp的JNDI Names标签页的设置 </p><br />　　 在deploytool主界面左边的树形结构中点击SecurityApp节点，主界面的右边就会显示出四个标签页。在这四个标签页中，JNDI Names标签页需加上mysecurity为JNDI Name，如图七所示；WebContext标签页中需加上SecurityRoot为SecurityWar的ContextRoot，如图八所示。 <br /><p align="center"><img src="http://image.21tx.com/image/20050421/16230.jpg" /><br />图八 SecurityApp的Web Context标签页的设置 </p><br /><strong>第八步 校验<a href="http://dev.21tx.com/java/j2ee/" target="_blank"><font color="#3366cc">J2EE</font></a>应用程序 </strong><br /><br />　　 完成以上七个步骤后，整个EJB的配置工作就基本完成了，下面只需简单两个步骤就大功告成，不过也要做好功亏一篑的准备！ <br /><br />　　 在deploytool主界面左边的树形结构中点击SecurityApp节点，再点击deploytool的Tools菜单－&gt;Verifier…菜单项，在弹出窗口中点击OK按钮，deploytool将自动对EJB应用程序进行测试校验，检查有没有配置错误。稍候片刻，如果提示“There were no failed tests.”，则恭喜你大功告成。如果提示有错，则需要返回去仔细重新检查一步步配置，看看有没有地方疏漏了。配置错误可是很容易出的哟，你要有思想准备。<br /><br /><br /><br /><strong>发布</strong><a href="http://dev.21tx.com/java/j2ee/" target="_blank"><font color="#3366cc"><strong>J2EE</strong></font></a><strong>应用程序 <br /><br /></strong>　　 如果通过了第八步，则第九步就完全是例行公事了。 <br /><br />　　 点击deploytool的Tools菜单－&gt;Deploy…菜单项，会弹出一个发布向导对话框窗口，只管放心点击Next到最后一个界面，至最后一个界面点击“Finish”按钮，等待Deployment Progress至最后完成，如图九所示，就彻底搞定了！ <br /><p align="center"><img src="http://image.21tx.com/image/20050421/16207.jpg" /><br />图九 发布完成后的Deployment Progress </p><br /><strong>第十步 欣赏程序运行效果 </strong><br /><br />　　 接下来打开一个浏览器窗口，输入http://localhost:8000/SecurityRoot，就可以欣赏到你第一个EJB应用程序的运行效果了。 <br /><br />　　 第一个页面如图十所示，显示的是一个数据录入页面，用户可录入一些想要加密/解密的内容，点击提交按钮就可到下一个页面。 <br /><br />　　 第二个页面如图十一所示，显示的是对用户请求内容的加密/解密处理结果。 <br /><p align="center"><img src="http://image.21tx.com/image/20050421/16211.jpg" width="500" /><br />图十 运行效果第一个页面（加密/解密请求窗） <br /><br /><img src="http://image.21tx.com/image/20050421/16215.jpg" width="500" /><br />图十一 运行效果第二个页面（加密/解密结果显示页） </p><br />　　 万事开头难，有了第一个EJB应用程序运行通过的体验，以后就好办了。希望本文能为你开个好头！ <br /><br /><img src ="http://www.blogjava.net/jackstudio/aggbug/76764.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-10-23 15:24 <a href="http://www.blogjava.net/jackstudio/archive/2006/10/23/76764.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>