创建和管理有状态Web 应用程序

日期: 2009-12-07 作者:IBM developerworks网站 来源:TechTarget中国 英文

  创建有状态应用程序的一个基本组成部分就是数据管理。通过从一个会话全面地收集有关一个用户的数据,我们可以为那个用户创建一个简要表(profile),然后使用这个简要表来个性化他的用户体验。为了智能地管理用户数据,必须将其置于上下文中。所以我们使用作用域。

  在J2EE中有4种作用域(或者说上下文)用于管理数据:application(应用程序)、session(会话)、request(请求)和page(页面)。在本文中您将会了解每种作用域为J2EE中的有状态应用程序开发带来了哪些东西,以及每种作用域最适合于哪种会话管理场景。

  构建有状态Web应用程序

  如果用户只需要用Web应用程序来查看静态内容,那么除了HTML外我们不需要任何其他的技术。但是,除了基于文本的信息和好看的背景颜色之外,大多数用户还想从Web那里得到更多的功能。实际上,目前多数的用户访问网络都是为了执行复杂的电子商务交易,参与在线社团,下载(和上传)媒体,等等。对于大多数流行站点来说,交互性是关键,而且,个性化的功能越多越好。对于这种类型的开发,我们使用一些高级的Web技术,例如CGI、PHP、ASP、JSP以及Java Servlet。

  交互性的一个重要的组成部分就是个性化。 个性化的 Web 站点能够针对用户的特定需求和兴趣来定制内容和输出。个性化的一个重要组成部分就是duration。用户体验不仅应该具有内聚性,还应该加以扩展,超越单事务模式。例如,当登录到像Yahoo这样的一个个性化的门户时,您将建立一个 身份(identity),在Yahoo域中,无论导航到哪里,您的身份都不会改变。对于许多在线银行、信用卡以及股票交易系统来说,也是如此。在线商店也逐渐地采用了这种模型。

  当我们谈到扩展了单事务模式的用户体验时,我们称之为会话。当我们创建支持会话而不是单独的、孤立的事务的Web应用程序时,我们就是在创建有状态的应用程序。

  在一个有状态应用程序中,用户可以导航到站点的许多不同的地方,并执行多个事务,但是他将一直维护着他自己惟一的身份。这是可以实现的,因为系统会不断地跟踪他的会话的 状态。在J2EE中,这种类型的开发是通过将每个用户的信息存储在一个后端数据服务器上来进行管理的。当一个用户第一次登录到站点时,他便建立一个惟一的ID。从那一刻开始,与该用户的ID相关的数据便被存储起来,并且在需要的时候系统可以访问这些数据。

  至于Java平台,我们可以使用三种技术之一来将用户ID与单个用户关联起来,这三种技术是:URL重写、隐藏表单字段以及HTTP cookies。在J2EE中,我们使用HTTPSession API来存储、检索会话数据,或者将会话数据与某一特定用户ID相关联。

  除了存储数据,我们还必须能够contextualize数据(将数据置于上下文中)。术语 作用域 指的是被存储数据的上下文(即该数据的 “作用域”);对作用域的适当处理在有状态Web应用程序的设计中处于核心地位。

  会话作用域

  术语“作用域”指的是一个上下文,在这个上下文中数据被关联或者存储。在传统的独立应用程序中存在着一些可以在其中关联变量和对象引用的上下文(或作用域)。典型的作用域包括:

  局部/方法

  类/对象/组件

  包/库

  protected(受保护的)

  全局/public(公共的)

  在Web应用程序中所说的作用域不同于更传统的、独立的应用程序中所使用的作用域。在Web应用程序中,作用域指的是一个对象可以多大程度地为一个应用程序的组件所使用。而在独立应用程序中,虽然作用域所指的也是可用性,但这里的作用域是由代码块来划分界限的。

  在J2EE Web应用程序中,一共有4种会话作用域:

    page

  request

  session

  application

  每种J2EE作用域都有一个上下文,在这个上下文中可以关联(存储)基本类型的数据和对象引用,以供享有同一上下文的其他组件使用。表1列出了这4种作用域,并说明了它们是否能应用于servlet和JSP页面,还给出了对每种作用域的描述。

作用域


  接下来,我们将看看用于将数据存储在这4种作用域中的一些机制。

  将数据存储在作用域中

  在这4种作用域中,每一种作用域都有一个不同的机制,用于存储并最终访问上下文相关的数据。每种作用域都有一个单独的类,通过这个类可以存储和检索上下文相关的数据。表2标出了4个类,分别对应于4种会话作用域。

  表 2. 用于存储有作用域的数据的类

存储作用

  乍一看来,使用这4种数据类型来存储有作用域的数据是相当直观的。然而,麻烦的是,对于一个给定的场景,哪一种作用域最合适却并不总是那么清楚的事了。我们将看看可能碰到的一些常见的场景,以便作出总结。另外,我们还将实际地讨论,对于每一种环境,哪一种作用域最适合。

  作用域解决方案

  在由JSP和Java Servlet规范定义的这4种作用域中,每一种作用域在Web应用程序中都有其明确的用途。

  page提供代表一个JSP页面的上下文,与用户所看到的真实页面之间常常具有一对一的映射关系。这种作用域只能用于JSP页面,并且也是所有对象,包括JavaBean组件的默认作用域。具有page作用域的对象通常是那些在scriptlet、表达式、JavaBean标记以及自定义标记中被访问的局部变量。如果必须获得一个有page作用域的对象的一个引用,则可以在该页面的javax.servlet.jsp.PageContext变量上调用getAttribute() 。

  request 最适合的环境是:单个的用户请求可能涉及不止一个的 servlet 或 JSP 页面。request 是一种能够在一个原子请求内跨越多个页面的上下文。有 request 作用域的数据存储在javax.servlet.ServletRequest对象中(使用 javax.servlet.http.HttpServletRequest object)并通过使用 getAttribute()和setAttribute()方法来访问。

  session是有状态J2EE Web应用程序作用域的核心和灵魂。正是这种作用域使得跨越多个请求的持久用户体验的创建成为可能。javax.servlet.http.HttpSession是存储有session作用域的数据的地方,可以通过调用getAttribute()和setAttribute()方法来访问。为了在一个 JSP 页面内使用有session作用域的数据,必须首先声明这个页面要参与会话。为了做到这一点,只需在页面的任何地方(一般是在顶部)插入 JSP 会话属性 。

  application 是具有最长运行时间的作用域。这是 J2EE 为全局数据提供的。应用程序数据被一个应用程序模块内的所有Web组件所共享。具有应用程序作用域的对象属于 javax.servlet.ServletContext ,可以通过调用getAttribute()和setAttribute()方法来访问。
  记住了这些定义,我们就可以制定使用不同作用域的一些原则:

  对于JSP数据坚决使用page作用域。这是与JSP页面打交道的最简单的方式。JSP页面内所有数据的默认作用域都是page,它允许您在为局部变量指定的范围内(类/方法/局部变量作用域)使用这种数据。

  清楚JSP include对作用域的影响。page作用域适用于单个的、经过编译的Java servlet类。因为include指令是在编译的时候处理的,包括在指令中的任何内容都是在page作用域的上行文中操作的。另一方面,include动作是在运行的时候处理的。如果使用了include动作,为了在两个组件之间共享数据,应该使用request作用域。

  为了在运行的时候在Web组件之间共享数据,使用request作用域。如果使用一个forward动作或者include动作来在两个或更多组件之间共享一个请求,那么通过将数据的作用域设为request作用域便可以在这些组件之间共享该数据。

  为了提供有状态用户体验,使用session作用域。无论要构建的是在线商店,电子邮件管理站点,个人化信息门户,还是财务管理应用,session作用域都是对用户采取从请求到请求的跟踪或者为用户提供无缝的、持久的环境的最佳选择。

  将application作用域专用于全局数据。应用程序对象是一些静态的对象,为应用程序内的所有对象所共享。对application作用域的使用应该保留给真正需要在组件之间共享或者跨用户会话的数据。典型的例子有:缓存的DAO,JNDI引用的缓存,或者任何类型的公共工厂或者其他需要使用Singleton模式的组件。

  结束语

  对会话作用域(即在一个会话中存储和维护的数据的上下文)的适当处理是有状态应用程序开发的关键。在本期的J2EE探索者中,我指出了4种J2EE会话作用域,以及用于代表每种上下文的多个数据类型,并讨论了一些实际的注意事项,这些注意事项将对您使用作用域有所帮助。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐