无状态会话Bean的例子

无状态会话Bean的例

ConverterEJB:提供简单的货币兑换

1EJB类:

包含两个实现不同货币之间兑换的商业方法:dollarToYenyenToEuro

代码如下:

import java.rmi.RemoteException;

import javax.ejb.SessionBean;

import javax.ejb.SessionContext;

import java.math.*;

public  class   ConverterBean   implements   SessionBean {

      BigDecimal yenRate = new BigDecimal("121.6000");

      BigDecimal euroRate = new BigDecimal("0.0077");

        //实现具体的处理逻辑:货币之间的兑换

   public  BigDecimal  dollarToYen(BigDecimal dollars) {

      BigDecimal result = dollars.multiply(yenRate);

      return result.setScale(2,BigDecimal.ROUND_UP);}

   public  BigDecimal  yenToEuro(BigDecimal yen) {

      BigDecimal result = yen.multiply(euroRate);

      return result.setScale(2,BigDecimal.ROUND_UP); }

//必须实现SessionBean接口中定义的方法

//根据需要,可以添加所需的代码

  public ConverterBean() {}

   public void ejbCreate() {}

   public void ejbRemove() {}

   public void ejbActivate() {}

   public void ejbPassivate() {}

   public void setSessionContext(SessionContext sc) {}

 

}

2Remote接口

Remote接口定义了客户机将调用的商业方法(商业逻辑)。

 

import javax.ejb.EJBObject;

import java.rmi.RemoteException;

import java.math.*;

 

public interface Converter extends EJBObject {

    public BigDecimal dollarToYen(BigDecimal dollars) throws RemoteException;

   public BigDecimal yenToEuro(BigDecimal yen) throws RemoteException;  }

3Home接口

Home接口定义了允许客户机创建、发现或移走EJB的方法,ConverterHome接口只含有一个create方法,它返回一个Remote接口类型的对象Converter

 

import java.io.Serializable;

import java.rmi.RemoteException;

import javax.ejb.CreateException;

import javax.ejb.EJBHome;

public interface ConverterHome extends EJBHome {

    Converter create() throws RemoteException, CreateException;

}

编译ejb

配置ejb

1)启动J2EE服务器

在终端窗口中执行如下命令启动J2EE服务器:

j2ee -verbose   

(2)启动deploytool部署工具

deploytool

无状态会话Bean的例子_第1张图片

 

 

 

 

(3)创建J2EE应用程序

.deploytool部署工具中,选择菜单File/New/Appliction新建应用程序

(4) 打包企业Bean

我们使用deploytool部署工具的新建企业Bean向导来打包企业Bean。在这个过程中向导完成如下工作:

        1.创建企业Bean的部署描述符文件

         2.将部署描述符文件和企业Bean的类文件打包进同一个EJB JAR文件

        3.把生成的EJB JAR文件加入应用程序的ConverterApp.ear文件

    打包成功后你可以用Tools/Descriptor Viewer菜单查看部署描述符文件内容

File/New/Enterprise Bean菜单打开新建企业Bean向导,该向导包含以下对话框:

1.Introduction对话框

    a) 阅读该向导的说明

b) 点击Next

2.EJB JAR对话框

a) 选择Create New JAR File In Application单选按钮

b) 在下拉框中选择ConverterApp

c) JAR Display Name域输入ConverterJAR

d) 点击Edite按钮

e) Available Files下的树中定位到j2eetutorial/examples/build/ejb/converter目录。

f) Available Files树中选中converter目录下的Converter.classConverterBean.classConverterHome.class文件点击Add按钮。(你也可以使用鼠标拖放操作来将这些文件加入Contents文本域)

g) 点击OK

h) 点击Next

 

 

 

3.General对话框

 

 

 

3.General对话框

a) Bean Type下选中Session单选按钮

    b) 选中Stateless单选按钮

   c) Enterprise Bean Class下拉框中选择ConverterBean

   d) Enterprise Bean Name域输入ConverterEJB

   e) Remote Home Interface下拉框中选择ConverterHome

f) Remote Interface下拉框中选择Converter

    g) 点击Next

4.Transaction Management对话框

a) 后面的步骤对本例并不重要,点击Finish完成向导

5.指定EJBJNDI

   在树视图中选择“ConverterApp”,选择“JNDI  Names”标签,在“JNDI Names”域输入“MyConverter”。客户机将使用该名字来定位Home接口。

四.创建J2EE应用程序客户端

ConverterClient.java源文件 :

☆ 查找Home接口

        创建一个企业Bean实例

☆ 调用商业方法

查找Home接口

         ConverterHome接口定义了像create等的企业Bean生命周期方法。在 ConverterClient能调用create方法之前,它必须先查找到一个ConverterHome类型的实例对象。以下是查找过程:

(1).创建一个初始命名上下文(initial naming context)对象:

Context initial = new InitialContext();

     Context接口是Java命名和目录接口(Java Naming and Directory Interface JNDI)的一部分。一个命名上下文是一个名字到对象绑定的集合,上下文中已绑定的名字是对象的JNDI名。

  一个InitialContext(该类实现Context接口)对象提供名字方案的访问入口。所有的命名操作都关联一个上下文。

( 2).获得客户端的环境命名上下文对象:

Object objref = initial.lookup(“MyConverter");

(3).将得到的引用造型(narrow)ConverterHome类型的对象

ConverterHome home =

(ConverterHome)PortableRemoteObject.narrow(objref,ConverterHome.class);

创建一个企业Bean实例

    可端调用ConverterHome类型的对象的create方法来创建一个企业Bean实例,该方法返回一个Converter(本例企业Bean的远程接口)类型的对象。Converter接口定义了客户端可调用的企业Bean商业方法。当客户端调用上述的create方法,容器实例化一个企业Bean然后调用ConverterBean.ejbCreate方法。客户端调用代码如下:

Converter currencyConverter = home.create();

调用商业方法

    调用商业方法十分简单,就是调用上面获得的Converter类型对象的方法(该接口中定义的方法都是商业方法)。EJB容器会调用运行在服务器中的ConverterEJB实例的对应方法。客户端调用dollarToYen商业方法的代码如下:

 

BigDecimal param = new BigDecimal ("100.00");

BigDecimal amount = currencyConverter.dollarToYen(param);

下面是客户端ConverterClient的完整代码:

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.rmi.PortableRemoteObject;

import java.math.BigDecimal;

public class ConverterClient {

 public static void main(String[] args) {

       try {

           Context initial = new InitialContext();

           Context myEnv = (Context)initial.lookup("java:comp/env");

           Object objref = myEnv.lookup("ejb/SimpleConverter");

ConverterHome home =(ConverterHome)PortableRemoteObject.narrow(objref,

                                            ConverterHome.class);

           Converter currencyConverter = home.create();

           BigDecimal param = new BigDecimal ("100.00");

           BigDecimal amount = currencyConverter.dollarToYen(param);

           System.out.println(amount);

           amount = currencyConverter.yenToEuro(param);

           System.out.println(amount);

           System.exit(0);

       } catch (Exception ex) {

           System.err.println("Caught an unexpected exception!");

           ex.printStackTrace(); }} }

打包J2EE应用程序客户端

☆ 运行deploytool部署工具的新建应用程序客户端向导,该向导完成如下工作:

☆ 创建应用程序客户端的部署描述符文件

☆ 将部署描述符文件加入客户端的JAR文件

☆ 将生成的JAR文件加入ConverterApp.ear文件

之后你可以通过Tools/Descrptor Viewer菜单查看部署描述符文件内容。

File/New/Application Client菜单打开该向导,它有以下对话框:

1Introduction对话框

a) 阅读向导说明

b) 然后Next

2JAR File Contents对话框

a) 在下拉框中选择ConverterApp

b) 点击Edit按钮

c) ConverterClient.class文件加入Contents Of树中

d) 确定然后Next

3General对话框

a) Main Class下拉框中选择ConverterClient

b) 确定Display Name域中输入了ConverterClient

c) Callback Handler Class下拉框中选择Use container-managed authentication

d) Next后点击Finish完成

指定应用程序客户端的企业Bean引用

当客户端ConverterClient调用lookup方法,它传递企业BeanHome接口的引用绑定名字给方法:

Object objref = myEnv.lookup("ejb/SimpleConverter");

设置该引用名字的步骤如下:

  1.在deploytool工具左边的树视图中选择ConverterClient节点

2.选择右边的EJB Refs选项页

3.点击Add按钮

4.在Coded Name列输入ejb/SimpleConverter

5.在Type列选择Session

6.在Interfaces列选择Remote

7.在Home Interface列输入ConverterHome

8.在Local/Remote Interface列输入Converter

设置企业BeanJNDI

为了让lookup方法能够通过它们找到企业BeanHome接口类型对象,你必须映射这些引用名到企业BeanJNDI名。虽然这个映射增加了一个间接访问层,但是它降低了客户端和企业Bean之间的耦合,使J2EE组件更容易装配成应用程序。(这种引用查找在EJB1.1时出现,主要是避免在代码中写死JNDI名来查找企业Bean可能造成的装配时JNDI名冲突)。

 

以下步骤建立引用名和JNDI名的映射:

1.在树视图中选择ConverterApp节点

2.选择JNDI Name选项页

3.在Application表格中选中ConverterEJB组件,在JNDI Name列中输入MyConverter作为ConverterEJBJNDI

4.在References表格中每一行的JNDI Name列中都输入上面的JNDI

下图显示了设置的JNDI

部署J2EE应用程序

前面我们已经将本例中的组件全部加入到应用程序中了,现在开始部署。

1.选择ConverterApp应用程序(在树中)

2.选择菜单Tools/Deploy

3.在Introduction对话框中确定Object To Deploy选择的是ConverterAppTarget Server选择的是localhost

4.选中Return Client Jar复选框

5.在Client JAR File Name域中输入j2eetutorial/examples/src/ejb/converter/ConverterAppClient.jar(可以使用Browse按钮),该JAR文件包含可以远程访问ConverterEJB的存根类。下一步

6.在JNDI Names对话框中,检验是不是你前面输入的名字。下一步

7.在WAR Context Root对话框中,为Context Root域输入converter。当你运行Web客户端时,converter将是访问WebURL的一部分。下一步

8.在Rewiew对话框中点及Finish完成

9.在Deployment Progress对话框部署完成后确定退出部署。

运行J2EE应用程序客户端

按以下步骤运行应用程序客户端:

1.在终端窗口中进入converter目录

2.确认ConverApp.earConverterAppClient.jar文件在该目录下

3.设置APPCPATH环境变量为ConvertAppClient.jar所在目录

Set  APPCPATH=d:/test2/examples/src/ejb/converter/ ConvertAppClient.jar

4.执行下面的命令:

runclient -client ConverterApp.ear -name ConverterClient -textauth

5.在出现登录提示时输入用户名:guest。密码:guest123

6.终端窗口中显示结果如下:

无状态会话Bean的例子_第2张图片

创建Web客户机

JSP源文件:

<%@ page import="Converter,ConverterHome,javax.ejb.*, java.math.*, javax.naming.*, javax.rmi.PortableRemoteObject, java.rmi.RemoteException" %>

<%!

   private Converter converter = null;

   public void jspInit() {

      try {  InitialContext ic = new InitialContext();

         Object objRef = ic.lookup("java:comp/env/ejb/TheConverter");

       ConverterHome home = (ConverterHome)PortableRemoteObject.narrow(objRef, ConverterHome.class);

         converter = home.create();

      }

<form method="get">

<input type="text" name="amount" size="25">

<input type="submit" value="Submit">

<input type="reset" value="Reset">

</form>

<%  String amount = request.getParameter("amount");

    if ( amount != null && amount.length() > 0 ) {

       BigDecimal d = new BigDecimal (amount);  %>

<%= amount %> dollars are  <%= converter.dollarToYen(d) %>  Yen.

<%= amount %> Yen are <%= converter.yenToEuro(d) %>  Euro.

<% }

%>

打包客户机

deploytool中依次选择“File----New----WebComponent”

设置Web客户机对EJB的引用

无状态会话Bean的例子_第3张图片

指定JNDI

 

 

 

 

 

 无状态会话Bean的例子_第4张图片

 

 

部署

 

 

 

 

 

运行Web客户端       

 

在浏览器中输入下面的URL访问Web客户端。<host>表示运行J2EE服务器的机器名,如果你的J2EE服务器和访问浏览器在同一机器上,可以用localhost代替作为机器名。

http://<host>:8000/converter

在显示页面的输入框中输入1234后点击Submit提交,会看到图所示的结果。

 

 

 

 

 

你可能感兴趣的:(bean,object,jar,ejb,import,interface)