互联网以及电子商务技术的普及和发展,推动着企业信息系统的构建和更新进程。为了缩短企业信息系统的设计和开发周期、降低构建企业信息系统的成本、在已有系统中对变化的商务规则迅速地做出反映,Sun公司制订了Java2 SDK Enterprise Edition(J2EE)规范,定义基于组件的方式设计、开发、组装和部署企业应用系统的各个组成部分。
J2EE规范定义了分布式多层应用系统模型、组件重用策略、一致化的安全模型以及灵活的事务控制策略等,使得独立软件提供商(ISV)能够以比以前更快的速度向市场推出具有用户适应性的客户解决方案。另外,平台独立、基于组件技术的J2EE解决方案不受软件产品类型和不同应用环境的制约。
分布式多层应用模型
在实际构建的企业信息系统中,需要根据J2EE规范定义的分布式多层应用模型将不同性质和用途的组件部署到不同类型的应用服务器中。J2EE规范根据企业信息系统各个组成部分在功能上的区别,将整个应用系统划分为客户层、中间层(其中可包括WEB层、业务层)和企业信息系统层三层结构,如下图所示。各个应用层分别配置在不同类型的应用服务器中。
图1 基于J2EE规范划分的企业应用系统逻辑层
客户层
客户层用于与企业信息系统的用户进行交互以及显示根据特定商务规则进行计算后的结果。基于J2EE规范的客户端可以是基于WEB的,也可以是不基于WEB的独立(Stand Alone)应用程序。
在基于WEB的J2EE客户端应用中,用户在客户端启动浏览器后,从WEB服务器中下载WEB层中的静态HTML页面或由JSP或Servlets动态生成的HTML页面。
在不基于WEB的J2EE客户端应用中,独立的客户端应用程序可以运行在一些基于网络的系统中,比如手持设备或汽车电话等。同样,这些独立的应用也可以运行在客户端的Java Applet中。这种类型的客户端应用程序可以在不经过WEB层的情况下直接访问部署在EJB容器(EJB Container)中的EJB组件。
与数据库记录在数据库表中的存在方式类似,在实体组件中定义了用于标识实体组件的主键(Primary Key)对象。该主键与标识数据库表记录的主键相对应,代表同一数据库记录的实体组件的主键值是相同的。客户端应用程序能够利用主键来定位EJB容器中的实体组件,进而定位实体组件表示的数据库记录。
按照实体组件的生命期管理方式,EJB规范将实体组件划分为组件管理持久性(Bean-Managed Persistence,BMP)和容器管理持久性(Container-Managed Persistence,CMP)两种类型。在组件部署过程中,由部署工具为容器管理持久性类型EJB组件的生命期方法编写组件状态转换代码,EJB容器调用这些方法实现组件的状态转换。相对而言,组件程序设计人员必须为组件管理持久性类型EJB组件编写控制组件的创建、删除、激活、关闭等生命期测量的SQL代码。
◇消息驱动组件
消息驱动组件(Message Driven Bean)是EJB2.0规范中引入的新型组件,用于在EJB容器中提供一种响应外部事件消息的组件类型机制。
在引入消息驱动类型EJB组件之前,基于J2EE的分布式应用对于事件消息的处理方式是利用独立的Java事件处理程序来监听来自于客户端应用程序、EJB组件、JSP组件甚至是J2EE平台之外事件源发出的符合Java消息服务(Java Message Service,JMS)规范事件消息。引入消息驱动类型EJB组件后,部署在EJB容器中的消息驱动类型EJB组件利用组件中定义的OnMessage方法监听来自事件源的消息并做出反映,进而能够调用其它类型的组件来对消息进行响应。消息驱动类型EJB组件作为EJB容器中的事件监听器(Listener),可以在接收到来自JMS消息队列中的事件消息后由EJB容器来激活消息驱动组件对象实例。
消息驱动组件是服务器端的无状态类型组件。该类型的组件只有组件类定义,没有类似于会话组件和实体组件的Home接口和Remote接口。
EJB规范定义的开发者角色
EJB组件体系结构是基于J2EE规范构建的应用软件系统的主要部分。完整J2EE应用的核心内容是封装了商务逻辑的EJB组件。
按照EJB2.0规范的定义,基于EJB规范的分布式计算体系结构由六个角色组成,这六个角色可以是软件开发团队、系统软件供应商、应用软件集成商等,每个角色所完成的工作必须遵循EJB规范,以保证彼此之间的兼容性。这六个角色分别是:
◇EJB组件开发者
EJB组件开发者(Enterprise Bean Provider)负责开发封装有商务规则的EJB组件。EJB组件开发者定义EJB组件的Home接口和Remote接口、编写组件类并且提供部署EJB组件的部署描述文件(Deployment Descriptor)。EJB组件开发者是商务应用开发领域的专家,不需要精通系统级编程方法以及系统级的组件事务管理、同步、安全性、分布式计算等细节。
◇部署者
部署者(Deployer)负责将打包后的EJB组件部署到EJB服务器等应用环境中。部署者应根据EJB组件的部署描述文件中声明的对各种类型的资源,如数据库、安全性管理等的需求来配置EJB服务器来为组件提供服务。部署者是EJB应用环境方面的专家。
◇应用组装者
应用组装者(Application Assembler)负责将各种类型的EJB组件组合成一个完整的应用系统,因此应用组装者必须明确待组装EJB组件的Home接口和Remote接口定义的详细内容。
◇EJB服务器提供者
EJB服务器通常由操作系统开发商、中间件开发商或数据库开发商来提供。因此,EJB 服务器提供者(EJB Server Provider)是应用软件系统领域的专家,精通分布式系统管理、分布式对象管理及其它系统服务。
◇EJB容器提供者
EJB 容器提供者(EJB Container Provider)是系统级的编程专家,其工作主要集中于开发可伸缩的,具有事务、交易和安全管理功能的集成在EJB服务器中的EJB容器。EJB容器提供者为EJB组件开发者提供了一组标准的API来访问EJB容器,使EJB组件开发者不需要了解EJB服务器中的各种技术细节就能够开发出部署在EJB容器中的EJB组件。
在实际应用中,通常假定EJB服务器提供者和EJB容器提供者来自同一软件开发商,因而没有定义EJB服务器提供者和EJB容器提供者之间的接口标准。
◇系统管理员
系统管理员(System Administrator)负责为EJB服务器和EJB容器提供一个企业级的计算环境并利用EJB服务器和EJB容器提供的监测管理工具监测EJB组件的运行情况。
EJB容器
企业信息系统业务层中的EJB组件通常部署在被称为EJB容器的应用服务器中,由EJB容器提供EJB组件的状态管理、事务管理、线程管理、远程数据资源访问、连接管理和安全性管理等系统级服务。所有的EJB组件实例都运行在EJB容器中,由EJB容器控制着EJB组件的生命期。EJB组件可以被定制为提供安全和事务处理等各种系统级服务,但这些服务特性在本质上不属于EJB组件类,而是由部署EJB组件的容器来提供和实现的。
按照EJB规范编写的任何EJB组件均可以部署到任何一个与规范兼容的EJB容器中,可以根据应用系统的需要配置EJB容器来对组件的事务或安全性进行管理。在EJB组件部署过程中将业务逻辑的处理功能与底层的应用系统服务逻辑分开,使得EJB容器可以在运行时(Runtime)创建和管理EJB组件。
在11月28日的EJB系列讲座的第二讲中,我们将详细介绍EJB组件的基本结构。
WEB层
J2EE规范定义的WEB层由JSP页面、基于WEB的Java Applets以及用于动态生成HTML页面的Servlets构成。这些基本元素在组装过程中通过打包来创建WEB组件。运行在WEB层中的WEB组件依赖WEB容器来支持诸如响应客户请求以及查询EJB组件等功能。
业务层
在基于J2EE规范构建的企业信息系统中,将解决或满足特定业务领域商务规则的代码构建成为业务层中的Enterprise JavaBean(EJB)组件。EJB组件可以完成从客户端应用程序中接收数据、按照商务规则对数据进行处理、将处理结果发送到企业信息系统层进行存储、从存储系统中检索数据以及将数据发送回客户端等功能。
部署和运行在业务层中的EJB组件依赖于EJB容器来管理诸如事务、生命期、状态转换、多线程及资源存储等。这样,由业务层和WEB层构成了多层分布式应用体系中的中间层。
企业信息系统层
在企业应用系统的逻辑层划分中,企业信息系统层通常包括企业资源规划(ERP)系统、大型机事务处理(Mainframe Transaction Processing)系统、关系数据库系统(RDMS)及其它在构建J2EE分布式应用系统时已有的企业信息管理软件。
J2EE平台应用编程环境
按照对基于J2EE规范的企业应用系统逻辑层的划分,通常将分布式应用系统的编程环境划分为如下四种类型:
◇EJB容器
EJB容器用于提供EJB组件的开发、部署和运行环境。
◇WEB容器
WEB组件用于提供应用系统的显示逻辑,而WEB容器则提供适合于Servlet和JSP开发、部署和运行的环境。
◇客户应用容器
客户应用容器用于提供分布式应用系统的客户端运行环境,其本质上是J2SE。
◇Applet容器
提供适合于Java Applet运行的浏览器运行环境。
Enterprise JavaBean规范的基本特征
在J2EE规范将企业应用系统划分的各逻辑层中,将封装商务规则的EJB组件部署在业务层中,用于根据客户端的服务请求进行业务数据的处理。EJB组件是基于分布式事务处理的企业级应用程序组件,其中包含处理业务数据的应用逻辑以及客户端调用EJB组件的商务方法获取服务的客户端接口。当一个遵循EJB规范开发的第三方EJB组件被集成到一个应用系统中时,不需要更改其实现代码或者重新编译。
EJB组件类型
在EJB2.0规范中定义了三种类型的组件:会话组件(Session Bean)、实体组件(Entity Bean)和消息驱动组件(Message-Driven Bean)。
会话组件和实体组件的定义由Home接口、Remote接口和组件类构成。在EJB组件的Home接口中定义了创建、删除和定位EJB组件的方法;EJB组件的Remote接口用于定义组件能够提供的商务方法;EJB组件类则用于实现Home接口中定义的组件生命期方法以及Remote接口中定义的商务方法。
◇会话组件
会话组件代表EJB组件与客户程序的一个短暂交互过程,其完成的功能可能是执行数据库读写操作或者是进行简单的数学计算等。
会话组件可以看成是瞬态的,其生命周期相对短暂,只有在客户程序与会话组件保持联系的过程中会话组件才具有生命力。如果客户程序结束会话过程,EJB容器将会话组件对象实例移出EJB容器中的组件实例池,该会话组件实例将失去生命力。另外,如果在客户程序与会话组件交互过程中EJB容器崩溃,那么用户必须重新创建一个新的会话组件对象实例来继续会话过程。
按照EJB2.0规范的定义,会话组件分为有状态(Stateful)和无状态(Stateless)两种类型。有状态会话组件中包含表示客户程序访问和更新数据的会话状态参数。会话状态参数用于记录会话组件引用的对象状态而不是在关系数据库中存储的数据资源。相对而言,在无状态会话组件中没有用于记录与特定客户程序相关联的状态参数,因此不能够记录客户程序的状态和保持客户程序在服务器端行为。
◇实体组件
实体组件用于提供数据库中数据记录在EJB服务器中的对象类型视图。一个实体组件代表数据库表中一行数据记录。客户端应用程序对实体组件的访问等价于对EIS层中数据库的访问过程。在多客户应用的情况下,通过EJB容器的事务管理功能能够使多个客户进程以共享的方式访问同一个实体组件,进而保持组件对应数据库记录的一致性和完整性。实体组件的状态是持续的,只要数据库中的数据记录存在,实体组件创建后就一直存在于EJB容器中,即使EJB服务器崩溃,实体组件同样具有生命力。
J2EE规范定义了分布式多层应用系统模型、组件重用策略、一致化的安全模型以及灵活的事务控制策略等,使得独立软件提供商(ISV)能够以比以前更快的速度向市场推出具有用户适应性的客户解决方案。另外,平台独立、基于组件技术的J2EE解决方案不受软件产品类型和不同应用环境的制约。
在实际构建的企业信息系统中,需要根据J2EE规范定义的分布式多层应用模型将不同性质和用途的组件部署到不同类型的应用服务器中。J2EE规范根据企业信息系统各个组成部分在功能上的区别,将整个应用系统划分为客户层、中间层(其中可包括WEB层、业务层)和企业信息系统层三层结构,如下图所示。各个应用层分别配置在不同类型的应用服务器中。
客户层
客户层用于与企业信息系统的用户进行交互以及显示根据特定商务规则进行计算后的结果。基于J2EE规范的客户端可以是基于WEB的,也可以是不基于WEB的独立(Stand Alone)应用程序。
在基于WEB的J2EE客户端应用中,用户在客户端启动浏览器后,从WEB服务器中下载WEB层中的静态HTML页面或由JSP或Servlets动态生成的HTML页面。
在不基于WEB的J2EE客户端应用中,独立的客户端应用程序可以运行在一些基于网络的系统中,比如手持设备或汽车电话等。同样,这些独立的应用也可以运行在客户端的Java Applet中。这种类型的客户端应用程序可以在不经过WEB层的情况下直接访问部署在EJB容器(EJB Container)中的EJB组件。
与数据库记录在数据库表中的存在方式类似,在实体组件中定义了用于标识实体组件的主键(Primary Key)对象。该主键与标识数据库表记录的主键相对应,代表同一数据库记录的实体组件的主键值是相同的。客户端应用程序能够利用主键来定位EJB容器中的实体组件,进而定位实体组件表示的数据库记录。
按照实体组件的生命期管理方式,EJB规范将实体组件划分为组件管理持久性(Bean-Managed Persistence,BMP)和容器管理持久性(Container-Managed Persistence,CMP)两种类型。在组件部署过程中,由部署工具为容器管理持久性类型EJB组件的生命期方法编写组件状态转换代码,EJB容器调用这些方法实现组件的状态转换。相对而言,组件程序设计人员必须为组件管理持久性类型EJB组件编写控制组件的创建、删除、激活、关闭等生命期测量的SQL代码。
◇消息驱动组件
消息驱动组件(Message Driven Bean)是EJB2.0规范中引入的新型组件,用于在EJB容器中提供一种响应外部事件消息的组件类型机制。
在引入消息驱动类型EJB组件之前,基于J2EE的分布式应用对于事件消息的处理方式是利用独立的Java事件处理程序来监听来自于客户端应用程序、EJB组件、JSP组件甚至是J2EE平台之外事件源发出的符合Java消息服务(Java Message Service,JMS)规范事件消息。引入消息驱动类型EJB组件后,部署在EJB容器中的消息驱动类型EJB组件利用组件中定义的OnMessage方法监听来自事件源的消息并做出反映,进而能够调用其它类型的组件来对消息进行响应。消息驱动类型EJB组件作为EJB容器中的事件监听器(Listener),可以在接收到来自JMS消息队列中的事件消息后由EJB容器来激活消息驱动组件对象实例。
消息驱动组件是服务器端的无状态类型组件。该类型的组件只有组件类定义,没有类似于会话组件和实体组件的Home接口和Remote接口。
EJB规范定义的开发者角色
EJB组件体系结构是基于J2EE规范构建的应用软件系统的主要部分。完整J2EE应用的核心内容是封装了商务逻辑的EJB组件。
按照EJB2.0规范的定义,基于EJB规范的分布式计算体系结构由六个角色组成,这六个角色可以是软件开发团队、系统软件供应商、应用软件集成商等,每个角色所完成的工作必须遵循EJB规范,以保证彼此之间的兼容性。这六个角色分别是:
◇EJB组件开发者
EJB组件开发者(Enterprise Bean Provider)负责开发封装有商务规则的EJB组件。EJB组件开发者定义EJB组件的Home接口和Remote接口、编写组件类并且提供部署EJB组件的部署描述文件(Deployment Descriptor)。EJB组件开发者是商务应用开发领域的专家,不需要精通系统级编程方法以及系统级的组件事务管理、同步、安全性、分布式计算等细节。
◇部署者
部署者(Deployer)负责将打包后的EJB组件部署到EJB服务器等应用环境中。部署者应根据EJB组件的部署描述文件中声明的对各种类型的资源,如数据库、安全性管理等的需求来配置EJB服务器来为组件提供服务。部署者是EJB应用环境方面的专家。
◇应用组装者
应用组装者(Application Assembler)负责将各种类型的EJB组件组合成一个完整的应用系统,因此应用组装者必须明确待组装EJB组件的Home接口和Remote接口定义的详细内容。
◇EJB服务器提供者
EJB服务器通常由操作系统开发商、中间件开发商或数据库开发商来提供。因此,EJB 服务器提供者(EJB Server Provider)是应用软件系统领域的专家,精通分布式系统管理、分布式对象管理及其它系统服务。
◇EJB容器提供者
EJB 容器提供者(EJB Container Provider)是系统级的编程专家,其工作主要集中于开发可伸缩的,具有事务、交易和安全管理功能的集成在EJB服务器中的EJB容器。EJB容器提供者为EJB组件开发者提供了一组标准的API来访问EJB容器,使EJB组件开发者不需要了解EJB服务器中的各种技术细节就能够开发出部署在EJB容器中的EJB组件。
在实际应用中,通常假定EJB服务器提供者和EJB容器提供者来自同一软件开发商,因而没有定义EJB服务器提供者和EJB容器提供者之间的接口标准。
◇系统管理员
系统管理员(System Administrator)负责为EJB服务器和EJB容器提供一个企业级的计算环境并利用EJB服务器和EJB容器提供的监测管理工具监测EJB组件的运行情况。
EJB容器
企业信息系统业务层中的EJB组件通常部署在被称为EJB容器的应用服务器中,由EJB容器提供EJB组件的状态管理、事务管理、线程管理、远程数据资源访问、连接管理和安全性管理等系统级服务。所有的EJB组件实例都运行在EJB容器中,由EJB容器控制着EJB组件的生命期。EJB组件可以被定制为提供安全和事务处理等各种系统级服务,但这些服务特性在本质上不属于EJB组件类,而是由部署EJB组件的容器来提供和实现的。
按照EJB规范编写的任何EJB组件均可以部署到任何一个与规范兼容的EJB容器中,可以根据应用系统的需要配置EJB容器来对组件的事务或安全性进行管理。在EJB组件部署过程中将业务逻辑的处理功能与底层的应用系统服务逻辑分开,使得EJB容器可以在运行时(Runtime)创建和管理EJB组件。
在11月28日的EJB系列讲座的第二讲中,我们将详细介绍EJB组件的基本结构。
WEB层
J2EE规范定义的WEB层由JSP页面、基于WEB的Java Applets以及用于动态生成HTML页面的Servlets构成。这些基本元素在组装过程中通过打包来创建WEB组件。运行在WEB层中的WEB组件依赖WEB容器来支持诸如响应客户请求以及查询EJB组件等功能。
业务层
在基于J2EE规范构建的企业信息系统中,将解决或满足特定业务领域商务规则的代码构建成为业务层中的Enterprise JavaBean(EJB)组件。EJB组件可以完成从客户端应用程序中接收数据、按照商务规则对数据进行处理、将处理结果发送到企业信息系统层进行存储、从存储系统中检索数据以及将数据发送回客户端等功能。
部署和运行在业务层中的EJB组件依赖于EJB容器来管理诸如事务、生命期、状态转换、多线程及资源存储等。这样,由业务层和WEB层构成了多层分布式应用体系中的中间层。
企业信息系统层
在企业应用系统的逻辑层划分中,企业信息系统层通常包括企业资源规划(ERP)系统、大型机事务处理(Mainframe Transaction Processing)系统、关系数据库系统(RDMS)及其它在构建J2EE分布式应用系统时已有的企业信息管理软件。
按照对基于J2EE规范的企业应用系统逻辑层的划分,通常将分布式应用系统的编程环境划分为如下四种类型:
◇EJB容器
EJB容器用于提供EJB组件的开发、部署和运行环境。
◇WEB容器
WEB组件用于提供应用系统的显示逻辑,而WEB容器则提供适合于Servlet和JSP开发、部署和运行的环境。
◇客户应用容器
客户应用容器用于提供分布式应用系统的客户端运行环境,其本质上是J2SE。
◇Applet容器
提供适合于Java Applet运行的浏览器运行环境。
在J2EE规范将企业应用系统划分的各逻辑层中,将封装商务规则的EJB组件部署在业务层中,用于根据客户端的服务请求进行业务数据的处理。EJB组件是基于分布式事务处理的企业级应用程序组件,其中包含处理业务数据的应用逻辑以及客户端调用EJB组件的商务方法获取服务的客户端接口。当一个遵循EJB规范开发的第三方EJB组件被集成到一个应用系统中时,不需要更改其实现代码或者重新编译。
EJB组件类型
在EJB2.0规范中定义了三种类型的组件:会话组件(Session Bean)、实体组件(Entity Bean)和消息驱动组件(Message-Driven Bean)。
会话组件和实体组件的定义由Home接口、Remote接口和组件类构成。在EJB组件的Home接口中定义了创建、删除和定位EJB组件的方法;EJB组件的Remote接口用于定义组件能够提供的商务方法;EJB组件类则用于实现Home接口中定义的组件生命期方法以及Remote接口中定义的商务方法。
◇会话组件
会话组件代表EJB组件与客户程序的一个短暂交互过程,其完成的功能可能是执行数据库读写操作或者是进行简单的数学计算等。
会话组件可以看成是瞬态的,其生命周期相对短暂,只有在客户程序与会话组件保持联系的过程中会话组件才具有生命力。如果客户程序结束会话过程,EJB容器将会话组件对象实例移出EJB容器中的组件实例池,该会话组件实例将失去生命力。另外,如果在客户程序与会话组件交互过程中EJB容器崩溃,那么用户必须重新创建一个新的会话组件对象实例来继续会话过程。
按照EJB2.0规范的定义,会话组件分为有状态(Stateful)和无状态(Stateless)两种类型。有状态会话组件中包含表示客户程序访问和更新数据的会话状态参数。会话状态参数用于记录会话组件引用的对象状态而不是在关系数据库中存储的数据资源。相对而言,在无状态会话组件中没有用于记录与特定客户程序相关联的状态参数,因此不能够记录客户程序的状态和保持客户程序在服务器端行为。
◇实体组件
实体组件用于提供数据库中数据记录在EJB服务器中的对象类型视图。一个实体组件代表数据库表中一行数据记录。客户端应用程序对实体组件的访问等价于对EIS层中数据库的访问过程。在多客户应用的情况下,通过EJB容器的事务管理功能能够使多个客户进程以共享的方式访问同一个实体组件,进而保持组件对应数据库记录的一致性和完整性。实体组件的状态是持续的,只要数据库中的数据记录存在,实体组件创建后就一直存在于EJB容器中,即使EJB服务器崩溃,实体组件同样具有生命力。