EJB轻松进阶

转帖自  http://www.jspcn.net/htmlnews/11049392593751612.html

 

一、引言
  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应用程序

  一个完整的EJB应用程序已经写完了,但是事情还远没有完结。要使一个EJB应用程序能够运行,还有很多事情要做。并且,可能这些事情的工作量并不比编程序本身小多少。

第一步 编译EJB代码

  html和jsp代码是不需编译的,但securitybeans目录下的三个.java文件必须编译成.class文件才可运行。由于三个Java文件属于一个包,所以要进行联编。

第二步 启动J2EE服务器

  打开一个DOS Shell窗口,键入j2ee ?Cverbose,稍候片刻,当屏幕出现提示“J2EE server startup complete”时,表示j2eesdk自带的J2EE服务器启动成功了。

第三步 打开配置工具

  打开一个DOS Shell窗口(如果你现每次打开一个新的DOS Shell窗口麻烦,可以在前一步中键入start j2ee ?Cverbose,即可自动弹出一个新的窗口,而原窗口不变),键入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应用程序的运行效果了。

  第一个页面如图十所示,显示的是一个数据录入页面,用户可录入一些想要加密/解密的内容,点击提交按钮就可到下一个页面。

  第二个页面如图十一所示,显示的是对用户请求内容的加密/解密处理结果。



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



图十一 运行效果第二个页面(加密/解密结果显示页) 
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值