第15章 · 播客 第5集

基于中间件的开发 · J2EE:四构件、三种 Bean 与 JMS 两模式

🎙️ 本集播客第5集:J2EE 的定位与四种构件、表示层与应用服务层的分工、EJB 三种 Bean 逐个辨析——实体 Bean 持久、会话 Bean 短暂、消息驱动 Bean 吃异步消息,再用真题选项逐个验毒,最后是 JMS 两种传播模式、JNDI 和 JTA/JTS 的高低分工。 语音由微软 Edge 神经网络语音预生成(女声·晓伊,男声·云希)。点击下方任意对话可直接从该句开始播,当前句朗读时下一句已预先加载,无缝衔接。
🎙️ 第15章播客 第5集
⬇ 下载本集 点击播放
阿明
小雅姐,到 J2EE 了,你说这是全章考试密度最高的一集。
小雅
先把 J2EE 自己的定位背下来。J2EE 是针对 Web Service、业务对象、数据访问和消息报传送的一组规范,这组应用编程接口确定了 Web 应用与驻留它们的服务器之间的通信方式。J2EE 注重两件事:一是建立标准,使 Web 应用的部署与服务器无关;二是使服务器能控制构件的生命周期和其他资源,以便能够处理扩展、并发、事务处理管理和安全性问题。
阿明
那 J2EE 定义了哪几种构件?
小雅
四种,原文原话:应用客户端构件、EJB 构件、Servlets 和 JSP、Applet 构件。J2EE 采用多层分布式应用模型,应用逻辑根据功能分成几个部分,可在相同或不同的服务器上安装不同构件组成的 J2EE 应用。四种构件的名字要能默写。
阿明
四构件,那先看表示层?
小雅
表示层两句话。第一,J2EE 客户端可以基于 Web,也可以基于 Java。在 HTML、Javascript、XML 等技术的帮助下,Web 浏览器可以支持强大、快速的用户界面。取舍规则:如果 HTML 足以捕获和显示应用所需的信息,则 HTML 为首选;不够时才由客户端执行必要的捕获和操作。无论是 Applet 还是独立的 Java 程序,都可提供更丰富的图形用户界面,Applet 还可以与中层通信。
阿明
「HTML 足够就用 HTML」这个优先级也够直白。
小雅
第二句更要紧:分布式企业应用可以同时包括多种客户端,并且这些客户端都可以访问相同的业务逻辑。原文的分工:当客户端是 HTML 时,JSP 和 Servlet 组合将成为能实现业务目标的真正客户端;当客户端是 Java 程序或基于 COM 程序时,它可以直接访问业务逻辑。
阿明
应用服务层呢?
小雅
一般情况下,应用服务层包含表示层请求的表示逻辑和业务逻辑。分工原文:表示层由显示 HTML 页面的 JSP 页面和 Servlets 实现;业务逻辑通过 RMI 对象和 EJB 实现。EJB 依靠容器来实现事务处理、生命周期和状态管理、资源池、安全等问题,容器是 EJB 运行的环境——这句是概念题原句。
阿明
先说 Servlet 吧,它和 CGI 什么关系?
小雅
Java Servlets 是指可以扩展 Web 服务器功能的程序。Servlet 从客户端接受请求,动态生成响应,然后将包含 HTML 或 XML 文档的请求发送给客户端。Servlet 类似于 CGI(公共网关接口),但 Servlet 使用 Java 类和流,更易于编写;由于 Servlet 可编译为 Java 字节码,在运行时,Servlet 例程驻留在内存中,每一个用户请求都生成一条新线程,故而它们的执行速度也更快。
阿明
JSP 呢,不就是文本版的 Servlet?
小雅
原文正是这么定的:JSP 页面是基于文本的 Servlet 开发方式,具有 Servlet 的所有优点,如果与 JavaBeans 类结合在一起,可以容易地将内容和显示逻辑分开。相对 CGI 而言,CGI 依赖于平台、消耗资源更多,而且程序不能容易地访问参数数据,故而 JSP 页面和 Servlet 都比 CGI 应用广泛——CGI 三个缺点:依赖平台、耗资源、难访问参数。
阿明
然后是重头戏 EJB。它的定位是什么?
小雅
EJB 构件用于封装业务逻辑,使开发人员无须再担心数据访问、事务处理支持、安全性、高速缓存和迸发等琐碎任务的编程,在 EJB 规范中它们由 EJB 容器负责。这是真题答案出处:问「用于封装业务逻辑、由 EJB 容器负责事务处理和生命周期管理的构件是哪个」,四个选项 Servlet 与 JSP、EJB 构件、Applet 构件、应用客户端构件,答案 EJB 构件——封装业务逻辑的只有 EJB。
阿明
EJB 自己的接口结构呢?
小雅
EJB 包含接口和类。客户端通过 EJB 的本地接口和远程接口访问 EJB 方法:本地接口提供的方法可用于生成、删除和查找 EJB,远程接口则提供业务方法。配对:本地接口管生成删除查找,远程接口管业务方法,别记反。
阿明
三种 Bean 来了,这个我知道是大坑。
小雅
用真题验毒。题目问「关于 EJB 三种类型的描述,下列哪项是正确的」,四个选项:A 实体 Bean 代表与客户的短暂对话,服务器故障即消失;B 会话 Bean 表示数据库中的数据,只要数据存在就存在;C 消息驱动 Bean 处理从 JMS 队列接收到的异步消息;D 无状态会话 Bean 包含客户端的对话状态。答案 C。A 和 B 是同一个陷阱的两面——实体 Bean 和会话 Bean 的描述正好被调包了。
阿明
原文怎么说的,正过来念一遍。
小雅
原文正句:实体 Bean 表示数据库中的数据及作用于数据的方法。在关系型数据库中,表中的每一行就是一个 Bean 的实例。实体 Bean 是具有持久性的事务处理型 EJB,只要数据存在于数据库中,实体 Bean 就存在。会话 Bean 代表与客户间的短暂对话,会话 Bean 的字段中包含对话的状态,如果服务器或客户端出现故障,会话 Bean 将消失。「只要数据存在就存在」属于实体 Bean,「服务器故障即消失」属于会话 Bean,两个选项各拿对方一半特征,典型的张冠李戴。
阿明
实体 Bean 持久、会话 Bean 短暂。D 项为什么错?
小雅
原文:无状态会话 Bean 没有客户端的任何状态信息,一般不提供保留任何状态的服务器行为,需要的系统资源较少,提供通用服务或表示共享数据视图的业务对象适合作为无状态的会话 Bean。所以 D 说反了——有状态会话 Bean 才包含对话状态,原文定义:对话状态是会话 Bean 实例的字段值加上可以从会话 Bean 字段阅读的所有对象。
阿明
C 项原文怎么写?
小雅
EJB2.0 规范中的消息驱动 Bean 能处理从 JMS 消息队列接收到的异步消息。JMS 将消息路由到消息驱动 Bean,由消息驱动 Bean 从池中选择某个实例处理消息。消息驱动 Bean 在 EJB 容器中管理,由于它们不是由用户的应用直接调用的,因此不能借助 EJB 本地接口从应用进行访问;用户的应用可以将消息发送到 Bean 所监听的 JMS 队列中来实例化它。三个记忆点:EJB2.0 规范引入、JMS 队列的异步消息、不能通过本地接口访问。
阿明
实体 Bean 还有个容器管理和 Bean 管理的区分?
小雅
有,这是实体 Bean 的二级考点。用容器管理的持久性访问关系数据库的 EJB,不需要为数据库访问使用任何 JDBC API,因为容器可以负责完成这项任务;但如果使用 Bean 管理的持久性,就必须借助于 JDBC API 实施 Bean 生命周期方法,加载和保存数据。
阿明
JMS 呢,两种消息模式我老分不清。
小雅
JMS 是支持 Java 程序之间信息交换的 J2EE 机制,这也是 Java 支持异步通信的方法——发送者和接收者无须相互了解,可以独立操作。两种模式用「几份」来分。第一种点到点 point to point:基于消息队列,消息产生者将消息发送到队列中,消费者与队列连接倾听消息。关键句:消息只能发送到一个队列,只能由一个消费者使用;消费者可以过滤消息。
阿明
一个队列一个消费者。另一种是一对多?
小雅
第二种出版和订阅,publish/subscribe:消息生产者将消息发送到一个话题(topic),注册到此话题的消费者都能接收到这些消息,许多消费者都能接收到同样的消息。对比记:点到点是队列、只能由一个消费者使用;出版订阅是话题、许多消费者收到同样的消息。
阿明
JNDI 是查东西用的?
小雅
由于 J2EE 应用的构件可以独立运行,而且是在不同的设备上运行,因此客户端和应用服务器层代码必须以某种方式查找和参考其他代码和资源。客户端和应用代码使用 JNDI,全称 Java Naming and Directory Interface,Java 命名和目录接口,查找用户定义对象(如 EJB)和环境实体。在 JDBC2.0 中,数据源可以绑定到 JNDI 上,并允许应用程序访问。
阿明
事务处理这块,JTA 和 JTS 谁是谁?
小雅
先背分工定性:J2EE 事务处理 API(JTA)和 Java 事务处理服务(JTS)形成 J2EE 中事务处理支持的基础,而且更适合 EJB 和 JDBC2.0。JTS 是低级事务处理管理 API,主要作用是将 Java 映射到对象管理组(OMG)的对象事务处理服务;JTA 是高级 API。高低配对就是考题:JTA 高级、JTS 低级。
阿明
JTA 既然是高级 API,里面装了什么?
小雅
JTA 包括两个部分:一是事务处理接口,允许事务处理定界,通过分布式构件由进行全局事务处理登记来完成工作,令多组操作组成一个事务处理;二是 XA 资源接口,基于能处理分布式事务处理的 X/Open/XA 接口,有时也称为两步提交事务处理,需要多种资源之间的协调,如数据库或序列,分布式事务处理由两步提交协议协调,可跨越用 XA 兼容的 JDBC 驱动程序访问的多个数据库。
阿明
XA 资源接口就是两步提交那个。
小雅
对。事务处理的属性在应用构件的集成过程中确定,用户可以在 J2EE 应用中方便地重新分配事务处理属性,无须修改代码和重新编译。EJB 规范定义了 Bean 管理的事务处理和 Container 管理的事务处理:当 EJB 用 Container 管理的事务处理部署时,应用服务器将自动协调事务处理;如果 EJB 由 Bean 管理事务处理部署,EJB 参数必须提供事务处理代码。多数情况下无须自己用 JTA 写明确事务处理,此项工作由 JDBC 完成、EJB API 由 Container 处理。
阿明
必背清单来一遍。
小雅
本集必背清单:J2EE 是针对 Web Service、业务对象、数据访问和消息报传送的一组规范,注重部署与服务器无关加控制构件生命周期两件事;四种构件——应用客户端构件、EJB 构件、Servlets 和 JSP、Applet 构件;HTML 够用首选 HTML;表示层 JSP 加 Servlet、业务逻辑 RMI 对象加 EJB,容器是 EJB 运行的环境;Servlet 每用户请求一线程驻留内存;EJB 本地接口生成删除查找、远程接口业务方法。
阿明
后半段,三种 Bean 和消息那几样。
小雅
接着背三种 Bean:实体 Bean 表示数据库数据、持久、只要数据存在就存在;会话 Bean 代表与客户的短暂对话、故障即消失,无状态会话 Bean 没有客户端任何状态信息;消息驱动 Bean 是 EJB2.0、处理 JMS 队列的异步消息、不能通过本地接口访问。容器管理持久性免 JDBC、Bean 管理必须 JDBC;JMS 点到点队列单消费者、出版订阅话题多消费者;JNDI 查用户定义对象和环境实体;JTA 高级、JTS 低级。
阿明
三种 Bean 的调包陷阱我算是彻底免疫了。下一集?
小雅
下一集讲微软 .NET——四个重要特点、CLR 怎么统一多种语言、ADO.NET 的 DataSet 和 DataReader、ASP.NET 的 Web 表单和 Web 服务,还有 J2EE 和 .NET 谁跨平台谁多语言这场对比,答案只有一个方向,别记反。