站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Java 专题EJB核心技术及其应用

EJB核心技术及其应用

摘要: EJB核心技术及其应用
EJB的全称是Enterprise java bean。是JAVA中的商业应用组件技术。EJB结构中的角色 EJB 组件结构是基于组件的分布式计算结构,是分布式应用系统中的组件...
一、EJB技术简介
  EJB的全称是Enterprise java bean。是JAVA中的商业应用组件技术。EJB结构
中的角色 EJB 组件结构是基于组件的分布式计算结构,是分布式应用系统中的组件。
  一个完整的基于EJB的分布式计算结构由六个角色组成,这六个角色可以由不同
的开发商提供,每个角色所作的工作必须遵循Sun公司提供的EJB规范,以保证彼此
之间的兼容性。这六个角色分别是EJB组件开发者(Enterprise Bean Provider) 、
应用组合者(Application Assembler)、部署者(Deployer)、EJB 服务器提供者(EJB
Server Provider)、EJB 容器提供者(EJB Container Provider)、系统管理员
(System Administrator):
二、EJB中各角色的分析
1、EJB组件开发者(Enterprise Bean Provider)
  EJB组件开发者负责开发执行商业逻辑规则的EJB组件,开发出的EJB组件打包成
ejb-jar文件。EJB组件开发者负责定义EJB的remote和home接口,编写执行商业逻辑
的EJB class,提供部署EJB的部署文件(deployment descriptor)。部署文件包含EJB
的名字,EJB用到的资源配置,如JDBC等。EJB组件开发者是典型的商业应用开发领域专家。
  EJB组件开发者不需要精通系统级的编程,因此,不需要知道一些系统级的处理
细节,如事务、同步、安全、分布式计算等。
2、应用组合者(Application Assembler)
  应用组合者负责利用各种EJB组合一个完整的应用系统。应用组合者有时需要提
供一些相关的程序,如在一个电子商务系统里,应用组合者需要提供JSP(Java
Server Page)程序。
应用组合者必须掌握所用的EJB的home和remote接口,但不需要知道这些接口的实现。
3、部署者(Deployer)
  部署者负责将ejb-jar文件部署到用户的系统环境中。系统环境包含某种EJB
Server和EJB Container。部署者必须保证所有由EJB组件开发者在部署文件中声明
的资源可用,例如,部署者必须配置好EJB所需的数据库资源。
部署过程分两步:部署者首先利用EJB Container提供的工具生成一些类和接口,使
EJB Container能够利用这些类和接口在运行状态管理EJB。 部署者安装EJB组件和
其他在上一步生成的类到EJB Container中。 部署者是某个EJB运行环境的专家。
  某些情况下,部署者在部署时还需要了解EJB包含的业务方法,以便在部署完成
后,写一些简单的程序测试。
4、EJB 服务器提供者(EJB Server Provider)
  EJB 服务器提供者是系统领域的专家,精通分布式交易管理,分布式对象管理
及其它系统级的服务。EJB 服务器提供者一般由操作系统开发商、中间件开发商或
数据库开发商提供。
  在目前的EJB规范中,假定EJB 服务器提供者和EJB 容器提供者来自同一个开发
商,所以,没有定义EJB 服务器提供者和EJB容器提供者之间的接口标准。
5、EJB 容器提供者(EJB Container Provider)
  EJB 容器提供者提供以下功能:
  提供EJB部署工具为部署好的EJB组件提供运行环境 。EJB容器负责为EJB提供交
易管理,安全管理等服务。
  EJB 容器提供者必须是系统级的编程专家,还要具备一些应用领域的经验。EJB
容器提供者的工作主要集中在开发一个可伸缩的,具有交易管理功能的集成在EJB
服务器中的容器。EJB 容器提供者为EJB组件开发者提供了一组标准的、易用的API
访问EJB 容器,使EJB组件开发者不需要了解EJB服务器中的各种技术细节。
  EJB容器提供者负责提供系统监测工具用来实时监测EJB容器和运行在容器中的
EJB组件状态。
6、系统管理员(System Administrator)
  系统管理员负责为EJB服务器和容器提供一个企业级的计算和网络环境。
  系统管理员负责利用EJB 服务器和容器提供的监测管理工具监测EJB组件的运行情况。
三、EJB的体系结构:
  EJB分布式应用程序是基于对象组件模型的,低层的事务服务用了API技术。EJB
技术简化了用JAVA语言编写的企业应用系统的开发,配置。EJB技术定义了一组可重
用的组件:Enterprise Beans。你可以利用这些组件,象搭积木一样的建立你的分
布式应用程序。当你把代码写好之后,这些组件就被组合到特定的文件中去。每个
文件有一个或多个Enterprise Beans,在加上一些配置参数。最后,这些
Enterprise Beans被配置到一个装了EJB容器的平台上。客户能够通过这些Beans的
home接口,定位到某个beans,并产生这个beans的一个实例。这样,客户就能够调
用Beans的应用方法和远程接口。
  EJB服务器作为容器和低层平台的桥梁管理着EJB容器和函数。它向EJB容器提供
了访问系统服务的能力。例如:数据库的管理和事务的管理,或者对于其它的
Enterprise的应用服务器。所有的EJB 实例都运行在EJB容器中。  容器提供了系
统级的服务,控制了EJB的生命周期。EJB中的有一些易于使用的管理工具如:
Security--配置描述器(The Deployment descriptor)定义了客户能够访问的不同
的应用函数。容器通过只允许授权的客户访问这些函数来达到这个效果。Remote
Connectivity--容器为远程链接管理着低层的通信issues,而且对Enterprise Beas
的开发者和客户都隐藏了通信细节。EJB的开发者在编写应用方法的时候,就象是在
条用本地的平台一样的。客户也不清楚他们调用的方法可能是在远程被处理的。
Life Cycle managment--客户简单的创建一个Enterprise beans的实例,并通常取
消一个实例。而容器管理着Enterprise Beans的实例,使Enterprise Beans实现最
大的效能和内存利用率。容器能够这样来激活和使Enterprise Beans失效,保持众
多客户共享的实例池。等等。    Trasction management-配置描述器定义了
Enterprise beans 的事务处理的需求。容器管理着那些管理分布式事务处理的复杂
的issues。这些事务可能要在不同的平台之间更新数据库。容器使这些事务之间互
相独立,互不干扰。保证所有的更新数据库都是成功发生的,否者,就回滚到事务
处理之前的状态。
  EJB 组件是基于分布式事务处理的企业级应用程序的组件。所有的EJB都有如下
的特点:EJB包含了处理企业数据的应用逻辑。定义了EJB的客户界面。这样的界面
不受容器和服务器的影响。于是,当一个EJB被集合到一个应用程序中去时,不用更
改代码和重新编译。EJB能够被定制 各种系统级的服务,例如安全和事务处理的特
性,都不是属于EJB类的。而是由配置和组装应用程序的工具来实现。 有两种类型
的EJB: Session beans 和 entity beans.Session beans是一种作为单用户执行的
对象。作为对远程的任务请求的相应,容器产生一个Session beans 的实例。一个
Session beans有一个用户.从某种程度上来说,一个Session bean 对于服务器来说
就代表了它的那个用户.Session beans 也能用于事务,它能够更新共享的数据,但
它不直接描绘这些共享的数据。Session beans 的生命周期是相对较短的。典型的
是,只有当用户保持会话的时候,Session beans 才是活着的。一旦用户退出了,
Session beans 就不再与用户相联系了。Session beans被看成是瞬时的,因为如果
容器崩溃了,那么用户必须重新建立一个新的Session对象来继续会话。
  Session bean典型的声明了与用户的互操作或者会话。也就是说,Session
bean了在客户会话期间,通过方法的调用,掌握用户的信息。一个具有状态的
Session bean称为有状态的Session bean.当用户终止与Session beans互操作的时
候.会话终止了,而且,bean 也不再拥有状态值。Session bean也可能是一个无状
态的 session bean.无状态的Session beans并不掌握它的客户的信息或者状态。用
户能够调用beans的方法来完成一些操作。但是,beans只是在方法调用的时候才知
道用户的参数变量。当方法调用完成以后,beans并不继续保持这些参数变量。这样
,所有的无状态的session beans的实例都是相同的,除非它正在方法调用期间。这
样,无状态的Session beans就能够支持多个用户.容器能够声明一个无状态的
Session beans.能够将任何Session beans指定给任何用户.
  Entity Beans对数据库中的数据提供了一种对象的视图。例如:一个Entity
bean能够模拟数据库表中一行相关的数据。多个client能够共享访问同一个Entity
bean.多个client也能够同时的访问同一个Entity bean.Entity beans通过事务的上
下文来访问或更新下层的数据。这样,数据的完整性就能够被保证。Entity Beans
能存活相对教长的时间,并且状态是持续的。只要数据库中的数据存在,Entity
beans就一直存活。而不是按照应用程序或者服务进程来说的。即使EJB容器崩溃了
,Entity beans也是存活的。Entity Beans生命周期能够被容器或者 Beans自己管
理。如果由容器控制着保证 Entity beans持续的issus。如果由Beans自己管理,就
必须写Entity beans的代码,包括访问数据库的调用。
  Entity Beans是由主键(primary key 一种唯一的对象标识符)标识的。通常
,主键与标识数据库中的一块数据,例如一个表中的一行,的主键是相同的。主键
是client能够定位特定的数据块。
五、EJB的编程环境:
1、 使用Jbuilder
  Jbuilder与EJB Container能够进行无缝连接。Jbuilder和Inprise的应用服务
器包括了所有的开发和配置Enterprise Beans的工具以及所需要的库:运行和管理
Enterprise Bean的容器、命名服务、 事务服务、Java数据库、开发Enterprise
Beans所需要的API、一个增强的java-to-iiop编译器,支持值类型和RMI信号等等。
  Jbuilder还提供了一个快速开发应用程序Enterprise Beans的工具和向导。通
过简单而且直观的步骤,向导帮助你建立一个Enterprise Bean。自己设定某些缺省
值,产生了bean的模板,在上面,我们可以增加我们自己的应用逻辑。Jbuilder也
提供了一个EJB的接口生成向导。向导在Enterprise Bean的公共方法基础上生成了
Remote接口和Home接口。Jbuilder还提供一个配置器的向导帮助我们逐步的建立XML
描述器文件。并将生成的Stubs集中到一个jar文件中。
2、使用Jbuilder之外的集成环境:
  如果你使用其它的除了别的集成环境(IDE)。要确定使用了集成环境IDE所带
的容器工具。也要验证IDE是否支持EJB规范的相应的版本,还要确定它是否正确的
支持EJB的API。
  要确定JD到所支持的EJB容器的版本。可以通过检查Inprise的安装说明来确定
EJB容器所支持的支持JDK的版本。
  在配置Enterprise Bean的时候,你必须使用Inprise的应用服务器所提供的工
具。这些工具能够编辑和修改第三方的代理商提供的Inprise配置描述器。还能够验
证配置描述器,能够验证bean的源代码。
六、一个简单的HELLO例子
1、安装Apusic Application Server
  Note:以下以Linux为例,来说明Apusic Application Server的安装过程。其他
平台的安装,可参考Apusic Application Server安装手册。
  下载JDK1.2,Apusic Application Server必须运行在JDK1.2以上环境中。可从
以下站点下载最新JDK。
http://java.sun.com
  下载Apusic Application Server
Apusic Application Server 试用版可从以下网址得到:
  http://www.apusic.com/download/enter.jsp
  在下载完成后,你可以得到一个包裹文件apusic.zip,选定安装目录,假设安
装到/usr下,则用以下命令:
cd /usr
jar xvf apusic.zip
/usr下会出现一个目录apusic,Apusic Application Server的所有程序都被解压到
/usr/apusic下。
将以下路径加入到CLASSPATH中
/usr/apusic/lib/apusic.jar
$JAVA_HOME/lib/tools.jar
用以下命令运行Apusic Application Server
java -Xms64m com.apusic.server.Main -root /usr/apusic
2、定义EJB远程接口(Remote Interface)
  任何一个EJB都是通过Remote Interface被调用,EJB开发者首先要在Remote
Interface中定义这个EJB可以被外界调用的所有方法。执行Remote Interface的类
由EJB生成工具生成。
  以下是HelloBean的Remote Inteface程序:
package ejb.hello;
import java.rmi.RemoteException;
import java.rmi.Remote;
import javax.ejb.*;
public interface Hello extends EJBObject, Remote {
//this method just get "Hello World" from HelloBean.
public String getHello() throws RemoteException; }
3、定义Home Interface
  EJB容器通过EJB的Home Interface来创建EJB实例,和Remote Interface一样,
执行Home Interface的类由EJB生成工具生成。
以下是HelloBean 的Home Interface程序:
package ejb.hello;
import javax.ejb.*;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.*; /**
* This interface is extremely simple it declares only
* one create method. */
public interface HelloHome extends EJBHome {
public Hello create() throws CreateException,
RemoteException; }
4、写EJB类
  在EJB类中,编程者必须给出在Remote Interface中定义的远程方法的具体实现
。EJB类中还包括一些 EJB规范中定义的必须实现的方法,这些方法都有比较统一的
实现模版,编程者只需花费精力在具体业务方法的实现上。
以下是HelloBean的代码:
package ejb.hello;
import javax.ejb.*;
import java.util.*;
import java.rmi.*;
public class HelloBean implements SessionBean {
static final boolean verbose = true;
private transient SessionContext ctx;
// Implement the methods in the SessionBean
// interface
public void ejbActivate() {
if (verbose)
System.out.println("ejbActivate called"); }
public void ejbRemove() {
if (verbose)
System.out.println("ejbRemove called"); }
public void ejbPassivate() {
if (verbose)
System.out.println("ejbPassivate called"); }
/**
* Sets the session context. *
* @param SessionContext */
public void setSessionContext(SessionContext ctx) {
if (verbose)
System.out.println("setSessionContext called");
this.ctx = ctx; }
/**
* This method corresponds to the create method in
* the home interface HelloHome.java.
* The parameter sets of the two methods are
* identical. When the client calls
* HelloHome.create(), the container allocates an
* instance of the EJBean and calls ejbCreate(). */
public void ejbCreate () {
if (verbose)
System.out.println("ejbCreate called"); }
/**
* **** HERE IS THE BUSINESS LOGIC *****
* the getHello just return a "Hello World" string. */
public String getHello()
throws RemoteException {
return("Hello World"); } }
5、创建ejb-jar.xml文件
  ejb-jar.xml文件是EJB的部署描述文件,包含EJB的各种配置信息,如是有状态
Bean(Stateful Bean) 还是无状态Bean(Stateless Bean),交易类型等。ejb-
jar.xml文件的详细信息请参阅EJB规范。以下是HelloBean的配置文件:
<?xml version="1.0"?>
c ejb-jar PUBLIC "-//Sun Microsystems Inc.//DTD Enterprise
JavaBeans 1.2//EN" "http://java.sun.com/j2ee/dtds/ejb-jar_1_2.dtd">



Hello
ejb.hello.HelloHome
ejb.hello.Hello
ejb.hello.HelloBean
Stateless
<transaction-type>Container</transaction-type>





Hello
*

<trans-attribute>Required</trans-attribute>



6、编译和部署
编译Java源文件并将编译后class和ejb-jar.xml打包到Hello.jar
mkdir build
mkdir build/META-INF
cp ejb-jar.xml build/META-INF
javac -d build *.java
cd build
jar cvf Hello.jar META-INF ejb
cd ..
用EJB工具生成可部署到Apusic Application Server中运行的jar文件:
java com.apusic.ejb.utils.EJBGen -d /usr/apusic/classes/Hello.jar
build/Hello.jar
增加/usr/apusic/classes/Hello.jar到CLASSPATH中
将Hello.jar加入到Apusic Application Server配置文件中。
在/usr/apusic/config/server.xml 加入以下几行:


classes/Hello.jar

Hello
HelloHome



启动服务器
java -Xms64m com.apusic.server.Main -root /usr/apusic
7、写客户端调用程序
  您可以从Java Client,JSP,Servlet或别的EJB调用HelloBean。
  调用EJB有以下几个步骤:
  通过JNDI(Java Naming Directory Interface)得到EJB Home Interface
  通过EJB Home Interface 创建EJB对象,并得到其Remote Interface
  通过Remote Interface调用EJB方法
以下是一个从Java Client中调用HelloBean的例子:
package ejb.hello;
import javax.naming.Context;
import javax.naming.InitialContext;
import java.util.Hashtable;
import javax.ejb.*;
import java.rmi.RemoteException;
/**
* @author Copyright (c) 2000 by Apusic, Inc. All Rights Reserved. */
public class HelloClient{
public static void main(String args[]){
String url = "rmi://localhost:6888";
Context initCtx = null;
HelloHome hellohome = null;
try{
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.apusic.jndi.InitialContextFactory");
env.put(Context.PROVIDER_URL, url);
initCtx = new InitialContext(env);
}catch(Exception e){
System.out.println("Cannot get initial context: " + e.getMessage());
System.exit(1); }
try{
hellohome = (HelloHome)initCtx.lookup("HelloHome");
Hello hello = hellohome.create();
String s = hello.getHello();
System.out.println(s);
}catch(Exception e){
System.out.println(e.getMessage());
System.exit(1); } } }
运行HelloClient,可得到以下输出:
Hello World
作者Blog:http://blog.csdn.net/Inber/
相关文章
JCreator 注册码(Pro25 3.0/3.1 pro )
之控制表格的字数的处理方法.
EJB核心技术及其应用(转载)
PHP4调用JavaBean的摸索(转载佚名)
关于WebWork2中的中文问题 选择自 chenyun2000 的 Blog (转载)
对该文的评论
CSDN 网友 ( 2004-10-25)
谢谢,对我刚入门的来说,蛮有帮助。
windExtendsRikki ( 2004-10-08)
我非常喜欢Python,我以前买过一本Jython的书,不过还没看完就借给弟弟了.平时用
惯了IDE,觉得Python写起来有点不习惯,有没有有代码提示的PythonIDE呢?我找了一
年多了,还是没能找到.
现在只能用Vim来写Python.IDEL有没有什么办法用来开发Jython?
~~唉,都是一些偷懒的想法.呵呵.
Python是我用过最好的语言了.我特别喜欢.02年的时候就开始自己学了,不过一直进
步缓慢,周围的人都没有听说过这种语言,也没有机会用Python直接做开发,所以java
都已经玩很转了,Python还在入门水平. 唉...
↑返回目录
前一篇: EJB技术
后一篇: EJB菜鸟入门三板斧