新闻正文

建立你的第一个无状态会话Bean--HelloWorld之三

来源:JAVA天堂  JAVA学习者  2007-6-16 02:28:30 网友评论 0 条 字体:[ ] ~我要投稿!

企业JavaBeansTM学习指南:

建立你的第一个无状态(stateless)会话Bean






  • 关于本学习指南



  • 关于示例




    • 步骤1: 安装企业JavaBeans 服务器
    • 步骤2: 指定企业JavaBeans 远程界面
    • 步骤3: 指定宿主界面
    • 步骤4: 编写企业JavaBean 类
    • 步骤5: 创建ejb-jar 文件
    • 步骤6: 配置DemoBean企业JavaBeans
    • 步骤7: 编写企业JavaBean 客户程序
    • 步骤8: 运行客户程序




3. 如何建立你的第一个无状态(stateless)会话Bean





步骤 5: 创建 ejb-jar 文件



企业JavaBeans 的巨大优势之一是能够以与 GUI 组件相同的移植方式捆绑和分布服务器端逻辑。在这一步中,我们将把在前面几步中所做的源文件进行编译,然后捆绑在一个
ejb-jar 文件中。在完成了以下四项工作后,你将可以生成 Demo.jar这样一个ejb-jar 文件, 这就为将其配置或安装到 Enterprise
JavaBeans Container(企业JavaBeans容器)做好了准备。



1) 编译 .java 文件



在你刚刚创建的文件上运行 javac ,也就是在宿主界面和远程界面、以及企业JavaBeans 的 bean 本身上面运行。


Javac ejb/Demo/demohome.java

Javac ejb/Demo/demo.java

Javac ejb/Demo/demobean.java




2) 创建Deployment Descriptor(配置描述符)



注意: Deployment(配置) 是企业JavaBeans 中的专用术语,它表示将企业 JavaBeans 组件安装到一个企业 JavaBeans
容器这样一个过程。



配置描述符的任务是要使 bean 的 deployer (配置者)能够在配置之前客户化 bean 的许多属性。配置描述符在Enterprise
JavaBeans Specification (企业JavaBeans规范)(15.2节)中被描述为javax.ejb.deployment.SessionDescriptor
的一个实例,或为 javax.ejb.deployment.EntityDescriptor的一个实例。在示例 DemoBean 中,它是javax.ejb.deployment.SessionDescriptor
的一个实例。下面是一个输入到WebLogic的实用程序中的文本文件的例子,它将生成配置描述符的序列化实例。



应该注意的是,创建配置描述符的方法没有被指定,因而用来生成和配置企业 JavaBeans 的工具相互间可能也会有很大区别,但不影响 beans
本身在跨平台上的配置能力。 下面的例子继续用WebLogic工具来创建配置描述符。BEA Weblogic Tengah 服务器实现可提供命令行和GUI配置工具,因此要使用命令行工具来配置企业JavaBean,执行如下命令:






java weblogic.ejb.utils.DDCreator -dir ejb/demo DeploymentDescriptor.txt




它将在ejb/demo 目录下创建DemoBeanDD.ser。



下面是输入到BEA Weblogic 工具的DeploymentDescriptor.txt 文本文件的一个例子(源代码):


(SessionDescriptor

; This file must start with SessionDescriptor or

; EntityDescriptor



; Indicate the name which the bean will be bound

; into the JNDI name as

beanHomeName demo.DemoHome



; The enterprise Java Bean class (see step 4)

enterpriseBeanClassName ejb.demo.DemoBean



homeInterfaceClassName ejb.demo.DemoHome

; The home interface implemented by a class

; generated by the container provided tools

; see step 3



remoteInterfaceClassName ejb.demo.Demo

; See step 2



isReentrant false

; Always false for session beans



stateManagementType STATELESS_SESSION

; Either STATELESS_SESSION or STATEFUL_SESSION.

; DemoBean is a stateless session bean



sessionTimeout 5

; seconds



(controlDescriptors

; This section decides the run-time properties when

; a method is called. The DEFAULT sub-section applies

; to all methods, but can be overridden on a per-method

; basis, similar to the "accessControlEntries" above.

(DEFAULT

isolationLevel TRANSACTION_SERIALIZABLE



transactionAttribute TX_REQUIRED





runAsMode CLIENT_IDENTITY

)

; end isolationLevel



)

; end controlDescriptors



(environmentProperties



maxBeansInFreePool 100



)

; end environmentProperties

)

; end SessionDescriptor




注意: 这个例子是为 BEA Weblogic 服务器编写的,它使用分号(;) 来作为注释行的标记。



3) 确认你已具有所有程序件(pieces)



下面是企业JavaBeans 开发人员和供应商需要提供的用来创建一个有效 ejb-jar 文件的程序件。也就是企业 JavaBeans
的 bean:

    · 企业 bean 类 + bean 所依赖的所有其它类(步骤 4)。

    · 企业bean的远程界面 (步骤 2)。

    · 企业bean的宿主界面 (步骤 3)。

    · 一个配置描述符(见上)。

    · java.util.Properties 的一个实例(如果 bean 需要的话)。

    · 一个在 ejb-jar 文件中用来鉴别配置描述符的清单文件。



欲了解更详细的信息,请参阅企业 JavaBeans 规范,第16节。



企业JavaBeans 的 bean 供应商负责将所有类装入 ejb-jar 文件, 但是我们期望大多数提供容器和服务器的供应商都能提供工具来进行包装和组合的工作。




清单文件(Manifest)



清单文件是由 jar 实用程序自动生成的, 但它将使用一个模板,因此可用下面的行文创建一个文本文件 (例如, ejb/demo/manifest.txt)
。参考下一节有关包装 bean 的内容,看看这个文本文件是如何被使用的。 有关清单文件的描述,请见Enterprise
JavaBeans Specification
(企业JavaBeans规范), 15.3节。
Name: ejb/demo/DemoBeanDD.ser

Enterprise-Bean: True



4) 创建 ejb-jar 文件



在这个例子中,你直接将所有的程序件经过 jar 操作后集中到一起,制作了一个被称作Demo.jar 的 jar 文件。人们期望将来的工具会使得包装和ejb-jar
文件的生成更容易些。 你可以想象将来会有一个GUI wizard 引导你轻松地通过并检查这里的依赖关系(dependencies)。



要为这个例子创建 ejb-jar 文件 Demo.jar ,你可以假定 jar 文件的程序件都在 ejb 目录下,然后直接创建一个关于这个目录结构的jar
文件。



注意: 使用 m 标记进行 jar 操作并使用 ejb/demo/manifest.txt 作为清单文件的一个模板。不必将 manifest.txt
装入 jar 文件。


jar cvfm Demo.jar ejb/demo/manifest.txt ejb/demo/*.class

ejb/demo/*.ser



对 Demo.jar 的检查应该产生类似于下面的输出:



jar tf Demo.jar



META-INF/MANIFEST.MF

Ejb/demo/Demo.class

Ejb/demo/DemoBean.class

Ejb/demo/DemoHome.class

Ejb/demo/DemoBeanDD.ser




正如你所看到的,关于ejb-jar 文件,没有什么太特殊的地方。



步骤6: 配置DemoBean 企业JavaBean



在这一步里,DemoBean 企业JavaBean 将被安装(或配置)到一个企业JavaBeans 容器。值得注意的是,各个服务器供应商为完成这个安装过程,都开发了自己独特的和越来越精巧的工具。
按照下面的说明,将 DemoBean 安装到你在步骤1中安装的 BEA Weblogic/Tengah 服务器上。



BEA WebLogic/Tengah 的配置



在最新发布的BEA WebLogic/Tengah 服务器上,企业 JavaBeans bean 的配置的含义是 "将 bean 类放在
Tengah 服务器能够找到它们的地方"。这并不是一件很难的事,但做起来也并不轻松。 人们期望将有新的工具来进一步简化这项工作,同时使在此过程中所发生的事情更透明一些。




注意: 这个例子假定 Tengah 服务器安装在 /export 目录下。



1) 生成实现



这一步用来创建早些时候指定的界面实现,以及对DemoBean 的特定的BEA WebLogic支持类。注意它们没有捆绑在你的 bean
中。例如,被生成的类是宿主界面和远程界面,以及被用来支持通信协议的类。 这些类是在配置阶段被生成,并且不是由bean供应商(程序员)所编写的,这样一个事实是使
Enterprise JavaBeans 协议独立的主要原因。



注意: 假定 Tengah 服务器已被安装到 /export 目录下。如果它被安装在其它什么地方的话,你需要更改目标目录(即下面的 -d
参数)。



为使用 BEA WebLogic 工具生成 DemoBean 实现, 请使用: java weblogic.ejbc -d /export/weblogic/classes
ejb/demo/DemoBeanDD.ser 这个工具可创建名称与下面的类相似的类,并把它们放在/export/weblogic/classes
目录下。
    

ejb/demo/DemoBeanEOImpl.class

ejb/demo/DemoBeanHomeImpl.class

ejb/demo/Skel5k5x705r2x671nd1i1vy2v524ua5y.class

ejb/demo/Skel5q585f5sfzo601q4e725b233m5140.class


ejb/demo/Stub5k5x705r2x671nd1i1vy2v524ua5y.class

ejb/demo/Stub5q585f5sfzo601q4e725b233m5140.class




2) 将Demo.jar 放到Tengah 服务器的类路径上



这件事有几种做法,但最简单的做法是,将 Demo.jar 文件放到 /export/weblogic/classes 目录上,然后编辑/export/weblogic/startTengah.sh
脚本,使之包含Demo.jar 文件。


/export/weblogic/startTengah.sh

#!/bin/sh

#

# Shell script to manually start Tengah

# Server on UNIX systems

CLASSPATH=$CLASSPATH:/export/weblogic/classes/Demo.jar

echo $CLASSPATH

java -ms16m -mx16m -verbosegc weblogic.Server






3) 将DeploymentDescriptor 放到位



现在,Tengah 服务器看来不能在ejb-jar文件内发现序列化的配置描述符,该描述符应该从 jar 文件中拷出到服务器的类路径上。




例如:


cd /export/weblogic/classes

jar xvf Demo.jar ejb/demo/DemoBeanDD.ser



4) 编辑weblogic.properties 文件


包括新的企业JavaBeans 的装载和启动的有关说明。



/export/weblogic/weblogic.properties



# # # # # # # # # # # # # # # # # # # # # # # # # #

# Tengah Enterprise JavaBeans DEMO PROPERTIES

# -------------------------------------------------

# Uncomment the appropriate lines below and modify

# DBMS-related info and paths to match your particular

# installation.

#

# Deploys the Enterprise JavaBean examples. Uncomment to use:

weblogic.ejb.deploy=

/export/weblogic/classes/beanManaged.jar,

/export/weblogic/classes/containerManaged.jar,

/export/weblogic/classes/statefulSession.jar,

/export/weblogic/classes/ejb/demo/DemoBeanDD.ser

#

# weblogic.properties file continues below...

#



5) 终止并重新启动 Tengah 服务器



你可以使用 BEA Weblogic 工具来终止并重新启动 Tengah 服务器,或在一定的环境中,直接杀掉主 Tengah 进程,并使用/expot/weblogic/startTengah.sh
脚本来重新启动。详见BEA
Weblogic tools documentation




步骤7: 编写企业JavaBean 客户程序(Client)



如果你已经成功地完成了步骤 1 至步骤 6 ,DemoBean 现在应该已被配置到了企业JavaBeans 容器,并准备接受客户程序(client)对任何在远程界面上指定的方法的调用。




1)阅读下面的客户程序代码。

2)将这些代码存储到指定文件。



编写客户程序概述



编写客户程序是在本课程中又一个需要你编写代码的地方(除企业 JavaBeans bean 事务逻辑本身之外)。一个企业 JavaBeans

bean 的客户程序可能是各种各样的。例如,一个servlet, 一个applet, 或是一个 C/C++ 程序。下面的例子 DemoClient.java
是在上几步中创建的 DemoBean 企业 JavaBean的客户程序。这个程序应该注意的几个重要地方是:

    · 建立 JNDI 初始上下文环境。

    · 用 JNDI 对 Enterprise JavaBean 的宿主界面定位。

    · 用宿主界面指示容器来创建一个 Enterprise JavaBean 实例。

    · 用远程界面指示容器来执行 Enterprise JavaBeans bean的方法。



另外需要注意的是,当你在不同的容器/服务器中配置 bean 时,可能需要有不同版本的客户代码。客户代码的区别可能不大,但毕竟会有一些问题,如获得初始连接的正确的串。例如,考虑下列代码,它为
BEA WebLogic 设置属性对象来检索 JNDI initialContext 对象。它可能与检索initialContext 对象的
Oracle属性串不同。

p.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.T3InitialContextFactory");




这里存在各种各样其它的小问题,可能需要某些调整和客户代码的再编译,但它们的工作量都不大。 在下面的样本中,企业JavaBeans 客户程序演示了如何定位一个企业JavaBean
并启动它的远程方法。


DemoClient.java (源代码)



/**

* DemoClient -- demonstrates using a minimal

* Java application to talk to the DemoBean

* stateless session bean

*/



package ejb.demo;



import javax.ejb.*;

import javax.naming.*;

import java.rmi.*;

import java.util.Properties;



import examples.ejb.statelessSession.interfaces.*;



/**

* DemoClient demonstrates using a minimal stateless session

* bean.

* Remember view session beans as an extension of your client

* running in the server.

*/



public class demoClient {

public static void main(String[] args) {

System.out.println(" Begin demoClient... ");



parseArgs(args);

try {

// Create A DemoBean object, in the server

// Note: the name of the class corresponds to the JNDI

// property declared in the DeploymentDescriptor

// From DeploymentDescriptor ...

// beanHomeName demo.DemoHome

Context ctx = getInitialContext();

DemoHome dhome = (DemoHome) ctx.lookup("demo.DemoHome");



// Now you have a reference to the DemoHome object factory

// use it to ask the container to creat an instance of

// the Demo bean

System.out.println("Creating Demo ");

Demo demo = dhome.create();



// Here is the call that executes the method on the

// server side object


System.out.println("The result is "

+ demo.demoSelect();





}

catch (Exception e) {

System.out.println(" = Error <=");

e.printStackTrace();

}

System.out.println(" End demoClient... ");

}



static void parseArgs(String args[]) {

if ((args == null) || (args.length == 0))

return;

for (int i = 0; i < args.length; i++) {

if (args[i].equals("-url"))

Integer.parseInt(args[++i]);

else if (args[i].equals("-user"))

user = args[++i];

else if (args[i].equals("-password"))

password = args[++i];

}

}



static String user = null;

static String password = null;

static String url = "t3://localhost:7001";



/**

* Gets an initial context.



*

* @return Context

* @exception java.lang.Exception if there is

* an error in getting a Context

*/

static public Context getInitialContext() throws Exception {

Properties p = new Properties();

p.put(Context.INITIAL_CONTEXT_FACTORY,

"weblogic.jndi.T3InitialContextFactory");

p.put(Context.PROVIDER_URL, url);

if (user != null) {

System.out.println ("user: " + user);

p.put(Context.SECURITY_PRINCIPAL, user);

if (password == null)

password = "";

p.put(Context.SECURITY_CREDENTIALS, password);

}

return new InitialContext(p);

}

}




步骤 8: 编译并运行客户程序(Client)



所余下来要作的就是编译并运行 Client 程序以确认安装在服务器上的企业 JavaBeans 的功能是否正确。



1). 编译客户程序



编译和运行客户程序对所有的平台是等同的,就象运行客户程序的结果对所有平台也应该是等同的一样。

javac ejb/Demo/democlient.java



2). 运行客户程序



"Hello World" 串出自企业JavaBeans的 DemoSelect() 方法。运行客户程序应给出下列消息:


Java ejb.Demo.democlient

Begin DemoClient...

Creating Demo

The result is Hello World

End DemoClient...




4. 小结



你现在有了可以运行的 DemoBean 例子,并且你还成功地运行了客户程序。



建立你的第一个无状态会话Bean--HelloWorld之一
建立你的第一个无状态会话Bean--HelloWorld之二
建立你的第一个无状态会话Bean--HelloWorld之三



收藏到ViVi   收藏此页到365Key
上一篇:优化Entity Beans的七条守则
下一篇:建立你的第一个无状态会话Bean--HelloWorld之二
用户名:新注册) 密码: 匿名评论 [所有评论]
评论内容:不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
   网站首页 -  网站地图 -  技术学习 -  网站投稿 -  帮助中心
Copyright 2003-2008 www.javah.net All Rights Reserved
2008 如果你喜欢本站 请收藏本站 并推荐给你的朋友一起分享