460 likes | 634 Views
J2EE 平台与 EJB 技术. 张民 (muslov) 清华大学计算机系知识工程组 硕士 清华大学 SUN 授权 Java 培训中心 讲师 Zhangm@keg.cs.tsinghua.edu.cn. 内容. 为什么引入 J2EE ? 什么是 J2EE ? J2EE 的组成 EJB—J2EE 的基石 EJB 的容器和服务器 EJB 的分类 会话 bean 实体 bean EJB 的三个关键构件 EJB 的实现与部署 回顾. 主机系统或单层结构. 数据访问、表示和业务逻辑在一个应用中 功能紧紧耦合在一起
E N D
J2EE 平台与EJB技术 张民(muslov) 清华大学计算机系知识工程组 硕士 清华大学SUN授权Java培训中心 讲师 Zhangm@keg.cs.tsinghua.edu.cn
内容 • 为什么引入J2EE? • 什么是J2EE? • J2EE的组成 • EJB—J2EE的基石 • EJB的容器和服务器 • EJB的分类 • 会话bean • 实体bean • EJB的三个关键构件 • EJB的实现与部署 • 回顾
主机系统或单层结构 • 数据访问、表示和业务逻辑在一个应用中 • 功能紧紧耦合在一起 • 代码复用、代码可维护性、和代码的修改十分困难。 • 不是分布式的,不具有可伸缩性。
Fat client 胖客户端: 表示逻辑 业务逻辑 业务数据模型 通讯 Fat client 传统的客户/服务器:“胖”客户端 • 功能集中,不利于更新和维护; • 数据模型“紧耦合”在每一客户端 • 数据库结构改变将导致全体客户端改变 • 任何一点更新要对每一客户端进行部署 • 数据库连接是针对每一客户端的 • 伸缩困难 • 原始数据通过网络传递:加重网络负担
三层分布式对象架构 • 客户端:业务数据模型与UI分开,更“瘦” • 业务逻辑在中间层,成为“对象服务”。 • 中间层可以处理多客户端,通过:连接池,多线程,对象一致性处理 • 编程困难
关于分布式计算 • 对象化的RPC(Remote Procedure Call) • 对象之间的互操作性 • 信息的传递 • 在此方面的解决方案: • CORBA (Common Object Request Broker Architecture) • RMI (Remote Method Invocation) • DCOM (Distributed Component Object Model)
CGI Application 互联网 Web服务器与CGI • WWW浏览方式所带来的: • “Browser-based” 客户端与“Internetworking” • 计算方式向服务器端的集中转化 Html Web Server
N层计算模式的引入 • 从1层到N层,得到的改进: • 每一层可以被单独改变,而无需其它层的改变 • 降低了部署与维护的开销 • 资源(如连接)可以被缓冲和重复利用 • 提高了灵活性、可伸缩性,并使性能提高成为可能 • 瘦客户端的引入使Internet接入方便,而计算被集中至服务器端 • 仍然存在的问题: • 对企业级应用开发人员的要求太高:熟悉分布式协议,进行一致性事务处理,负载平衡,安全……
构件(component)与中间层开发 • 两个转变: • 计算模式上:网络计算(Network Computing) • 生产模式上:基于构件的开发(Component-based Dev) • 二者的结合: 服务器端中间层构件的开发
构件的优点与特点 • “一个软件构件是一个组合的单位,它包括合同化声明的接口及明确说明的上下文相关性。一个软件构件可以被独立部署且服务于第三方所做的组合。 • 构件的特点: • 构件是编译码 • 构件是一个独立部署的单位 • 构件是一个由第三方进行组合的单位 • 构件没有持久的状态 • 构件的优点: • 可插入 • 更好的设计 • 更好的复用 • 方便的更新 • 实现与接口分离
在企业级应用开发中的问题 • 分布式 • 可移植 • 面向Web体系 • 可装配 • 满足企业计算要求 • 一致性 • 事务性 • 安全性 • 好的特性 • 可伸缩 • 可扩展 • 易维护
应用服务器 • 应用服务器可以为服务器端构件提供: • 一致性,事务处理与负载平衡 • 从而简化了编程工作 • 但在J2EE之前,这些API是应用服务器相关的!
为什么需要J2EE • 分布式、可移植构件的框架 • 简化服务器端中间层构件的设计 • 为构件与应用服务器提供标准API 为什么会是J2EE而不是 “X” 2EE //~grin
企业版对开发者和用户来说…… • 更短的开发时间 • 可重用构件 • JSP • EJB • 自由的选择 • 双向选择 • 简化的连接 • XML,JDBC,RMI-IIOP
J2EE组成部分 J2EE Specification J2EE Reference Implementation J2EE J2EE Compatibility Test Suite J2EE Blue Prints
J2EE • Open and standard based platform for developing, deploying and managing n-tier, Web-enabled, server-centric enterprise applications • 开放的、基于标准的平台,用以开发、部署和管理N层结构、面向Web的,以服务器为中心的企业级应用。
容器和构件 容器处理 构件处理 • 一致性 • 安全性 • 可获得性 • 可伸缩性 • 事务性 • 分布性 • 生命周期管理 • (持久性) • 表示 • JSP, Servlet, Applet • 业务逻辑 • EJB • 数据访问逻辑 • EJB
J2EE 1.2中的API与技术 • Java 2 SDK, Standard Edition 1.2 • RMI/ IIOP 1.0 • JDBC™ 2.0 • Java Messaging Service 1.0 • JNDI 1.2 • Servlet 2.2 • JavaServer Pages™ 1.1 • JavaMail 1.1 • JavaBeans™ Activation Framework 1.0 • Enterprise JavaBeans 1.1 • Java Transaction API 1.0
EJB—J2EE的基石 • Enterprise JavaBeans(EJB) 是: Java服务器端服务框架的规范,软件厂商根据它来实现EJB服务器。应用程序开发者可以专注于支持应用所需的商业逻辑,而不用担心周围框架的实现问题。 • EJB容器是: 一个管理一个或多个EJB类/实例的抽象。它通过规范中定义的接口使EJB类访问所需的服务。容器厂商也可以在容器或服务器中提供额外服务的接口。 • EJB服务器是: 管理EJB容器的高端进程或应用程序,并提供对系统服务的访问。EJB服务器也可以提供厂商自己的特性,如优化的数据库访问接口,对其他服务(如CORBA服务)的访问。一个EJB服务器必须提供对可访问JNDI的名字服务和事务服务支持。
EJB的分类 • Entity Bean • Container-Managed Persistence Entity Bean • Bean-Managed Persistence Entity Bean • Session Bean • Stateful Session Bean • Stateless Session Bean Enterprise Bean
实体bean(Entity Bean) 业务数据模型 • 对业务概念的反映,也称为领域类(domain class) • 在持久存储中业务实体的对象视图 • 提供访问和操作数据的对象封装 • 支持多用户共享的数据 • 可以从数据库中存储的属性重新实例化 • EJB 服务器崩溃后仍可重构 • 与数据库中的数据有一样长的生命
实体bean的持久性 • Bean-Managed Persistence(自管理的持久性) • 优点: • 开发者有完全的控制 • 无需复杂的提供商支持 • 缺点: • 编码复杂 • 在改变时需要重新编码和部署 • 影响可移植性 • Container-Managed Persistence(容器管理的持久性) • 优点: • 提供商解决,可能会有更好的缓冲和性能 • 在部署描述符中进行改变即可 • 可移植性好 • 缺点: • 对容器提供商的工具依赖性强 • 可能不易反映复杂的数据关系
Session Entity Entity Entity 会话bean(Session Bean) • 会话bean经常用于涉及多个实体bean的业务处理和控制逻辑。
会话bean(Session Bean)(2) • 相对生命较短(一般与客户同步) • 在EJB服务器崩溃时被删除 • 不表示数据库中的数据,但可以访问数据 • 作为一个客户的代表执行功能 • 可以加入事务
何时使用会话Bean • 使用会话bean 对针对于某一客户的处理或控制对象建模 • 对工作流、任务和管理活动等建模(如订房、购物车等) • 协调多个实体bean,控制实体bean之间的交互 • 将业务应用逻辑从客户端转移到服务器端
会话bean 表示一个业务过程 每一客户一个实例 Short-lived:与客户生命同步 暂态的 服务器崩溃后丢失 可以是事务性的 实体bean 表示业务数据 在多个客户间共享实例 Long-lived:与数据库中数据同步 持久的 服务器崩溃后可重构 总是事务性的 会话Bean?实体Bean?
两种类型的会话bean • 无状态(Stateless)bean • 表达一个无状态的服务(如列表,mail) • 不存储用户相关信息,进行对请求的响应 • 暂态的 • 可用来构造响应频繁而简单的访问的bean池 • 有状态(Stateful)bean • 维护客户状态
一个EJB的三个关键构件 作为Bean的开发者,主要关注于三个构件: • EJBHome 接口(扩展javax.ejb.EJBHome接口):使用了factory设计模式,定义了创建、查找EJB的方法。 • EJBObject接口(扩展javax.ejb.EJBObject接口):使用了proxy设计模式,定义了在bean中实现的业务逻辑方法。 • Bean实现类(实现javax.ejb.EntityBean/SessionBean):实现业务逻辑。
EJB的实现(举例)—创建远程接口 // business methods public interface Account extends EJBObject { //return the account information corresponding to this account. public AccountModel getDetails() throws RemoteException; // updates the contact information for the specified account public void changeContactInformation(ContactInformation info) throws RemoteException; }
EJB的实现—创建Home接口 public interface AccountHome extends javax.ejb.EJBHome { public Account create(String userId, String status, ContactInformation info) throws RemoteException,DuplicateKeyException,CreateException; public Account findByPrimaryKey (String userId) throws RemoteException, FinderException; }
EJB的实现—AccountBean的实现 public class AccountEJB implements EntityBean { // entity state private String userId; private String status; private ContactInformation info; // resources private EntityContext context; // implement account interface business methods public void changeContactInformation(ContactInformation info) { this.info = info; } public AccountModel getDetails() { return(new AccountModel(userId, status, info)); }
EJB的实现—AccountBean的实现(2) // must match signatures of create methods in Home interface public String ejbCreate (String userId, String status, ContactInformation info) throws DuplicateKeyException,CreateException { // set the instance data this.userId = userId; this.status = status; this.info = info; AccountDAO ADAO = new AccountDAO(userId, status,info); try{ ADAO.create(); // insert data in database return (userId); // return primary key }catch (java.sql.SQLException se) { throw new CreateException ("SQL Exception in create:" + se); } }
Create, find client Glue EJBObject Bean EJBHome Business Method container server 从客户端看的EJB视图
从更深层次理解EJB视图 JDK javax.ejb Bean Provider xxx Container Provider
EJB的事务处理 • EJB服务器的概念使平台提供商可以在可伸缩的、可靠的、分布的事务服务方面提供增值服务。 • 事务提供一个“all-all-nothing”的简单模型来管理工作,即所有对象成功更新,所有工作成功提交,或者一个对象失败而整个工作回滚。 • bean的客户可以以两种方式驱动事务: • 在“部署描述符”中声明“公布的事务”(declarative transactions) • 使用用户事务API(JTA)来驱动事务
EJB构件的实现步骤 • 创建远程接口 • 创建Home接口 • 创建Bean的实现类 • 编译远程接口、Home接口、bean实现类 • 创建部署描述符 • 将以上三个文件与部署描述符文件打包为一个ejb-jar文件 • 部署EJB构件
几点体会 • 1. 清晰、统一的概念 • 2. 标准的接口,屏蔽底层的实现(JDBC,EJB…Java) • 3. 实现方式的多样化——trade-off与充分的选择权 • CMP,BMP • JTA, • 4. 标准 vs. 扩展(语义的可理解性与可表达性)
文档资源 • Sun Techdays 文档 • Designing Enterprise Applications with the Java 2 Platform, Enterprise Edition,Nicholas Kassem and the Enterprise Team(jbp-1_0_1b-doc.pdf) • http:// java. sun. com/ j2ee • http:// java. sun. com/ products/ ejb • http:// java. sun. com/ products/ jsp • http:// java. sun. com/ products/ servlet • http:// java. sun. com/ products/ jndi • Server-Side Components –A Pattern Language, Markus Völter, MATHEMA AG, Germany