1、第九章:组件思想,面向对象分析与设计,一、组件概述 二、COM思想 三、CORBA思想 四、EJB思想,基于UML描述的组件软件研究,一、组件概述,面向对象编程的软件重用如果仅限于程序源代码级别的重用,这是一种低层次的重用,真正的代码重用意味着代码必须用以足够通用的方式为重建更大型的代码而编写。 传统的解决方案:把一个庞大的程序分割成许多小模块,每个模块保持一定的功能独立性。建立API方式实现模块间接口。 存在的问题:API的更新;版本问题;模块间的通信;实现语言的兼容性。,一、组件概述,组件复用作为一种现实有效的软件开发方法正受到越来越多的重视和研究。近年来,随着DNA,中间件等三层体系结构
2、和分布式对象的兴起,为基于可复用组件的软件体系结构赋予了更大的内涵。从而使我们在评价构件复用的意义时,不应只局限于开发周期的缩短,软件质量的可靠提高,更要认识到构件组装式的开发在系统维护(如 版本更新,功能增删等),分布式计算等方面所带来的极大便利。由于维护阶段占软件开发周期总成本的67%左右,因此构件重用对整个软件产业的重要意义就不言而喻了.从维护和分布计算的角度考虑,构件复用就是要实现“即插即用”。,一、组件概述,最终解决方案:组件软件 。组件化程序设计思想,同样是将庞大的系统分割成许多功能对立的小模块,不再是一个简单的代码集,而是一个自给自足的组件(component),这些组件模块可以
3、运行在同一台机器,也可运行在不同的网络环境中。,一、组件概述,组件软件特点:组件易替换 适应业务需求更改 可实现二进制代码重用 有助于并行开发,一、组件概述,组件与框架:,组件与框架关联 组件 Vs. 框架 组件 框架/组件结合,Service Provider,Frameworks are based on Specialization,Components are based on Delegation,Generalized Ancestor,Specialized Descendent,一、组件概述,组件 Vs. 框架 职责的分配,都使用策略,组件 “黑盒” 重用 客户只知道公用接口
4、对客户接口影响不大 框架 “白盒” 重用 客户知道保护和公用的接口 对客户的结构影响大,一、组件概述,组件 Vs. 框架 区别,Component Library,Client Application,一、组件概述,评价,推荐,认可,拒绝,设计 & 构造,分布,发布,改变需求,不允许继续使用,标注删除,Deleted,一、组件概述,成功组件的生命周期,Client Application,Class Library,一、组件概述,框架与组件技术结合,框架和组件结合,概念: 泛化和委托 使用继承简单化设计 提供基本对象类型用于泛化 简化复杂组件的耦合 提供模板包装标准和复杂的结构和算法 但要注意
5、减少对客户应用结构的影响,一、组件概述,一、组件概述 二、COM思想 三、CORBA思想 四、EJB思想,基于UML描述的组件软件研究,2.1:COM思想从C+到DLL再到COM,1. C+ 如某一软件厂商发布一个类库(CMath四则运算),此时类库的可执行代码将成为客户应用中不可分割的一部分。假设此类库的所产生的机器码在目标可执行文件中占有4MB的空间。当三个应用程序都使用CMath库时,那么每个可执行文件都包含4MB的类库代码(见图1.1)。当三个应用程序共同运行时,他们将会占用12MB的虚拟内存。问题还远不于此。一旦类库厂商发现CMath类库有一个缺陷后,发布一个新的类库,此时需要要求所
6、有运用此类库的应用程序。此外别无他法了。,2.1:COM思想从C+到DLL再到COM,2.1:COM思想从C+到DLL再到COM,2. DLL 解决上面问题的一个技术是将CMath类做成动态链接库(DLL ,Dynamic Link Library)的形式封装起来 。 在使用这项技术的时候,CMath的所有方法都将被加到 CMath dll 的引出表(export list)中,而且链接器将会产生一个引入库(import library)。这个库暴露了CMath的方法成员的符号 。当客户链接引入库时,有一些存根会被引入到可执行文件中,它在运行时通知装载器动态装载 CMath Dll。 当 CM
7、ath 位于dll中时,他的运行模型见图1.2,2.1:COM思想从C+到DLL再到COM,2.1:COM思想从C+到DLL再到COM,3. COM “简单地把C+类定义从dll中引出来“这种方案并不能提供合理的二进制组件结构。因为C+类那既是接口也是实现。这里需要把接口从实现中分离出来才能提供二进制组件结构。此时需要有二个C+类,一个作为接口类另一个作为实现类。,2.2 COM基础,1、 COM基本知识 1.1 返回值HRESULT COM要求所有的方法都会返回一个HRESULT类型的错误号。HRESULT 其实就一个类型定义: typedef LONG HRESULT; 我们一般下面的宏来
8、判断方法是否成功:#define SUCCEEDED(hr)(long(hr)=0) #define FAILED(hr)(long(hr)0),2.2 COM基础,1.2 初识 IDL 每个标准的COM组件都需要一个接口定义文件,文件的扩展名为IDL。让我们看IUnknow接口的定义文件是怎样的。 local属性禁止产生网络代码。object属性是表明定义的是一个COM接口。uuid属性给接口一个GUID。unique属性表明null(空)指针为一个合法的参数值。pointer_defaul属性所有的内嵌指针指定一个默认指针属性 typedef unique IUnknown *LPUNKN
9、OWN;这是一个类型定义 cpp_quote这个比较有趣,这是一个在idl文件写注解的方法。这些注解将保存到*.h和*_i.c文件中in表示这个参数是入参 out表示这个参数是出参iid_is(riid)表示这个参数需要前一个的riid 参数。 注意:所有具有out属性的参数都需要是指针类型。, local, object, uuid(00000000-0000-0000-C000-000000000046), pointer_default(unique) interface IUnknown typedef unique IUnknown *LPUNKNOWN; cpp_quote(“/“
10、) cpp_quote(“/ IID_IUnknown and all other system IIDs are provided in UUID.LIB“) cpp_quote(“/ Link that library in with your proxies, clients and servers“)cpp_quote(“/“) HRESULT QueryInterface(in REFIID riid, out, iid_is(riid) void *ppvObject); ULONG AddRef();ULONG Release();,1.3 IUnkown接口 在整个例子除了IU
11、nkown这个东西,COM要求(最基本的要求)所有的接口都需要从IUnknown接口直接或间接继承。 IUnkown接口定义了三个方法。HRESULT QueryInterface(in REFIID riid,out void *ppv);ULONG AddRef();ULONG Release(); 其中 AddRef和Release()负责对象引用计数用的,而 QueryInterface()方法是用于查询所实现接口用的。每当COM组件被引用一次就应调用一次AddRef()方法。而当客户端在释放COM组件的某个接口时就需要调用Release()方法。 这里所讲的请在下面的例子仔细体会。,
12、2、一个比较简单的COM,此例子共有四个文件组成:Interface.h 接口类定义文件Math.h和Math.cpp实现类文件Simple.cpp 主函数文件这里用来当作COM的客户端,interface.h 文件 #ifndef INTERFACE_H#define INTERFACE_H #include /7C8027EA-A4ED-467c-B17E-1B51CE74AF57 static const GUID IID_ISimpleMath = 0x7c8027ea, 0xa4ed, 0x467c, 0xb1, 0x7e, 0x1b, 0x51, 0xce, 0x74, 0xaf,
13、 0x57 ; /CA3B37EA-E44A-49b8-9729-6E9222CAE84F static const GUID IID_IAdvancedMath = 0xca3b37ea, 0xe44a, 0x49b8, 0x97, 0x29, 0x6e, 0x92, 0x22, 0xca, 0xe8, 0x4f ;interface ISimpleMath : public IUnknown public: virtual int Add(int nOp1, int nOp2) = 0; virtual int Subtract(int nOp1, int nOp2) = 0; virtu
14、al int Multiply(int nOp1, int nOp2) = 0; virtual int Divide(int nOp1, int nOp2) = 0; ; interface IAdvancedMath : public IUnknown public: virtual int Factorial(int nOp1) = 0; virtual int Fabonacci(int nOp1) = 0; ; #endif,2、一个比较简单的COM,Interface.h 文件首先 #include 将 IUnknown 接口定义文件包括进来。 接下来定义了两个接口,GUID(Gl
15、obally Unique Identifier全局唯一标识符)它能保证时间及空间上的唯一。 ISmipleMath接口里定义了四个方法, 而IAdvancedMath接口里定义了二个方法。这些方法都是虚函数,而整个 ISmipleMath 与 IAdvancedMath 抽象类就作为二进制的接口。,math.h文件 #include “interface.h“ class CMath : public ISimpleMath, public IAdvancedMath private: ULONG m_cRef; private:int calcFactorial(int nOp); int
16、 calcFabonacci(int nOp);public: / IUnknown Method STDMETHOD(QueryInterface)(REFIID riid, void *ppv); STDMETHOD_(ULONG, AddRef)(); STDMETHOD_(ULONG, Release)();/ ISimpleMath Method int Add(int nOp1, int nOp2);int Subtract(int nOp1, int nOp2); int Multiply(int nOp1, int nOp2); int Divide(int nOp1, int
17、 nOp2);/ IAdvancedMath Methodint Factorial(int nOp); int Fabonacci(int nOp); ;,math.cpp文件 #include “interface.h“#include “math.h“ STDMETHODIMP CMath:QueryInterface(REFIID riid, void *ppv) / 这里这是实现dynamic_cast的功能,但由于dynamic_cast与编译器相关 if(riid = IID_ISimpleMath)*ppv = static_cast(this); else if(riid =
18、 IID_IAdvancedMath)*ppv = static_cast(this); else if(riid = IID_IUnknown) *ppv = static_cast(this); else *ppv = 0; return E_NOINTERFACE; reinterpret_cast(*ppv)-AddRef(); /这里要这样是因为引用计数是针对组件的 return S_OK; STDMETHODIMP_(ULONG) CMath:AddRef() return +m_cRef; ,STDMETHODIMP_(ULONG) CMath:Release() ULONG r
19、es = -m_cRef; / 使用临时变量把修改后的引用计数值缓存起来 if(res = 0) / 因为在对象已经销毁后再引用这个对象的数据将是非法的delete this; return res; 。 此类为实现类,他实现了ISmipleMath和IAdvancedMath两个接口类(当然也可以只实现一个接口类)。 请注意:m_cRef 是用来对象计数用的。当 m_cRef 为0组件对象应该自动删除。,simple.cpp文件 #include “math.h“ #include using namespace std; int main(int argc, char* argv) ISi
20、mpleMath *pSimpleMath = NULL;/声明接口指针 IAdvancedMath *pAdvMath = NULL; /创建对象实例,我们暂时这样创建对象实例,COM有创建对象实例的机制 CMath *pMath = new CMath;/查询对象实现的接口ISimpleMath pMath-QueryInterface(IID_ISimpleMath, (void *) 此文件相当于客户端的代码,首先创建一个CMath对象,再根据此对象去查询所需要的接口,如果正确得到所需接口指针,再调用接口的方法,最后再将接口的释放掉。,Math组件的二进制结构图,二、COM思想,面向对
21、象的组件模型COM 按照组件模型搭建起来的软件称为组件软件。软件组件按照一定的接口模式组织成组件软件。组件接口方式保证软件组件之间的通信。 COM除提供组件间的接口标准外,还引用了面向对象的思想。 在WINDOWS平台上,一个COM可以是一个DLL,也可是一个EXE。一个组件程序可以包含多个COM对象,一个COM对象也可实现多个接口。,二、COM思想,面向对象的组件模型COM 由于COM对象和使用COM对象的客户之间建立C/S模式,因此通常称COM对象为COM服务器。 COM的发展是经过DDE,OLE1,VBX,OLE2,DCOM,ACTIVEX,COM+。 COM组件软件组成:COM对象,C
22、OM接口,COM客户,COM库(框架)。,二、COM思想,COM具有的特点 二进制特性 接口不变性 继承性:类继承说明继承,同时也实现继承;接口继承只说明继承。 多态性:COM对象也具有多态性,通过COM接口体现。多态性使得客户用以同样的方法处理不同的对象,或不同类型的对象,只要它们实现了同样的接口。,二、COM思想,COM内容 COM接口与对象1、IUnknownHResult QueryInterface(iid,*ppv) ULONG AddRef(void)ULONG Release(void)2、全局唯一标识符GUID3、COM接口定义,二、COM思想,COM内容3、COM接口定义,
23、接口指针,vtable指针,指针函数1,指针函数2,指针函数3,对象实现,pVtable,vtable,二、COM思想,COM内容3、COM接口定义class IDB: public IUnknown public:virtual HRESULT _stdcall read(,)=0; virtual HRESULT _stdcall write(,)=0;,二、COM思想,COM内容3、COM接口定义,客户使用的 接口指针,vtable指针,QueryInterface地址,AddRef地址,Release地址,Read地址,对象实现,pVtable,vtable,m_arrTable,m_
24、arrName,Write地址,二、COM思想,COM内容4、接口描述语言IDLimport “my.h”,”unknown.h”; object, uuid( - - - - - ), interface IFace: IUnknown HRESULT MethodA(in,out); 比如用以下编译: midl example.idl example.h : 包含接口说明文件example_p.h: 实现了接口IFace的代理和存根example_c.h: 定义了所以用到的GUID,包括IIDdlldata.c: 包含代理/存根的入口和代理类厂所要的数据结构,COM应用模型 1、客户服务器
25、模型:包容与聚合,容器与服务器的概念,二、COM思想,COM内容,COM应用模型 2、进程内组件: DLL、LPC一个进程内组件通常是DLL方式存在的,客户程序需要找到DLL。客户程序得到的指针指向组件程序中接口的vtable,vtable包含了该结构所有成员函数的入口地址。,二、COM思想,COM内容,COM应用模型 3、进程外组件: DLL、LPC、RPC、代理DLL、存根DLL,二、COM思想,COM内容,COM应用模型 4、COM库(框架) 初始化函数:CoInitialize GUID相关函数:IsEqualGUID 对象创建函数:CoGetClassObject:获得对象类厂CoC
26、reateInstance:创建COM对象 内存管理函数:CoTaskMemAlloc,二、COM思想,COM内容,COM应用模型 5、COM与注册表 Regsrv32,二、COM思想,COM内容,COM组件 1、实现类工厂对象,二、COM思想,COM内容,COM组件 1、实现类工厂对象 类厂本身就是一个COM对象,支持一个特殊的接口IClassFactory IClassFactory:public IUnknown public :void HRESULT CreateInstance(/* in */ Iunknown *pUnknwon;/* in */ REFIID riid,/*
27、out */ void *ppvObject() = 0;,二、COM思想,COM内容,COM组件 1、实现类工厂对象 Class CDBSrvFactory:public IClassFactorypublic :HRESULT CreateInstance(,);HRESULT QueryInterface(,);ULONG AddRef(,); ULONG Release(,);,二、COM思想,COM内容,COM组件 1、实现类工厂对象 Class CDBSrvFactory:CreateInstance(,riid,*ppObject) CDB * pDb= new CDB;if(
28、FAILED(pDB-QueryInterface( riid,ppObject ) ) delete pDB;,二、COM思想,COM内容,COM组件 2、实现自动注册 3、实现自动卸载,二、COM思想,COM内容,COM客户 1、COM对象创建函数:包含了工厂模式的思想,封装了类厂,使用户使用起来更简单。 CoGetClassObject : 获得类厂 CoCreateInstance: 直接创建对象 IClassFactory *pFactory;CoGetClassObject( , *pFactory);pFactory-CreateInstance( , , *ppv),二、COM
29、思想,COM内容,COM客户调用进程内组件过程描述 1、COM客户程序CLSID clsid;IClassFactory *pClf;IUnknown *pUnk;CoInitialize(NULL); /初始化COM库CLSIDFromProgID( “组件name”, 2、COM库使用注册表,根据ProgID得到CLSID 3、 COM客户程序 (请求得到类厂,阻塞)CoGetClassObject(clsid,IID_IClassFactory,(void*)&pClf),二、COM思想,COM内容,COM客户调用进程内组件过程描述 4、 COM库COM库使用CLSID在内存中查找组件;
30、if( 组件DLL还没有载入 ) COM从注册表中过得组件程序DLL的文件名;COM向进程内存加载组件DLL( CoLoadLibray ) 5、组件程序(DLL)创建全局类厂对象,并返回IClassFactory 接口 6、 COM库COM库返回IClassFactory接口指针给客户,二、COM思想,COM内容,COM客户调用进程内组件过程描述 7、 COM客户程序(阻塞结束)pClf-CreateInstance( NULL, IID_IUnkown, (void*),二、COM思想,COM内容,COM客户调用进程内组件过程描述 10、 组件程序组件对象的Release通过vtable被
31、调用;if( m_Ref=0 ) delete this; /自行销毁对象 11、 COM客户程序(DLL)调用CoFreeUnusedLibraries() 12、 COM库 13、 组件程序 14、 COM库 15、 COM客户程序 CoUninitialize(),二、COM思想,COM内容,一、组件概述 二、COM思想 三、CORBA思想 四、EJB思想,基于UML描述的组件软件研究,三、CORBA思想,CORBA是一种标准的面向对象应用程序体系规范。CORBA最初是对象管理组织(OMG)在1990年11月出版的中定义的。OMG是一个非盈利性的组织,成立与1989年,现有500多个成员
32、公司。OMG致力于推广在现有技术基础上集成应用程序的面向对象标准。 CORBA发布的定义包含在中。1991年12月出版了该规范的1.1版本,描述如何开发CORBA。1.1版本是DEC公司、HewlettPacket公司、HyperDesk公司、NCR公司、对象设计公司和SunSoft公司联合开发的,最终由OMG审议并获得通过。CORBA可以称为通信中间件,这是因为可以把CORBA看成是把应用程序和通信核心的细节分离的软件。然而,按照CORBA规范所开发的软件并不一定要在网络上通信,它可以产生包含在客户机本地的一个方法。,三、CORBA思想,通过CORBA,可以无须与现有硬件、网络和软件结构打交
33、道,就可以把PC机及它的应用程序同其他部分连起来。CORBA可以提供如下能力: 存储来自现行桌面应用程序的分布信息和资源。 使现有业务数据和系统成为可供利用的网络资源。 利用为某一特定业务定制的功能和能力来增强现行桌面工具和应用程序。 改变和发展基于网络的系统以反映新的拓扑结构或新资源。,OMG对象管理体系,OMG的于1990年11月出版,其中定义了应用程序的面向对象体系(OMA),它是CORBA的基础。 OMG OMA由四个构件组成,如图3-1所示,定义如下:,OMG对象管理体系,OMG对象管理体系,对象请求代理器ORB(Object Request Broker)反映了CORBA这一名字的
34、起源。ORB为系统中的所有对象提供通信中枢(hub)。其功能类似于硬件总线,它提供了对象间信息流动所需的通路。由于ORB是其他OMA构件的中心,因而也是OMG最先定义和软件供应商最先实现的构件。 对象服务为创建对象,进行对象访问控制,实现对象跟踪和对象引用等提供了一套标准函数;并为应用程序开发人员便于开发对象提供必要的系统服务。应用程序开发人员只需要在自己的程序中调用这些对象服务函数即可,而无须编写私有的对象服务函数。其中包括的对象服务规范有:对象命名(为对象定位)、对象事件(为对象的事件转换)、对象生命周期(为控制对象创建)和永久性对象服务(为存储对象)。,OMG对象管理体系,公共工具 OM
35、G正在为公共工具建立规范。公共工具为许多不同用途的应用程序提供一套常用的工具程序,例如复合文档管理工具、数据库存取工具、文件打印工具和在分布式环境中时间同步的工具等等。 应用程序对象为最终用户提供一套完成特定任务的对象。可以用另外一些更基本的对象来构建应用程序对象。这些基本对象中有一些是跟应用程序对象息息相关的,而另一些则是从公共工具中取出来的。例如可以这样来构造字处理应用对象:用与应用程序相关的对象来处理文档的创建和操纵,而公共工具对象则处理文档的打印和存储。,三、CORBA思想,通用对象请求代理体系CORBACORBA(Common Object Request Broker Archit
36、ecture,通用对象请求代理体系结构)是国际OMG(Object Management Group)组织颁布的一系列有关对象技术的规范之一。 该模型描述了OMG地规范所遵循地概念化地基础结构,其核心部分是ORB(Object Request Broker,对象请求代理)。 ORB提供了一种机制,通过这种机制,对象可以透明地发出请求和接受响应。基于ORB机制就可以充分利用分布的、可以互操作的对象构造可以互操作的应用。,三、CORBA思想,CORBA的主要内容,1、IDL语言通过说明对象的接口来定义对象。一个接口包括一组命名的操作和相应于这些操作的参数。IDL语言实质上提供了一种手段,通过它,特
37、定的对象实现就能告诉客户哪些操作是可用的,并且应该如何激活这些操作。 2、ORB核心提供了客户对象实现间实现透明通信的方法,它可以屏蔽对象实现位置、实现方式、状态和通信机制等细节以及不同实现间可能存在的差异。 3、对象适配器位于ORB核心和对象实现之间,它负责服务对象的注册、对象引用的创建和解释、对象实现的服务进程的激活和去活、对象实现的激活和去活以及客户请求的分发。 4、IDL桩为客户提供了静态调用方式,IDL构架为客户提供了静态实现方式。IDL编译器编译描述服务对象接口的IDL文件,生成对应于具体编程语言的IDL桩和IDL构架程序。IDL桩负责把用户的请求进行编码,发送到对象实现端,把结果
38、或异常信息返回给用户;IDL构架对用户请求进行解码,并把执结果或异常信息编码后发送回客户 。,三、CORBA思想,CORBA的主要内容,5、动态调用接口DII(Dynamic Invocation Interface)和动态构架接口DSI(Dynamic Skeleton Interface)提供了动态调用方式和动态实现方式。在对象实现方可以使用DSI动态分发用户请求的机制,以便动态地处理客户方地请求。 6、在动态方式下,需要查询相应地服务对象的接口描述信息,这些信息由接口库提供。接口库通常以IDL描述文件为其输入,将接口描述信息进行处理后存放在文件、数据库或者其他形式的存储机制中,并提供一组
39、标准的调用接口供客户查询使用。,三、CORBA思想,CORBA的主要内容,1、引入了代理(Broker)的概念。一个代理至少可以有三个方面的作用:完成对客户方提出的抽象服务请求的映射;自动发现和寻找服务器;自动设定路由,实现到服务器方的执行。用户在编制客户方程序时就可以避免了解过多的细节,而只要完整地定义和说明客户需要完成的任务和目标。用代理来处理客户/服务器模式环境下应用或者应用系统之间交互的信息,称为请求(Request)和响应(Response)。客户方和服务器方相互独立无关,使得软件易于修改、移植和维护。 2、所实现的客户方程序与服务器方程序的完全分离。 3、将分布计算同面向对象的概念
40、相互结合。 4、分层的设计原则和实现方式。CORBA规范仅定义了ORB中需要用到的基本对象,封装了相应的属性和方法。而面向应用的对象定义则可以在OMA的应用对象、领域对象或应用开发环境中逐步分层定义和实现,使CORBA系统核心始终是一个精炼的实体,而各种复杂功能和应用可以由核心扩展和延伸。,三、CORBA思想,CORBA的主要特点,序列化对象成数据流格式, 通过IPC通道传输数据流 在服务端重建对象.,IPC,Client Object,Server Object,Data Structure,客户服务器模式,三、CORBA思想,mytarget = create Target source
41、= create Serializer source.SetData (stream) mytarget.DeSerialize (source),Client,Target Ancestor state1 Serialize (serializer) DeSerialize (serializer),Target state2 Serialize (serializer) DeSerialize (serializer),Serializer GetState (state) SetState (state) GetData() SetData (stream),super:Serializ
42、e (serializer) serializer.SetSet (state2),Data Stream state1, state2,Invoker MakeTarget(),ORB序列化模式,三、CORBA思想,一、组件概述 二、COM思想 三、CORBA思想 四、EJB思想,基于UML描述的组件软件研究,四、EJB思想,企业版JAVABean EJB组件在J2EE规范中自成一层,把应用程序的表示层和后端信息系统(比如数据库或者主框架计算机)捆绑了起来。EJB架构既用到了EJB对象的功能又利用了它们所运行的环境。 从概念上看,EJB对象封装了业务对象及其概念,让开发人员把精力集中于解决方
43、案的细节之上。从设计的角度看,EJB应该轻便而相互影响地合并起来。这一举措可以令单一的EJB,不论其是否为商务应用程序就可能采用一个EJB代表自主开发还是第3方厂商开发却都能用于多种应用程序。 EJB对象驻留在EJB容器内,后者是向开发者提供各类服务的环境。容器根据具体的配置可能负责处理安全、事务和实例管理。由于程序员无须再亲自完成这些任务从而令开发时间大大节约。 J2EE服务器和EJB容器这两个概念之间存在显著差别, EJB容器可能属于J2EE服务器的一部分,但却并不一定是必需的组成部分。在作为J2EE服务器组成部分的情况下,EJB客户程序通常会采取Java servlet或者JSP的形式。
44、,四、EJB思想,企业版JAVABean EJB的内容EJB对象分为以下三种类别:会话Beans 实体Beans 消息驱动Beans 会话Beans会话(Session)Beans的作用建立在会话的基础之上。客户在请求并收到bean功能之后,具有特定bean的会话就终止了而且没有留下会话发生的记录。会话Bean类型还可以进一步细分为无状态或者有状态方式。 无状态会话Beans并不知道客户或者涉及到请求的上下文,从而令其成为单一请求/回应应用的理想工具。,四、EJB思想,企业版JAVABean EJB的内容 实体Beans 实体(Entity)Beans表示会话终止之后持久存在的业务对象或者数据
45、。它们通常作为数据库中的单一记录形式存在,当然,其存储形式也可能采用其他媒质,比如文件等。一个对象就表示一个用户,有名字、联系方式、语言选择等等,这些参数代表了实体Bean的用途。作为持久性最本质的内涵之一,实体Bean的唯一标识或者主键起到了识别和检索正确对象信息的作用。实体beans需要主键作为“辅助类”封装对象的唯一标识符。 现在不考虑EJB的类别,以上三种类型组成了EJB对象:本地接口、远程接口和bean的实现。客户程序使用Java命名和目录接口JNDI(Java Naming and Directory Interface)定位bean的本地接口(JNDI)。本地接口随后返回远程接口的实例,同时暴露必要的bean实现方法。客户程序再调用适当的这些方法。,四、EJB思想,企业版JAVABean,
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1