Java EE的基本原理及 构件开发技术 哈尔滨工业大学计算机学院 唐好选 Email:tanghx@hit.edu.cn
基本内容 Java EE概述 EJB技术 基于EJB构件的开发过程 三种构件模型的关系
J2EE概述
Java平台的发展 J2SE (Java2 Platform, Standard Edition) 用于桌面程序和Java小程序开发 称为J2SDK,简称JDK J2EE (Java2 Platform, Enterprise Edition) 用于企业级开发 称为J2SDKEE J2ME (Java2 Platform, Micro Edition) 用于手持设备的开发(手机和PDA) JRE (Java Runtime Environment)
Java平台的发展
Java EE的发展 J2EE 1.0 1999年发布 J2EE 1.2 2000年发布 J2EE 1.3 2001 年发布 J2EE 1.5 2005年发布,即Java EE Java EE 1.6 2009年发布 Java EE 1.7-2013年发布,最新版
Java EE 1.7的核心组件
Java EE 应用架构示例(1)
Java EE 应用架构示例(2)
Java EE核心技术 浏览器 Applet 应用程序 客户机 RMI JSP/JSF Servlet 表示层 专业服务层 遗产系统 数据库 Web/HTTP服务器 JSP/JSF Servlet 表示层 应用服务器 EJB Java IDL J N D I M S P A 专业服务层 遗产系统 数据库 分布式 CORBA对象 后端系统
Java EE核心技术(1) EJB(Enterprise Java Bean) 提供了让客户端使用远程的分布式对象的框架 EJB规约规定了EJB构件如何与EJB容器进行交互 EJB容器提供了 目录服务、事务管理、安全、连接池管理和容错服务等 RMI ( Remote Method Invocation)和RMI-IIOP 是EJB构件和客户端的通信API 允许进程间通信并提供其它与通信相关的服务 RMI-IIOP是一个可移植的RMI扩展,利用IIOP作为通信协议
Java EE核心技术(2) JNDI(Java Naming and Directory Interface) 是命名和目录服务的标准 实现对对象的命名,包括Web组件、EJB组件、数据库系统等 对象的名字通过命名和目录服务绑定到具体对象 EJB依赖JNDI通过网络查找分布式构件 在Java EE环境下,任何构件必须在JNDI服务器注册 JPA(Java Persistence API),用于对象持久化的API,JPA本质上就是一种ORM规范,JPA未提供ORM实现,只制订了一些规范,提供了一些编程的API接口,具体实现由服务器厂商提供 支持XML和注解 通过面向对象而非面向数据库的查询语言查询数据,避免程序的 SQL语句紧密耦合。
Java EE核心技术(3) JTA (Java Transaction API) JTA是一个高层次的事务处理接口 JMS( Java Message Services) 是与消息驱动构件通讯的API 同时支持点对点消息队列服务和发布-订阅消息服务 支持可靠消息传递、消息传递事务及持续消息等, 是EJB消息驱动Bean的基础
Java EE核心技术(4) JSP(Java Server Page)和 Servlet 技术 服务器端的程序 用于扩展服务器的功能,响应用户的请求 可将结果转化为标准的HTML代码返回给用户 JSF(Java Server Faces) 用于构建Web应用程序的新标准Java框架 提供一种以组件为中心来开发Java Web用户界面的方法 将Web应用开发者划分为三个角色:网页设计人员;应用程 序设计人员;UI组件开发人员
Java EE核心技术(5) WebSocket API 是下一代客户端-服务器的异步通信方法,取代了单个TCP套 接字,可用于任意的客户端和服务器程序,由W3C进行标准化 WebSocket API可使服务器和客户端可以在给定的时间范围内 的任意时刻,相互推送信息 WebSocket并不限于以Ajax(或XHR)方式通信,服务器和客 户端可以彼此相互推送信息,WebSocket允许跨域通信 Java IDL/CORBA 是CORBA规约的一种Java实现 通过Java IDL可以让Java对象发布到CORBA的ORB上 从而通过ORB与别的CORBA对象进行交互
Java EE核心技术(6) Interceptors(拦截器) 是在访问某个Action或Action的某个方法,字段之前或之后实施 拦截,拦截器是可插拔的,是AOP的一种实现 JAF(Java Activation Framework)/ Java Mail 是一套允许在Java程序中以与平台无关、协议无关的方式发送 电子邮件的API JavaMail可利用JAF处理邮件的编码 XML( 可扩展标记语言) 是一种描述数据的元语言 Java中用JAXP( Java API for XML Parsing)对XML文件进行解析 EJB通常将XML作为元标记语言表达内容
EJB技术
EJB技术 EJB简介 EJB体系结构 EJB编程模型 EJB构件接口 构件规约 构件分类 EJB构件的开发
什么是EJB? EJB不是一种产品,而是为开发和使用“基于事务和分布对象应用的服务器端构件”而定义的一种技术规约,用户可根据该规约开发EJB构件。 EJB构件是一组分布式的对象,可通过EJB容器的控制为分布在因特网上的用户提供远程服务。
什么是EJB? EJB规约定义了EJB构件与EJB容器之间的交互机制,描述了EJB构件和EJB容器在运行时的行为。例如安全访问如何检验、事务如何管理、持久性如何应用等。保证了EJB构件在容器间的可移植性 EJB容器运行在EJB服务器中,EJB规约还定义了EJB容器和EJB服务器的标准模型
EJB的目标 EJB的目标是为服务器端构件系统定义一个技术规范,该规范可实现如下要求: 提供一个标准的、分布的、基于OO的体系结构 屏蔽复杂的系统级功能需求 兼容CORBA标准 具有与非Java应用之间的互操作能力
EJB的现状-EJB3.0 EJB3.0于2006年5月随JAVA EE 5发布 EJB3.0完全抛弃了EJB 2.x实体Bean的设计,仅仅保留原有的 Session Bean和消息驱动Bean;引进了全新的JPA规范作为持久化 解决方案 简化了EJB 2.x中Session Bean的开发,Session Bean不再需要 Home接口,只要求提供远程或本地的业务接口即可 不再推荐使用XML文件作为部署描述文件,而是改为使用 Annotation来设置部署描述信息
EJB的现状-EJB3.1 EJB3.1于2009年随JAVA EE 1.6发布 允许企业Bean只提供一个Bean类,甚至无须提供业务接口 允许通过异步的方式调用Session Bean的业务方法 简化了EJB的类文件必须打包到JAR文件中的限制,允许直接将 EJB类放到WAR文件中
EJB的现状-EJB3.2 EJB3.2于2013年7月随JAVA EE 7发布 支持本地异步会话Bean调用 Java I/O访问权已放宽,用“应谨慎行事”取代了“不允许” 有状态会话bean的生命周期回调拦截方法,可以在一个事务环 境中执行(由生命周期回调方法的事务属性决定) 可以完全禁用特定的有状态会话bean的钝化 TimerService API已被扩展,可以在同一个EJB模块中查询所有 活动计时器 会话bean指定实现接口(作为本地或远程业务接口)的默认规 则已经放宽,可以包含多个接口
Java EE的应用架构-经典JAVA EE架构 以EJB为核心,前端以JSF(Java Server Faces)为MVC框架的 技术架构,这种技术架构以Sun提倡的官方Java EE技术为主
Java EE的应用架构-轻量级Java EE架构 以Spring+Hibernate为核心,前端以Struts 1或Struts 2为MVC框 架的技术架构,这种技术架构以主流的开源框架为主
Spring框架 组成 Spring 框架的每个模块(或组件)都可以单独存在,或者 与其他一个或多个模块联合实现 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的 主要组件是 BeanFactory。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际应用程序代码分开 Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架 提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、 EJB、电子邮件、国际化、校验和调度功能 Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程 序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置 的,MVC 容纳了大量视图技术
Spring框架和EJB Spring框架实际上大量参考了EJB的设计理念,只是Spring摈弃 了EJB开发中的3大烦琐之处: (2)需要大量使用XML配置文件 (3)EJB组件必须打包成JAR包 Spring容器取代了原有的EJB容器,因此以Spring框架为核心的 应用无须EJB容器支持,可以在Web容器中运行 Spring容器管理的不再是复杂的EJB组件,而是POJO(Plain Old Java Object) Bean
EJB的体系结构 … 对象池 EJB容器 EJB服务器 EJB客户机 业务接口 Home接口 Bean代理 EJB部署描述 Bean实现 业务方法 EJB客户机 创建/删除/查找 业务接口 Home接口 Bean代理 … 对象池 EJB部署描述 Bean实现 EJB容器 EJB服务器
EJB的体系结构-EJB客户机 请求EJB构件服务的应用程序,EJB规约为创建EJB构件的客户接口定义了一套标准,主要包括: EJB Home接口:客户使用JNDI来查找对EJB Home接口的引用,为客户机创建、删除、查找EJB Remote接口对象的句柄提供了相应的操作 EJB 业务接口:通过该接口可调用构件的业务方法 RMI/IIOP或RMI/JRMP协议:客户机和容器通信的标准协议,这些底层的分布式通信机制对于EJB客户机和EJB构件开发者都是透明的
EJB的体系结构-EJB服务器 为使用EJB构件的应用程序提供操作环境,并提供所有必要的 服务来支持EJB体系结构 Java白皮书承诺:“EJB规约为每个支持Java程序的应用服务器 定义了一个标准模型,任何厂商都可以使用此模型来实现对EJB 构件的支持” EJB服务器的主要功能包括 管理EJB容器 提供对操作系统服务的访问 提供与Java相关的服务
EJB的体系结构-EJB容器 为EJB构件提供运行环境,EJB容器对EJB应用程序是透明的
EJB的体系结构-EJB容器
EJB的编程模型-关键特征 面向对象 分布式计算:EJB构件在理论上是位置透明的
EJB的边界 EJB实例 容器 EJB Server 客户机 部署描述符/ Annotation 构件合约 客户视图
EJB构件接口 构件接口是构件提供者为便于复用者(客户)复用该构件所提供的必要信息 构件与容器协作实现这些接口
EJB构件规约
EJB构件规约 EJB可使Java编写的服务器组件开发和部署标准化 EJB构件规约定义了以下接口 EJB和容器之间的接口 容器和应用服务器之间的接口 容器和客户端之间的接口 容器和持久管理器之间的接口
EJB构件分类 EJB构件分为三(四)种基本的类型 会话构件(Session Bean) 有态会话构件(Stateless Session Bean) 无态会话构件(Statefull Session Bean) 消息驱动构件(Message-Driven Bean) 实体构件(Entity Bean)
会话构件 特征: 与单个客户相对应 不直接表示数据库中的共享数据 生命周期相对较短 当EJB容器崩溃时,也随着消失 类别:Stateful (有态) Stateless (无态)
有态构件的生命周期 实例抛出系统异常 超时 @PreDestroy @postConstruct 超时 业务方法 @PrePassivate @PostActivate
无态构件的生命周期 @PostConstruct @PreDestroy 业务方法
两种会话构件的选择 Stateful ? Stateless? 过程需要保持状态? 加入过程中断,恢复运行时需要以前的信息吗?
两种会话构件的选择 发生下列情况时应该考虑使用有状态会话Bean 在方法调用时,会话Bean需要维护成员变量的数据 会话Bean正在服务一个交互客户端,EJB容器或应用服务器需要了解该客户端 发生如下情况时应考虑使用无状态会话Bean 不需要维护跨越方法调用的成员变量中的数据 会话Bean提供的服务并不针对某种客户端
消息驱动构件(MDB) MDB是一种JMS消息的使用者,MDB负责从消息队列或者消息主题中读取消息 MDB的输入参数只有一种类型,即消息对象,是那些实现了Message接口的Java对象 生命周期由EJB容器控制 客户端和MDB是完全独立的,客户端无法直接调用MDB方法,而是由消息服务器负责把消息发送给MDB 无状态
消息驱动构件(MDB)
MDB的生命周期 @PostConstruct @PreDestroy
MDB常用开发模式 客户端可直接调用Session Bean,发布消息到主题 MDB接收并处理消息
EJB构件开发与应用
EJB构件的开发(SessionBean) 业务接口(Business interface):定义EJB构件的逻辑方法 Bean类(Bean class):实现主要的业务逻辑 EJB客户机 Business接口 Bean1 EJB容器 Bean2 Business 接口
开发SessionBean 开发一个 SessionBean,需要定义接口和 Beanclass;其中接口 分为远程(remote)和本地(local)接口 远程接口(remote interface)定义业务方法,可以被来自 EJB 容器之外的应用访问到 本地接口(local interface):同样定义了业务方法,可以被同 处于 EJB 容器内的其它应用使用。因为 local 接口允许 bean 之 间直接通过内存交互,没有分布式对象协议的开销,从而改善 了性能 Bean 类包含了业务逻辑,必须具备一个远程或本地接口, Bean类应实现接口的业务方法。在 EJB3中,不要求同时实现 remote 和 local 接口,但实现两者是比较好的做法
开发SessionBean第一步 第一步:定义一个包含业务方法的接口。该接口不需要包含任何注释,是一个普通的 java 接口。调用 EJB的客户端使用这个接口引用从 EJB 容器返回的存根(stub)
开发SessionBean第二步 第二步:编写BeanClass
SessionBean的客户端开发 public static void main(String[] args) { Properties props = new Properties(); props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory"); props.setProperty("java.naming.provider.url", "localhost:1099"); try { InitialContext ctx = new InitialContext(props); HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean/remote"); System.out.println(helloworld.sayHello(“哈工大")); } catch (NamingException e) { System.out.println(e.getMessage()); }
EJB的调用机制 1、客户端调用远程接口方法(实际上调用存根对象的方法) 2、方法调用经过转换成CORBA IIOP消息发往应用服务器 3、应用服务器接收到请求消息后,交由骨架处理。骨架调用bean实例的方法 4、骨架将方法返回值转换成CORBA IIOP应答消息发回客户端 5、存根对象将CORBA IIOP应答消息解析成返回值
三种构件模型的关系
EJB 与CORBA CORBA是目前分布式对象处理事实工业标准,大部分厂商都 支持CORBA标准,同样,EJB规范中也考虑对CORBA的支持 CORBA客户机(用CORBA支持的语言写的程序)可以存 取基于CORBA的EJB服务器上的构件 客户机在一个事务过程中可以同时调用CORBA和EJB对象 事务可以同时利用多个由不同开发商提供的,基于CORBA 的EJB服务器
COM 与 EJB的相同点 基本形态相同, 可以独立封装,并可以动态加载 在运行过程支持接口 都对构件进行生命周期管理 构件的运行环境包括众多的公共服务
COM 与 EJB的区别 支持环境的实现不同 EJB的支持环境运行于操作系统之上,体现了一种大粒度 的模块化思想 COM的支持环境与操作系统密切相关,COM的支持环境 是操作系统的一部分 支持的语言不同 EJB 仅支持Java语言 COM 支持C、C++、Basic等 构件生命周期的实现方式不同 EJB 主要通过容器实现,独立于具体的构件实现 COM 主要通过类厂实现,与具体的构件实现一一对应
The End!