Welcome 微信登录

首页 / 软件开发 / JAVA / J2EE探索: 有状态网络的J2EE技术

J2EE探索: 有状态网络的J2EE技术2011-04-11 IBM Kyle Gabhart在 J2EE 探索系列的 第一部分中,我们首先研究了 J2EE 中状态管理的最新技术。上个 月,我们讨论了 J2EE 中管理无状态网络的最佳选项;这个月我们将讨论管理有状态网络的 技术。

首先我将简要介绍有状态应用程序管理,然后谈论不同的解决方案如何应用于 Web 层或 业务层。接下来,我将比较 J2EE 中有状态应用程序管理技术的优缺点。就象在前一部分中 一样,我们将通过研究每种技术最常用的一些实现,以及用于为您的企业选择合适解决方案 的一些最佳实践来结束本文。

请注意,对于本文而言,JSP(Java ServerPages)文件被认为是专用类型的 servlet。

有状态应用程序管理

您可能会回想起来,在上一篇文章中,Web 应用程序协议被分成两大类别: 无状态 (stateless)和 有状态(stateful),协议的 状态指的是它“记忆”从一个传输到下一个 传输的信息的能力。因为有状态连通性是大多数企业应用程序的基本需求之一,并且因为 Web 应用程序依赖于 HTTP(内在的无状态协议),所以聪明的开发人员已经找到了许多技巧 来在 HTTP 上模拟有状态连接。有状态信息可以存储在 HTML 表单字段中、附加到超链接或 者存储在客户机端的 cookie 中。

客户机和服务器之间的有状态交互可以在 Web 层或业务层上进行管理。要在 Web 层上管 理状态,我们使用与 HTTPSession API 结合的 servlet。要在业务层上管理状态,我们使用 有状态会话 EJB 组件。在接下来的章节里,我们将探究这两种开发选项。

Web 层

Servlet 体系结构的 HTTPSession API 允许应用程序开发人员管理跨网络的客户机/服务 器交互(或 会话)的状态。 HTTPSession 接口定义了 HTTPSession API 的核心功能。它为 J2EE 应用程序提供了一种方法,使它可以识别跨多个页面请求的单个客户机,以及将数据存 储在与那个客户机相关联的服务器上。通过该接口,servlet 容器创建和管理客户机和服务 器之间的会话。该会话由 HTTPSession 对象表示,它可以跨来自相同客户机的多个连接和页 面请求持续存在一段特定的时间。Servlet 使用该接口来查看与处理有关会话的信息,如创 建时间和上一次访问会话的时间。该接口还允许 servlet 将对象绑定到会话,从而以一种跨 多个连接(来自相同客户机)持续存在的方式将该信息与特定的客户机进行关联。

因此, HTTPSession 接口允许 servlet 容器创建和管理客户机会话,并且使 servlet 能访问与会话相关的信息、将对象绑定到会话以及访问先前绑定的对象。到现在为止,一直 都还不错。但是 servlet 容器如何跟踪通过无状态协议(如 HTTP)通信的客户机呢?为了 实现这一点,为每个 HTTPSession 对象都提供一个唯一的标识,以确保每个客户机会话和与 会话相关的数据可以被唯一标识。考虑到 HTTP 内在的无状态本质,在每次请求时,该会话 标识必须被客户机传递给服务器,以便于 servlet 容器将客户机与正确的会话相关联。会话 标识可以用三种方式中一种进行传递:作为 HTML 表单中的参数(通常是隐藏字段);作为 附加在查询字符串后的参数;或者作为 cookie 的属性。不管会话标识如何传递,servlet 容器都将拦截它,检查它,并找到与之关联的 HTTPSession 对象。

Servlet 性能

由 Servlet 体系结构创建的轻量级线程模型决不会因为 servlet 或 JSP 文件创建、读 取或修改 HTTPSession 对象而受到破坏。该对象只是将对象引用存储为简单键-值对的散列 表或类似的集合。同样, HTTPSession 内存空间的实现本身也是轻量级的,只需要存储(或 许序列化)会话对象和相应的会话标识。简而言之,servlet 可以支持与 HTTP 客户机的有 状态交互,而且对应用程序设计或容器资源产生最小的影响。