`
pengjianbo1
  • 浏览: 232498 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

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

    博客分类:
  • J2EE
阅读更多
在创建有状态应用程序时,数据管理是关键。为了智能地管理用户数据,必须将其置于上下文中,这可以通过 作用域(scope)来做到。在本期的 J2EE 探索者中,Java 开发者和顾问 Kyle Gabhart对用于有状态 Web 应用程序开发的 4 种会话作用域的适当处理给予了关注。您可以在本文给出的 论坛中共享您对本文或者 J2EE 探索者系列中任何文章的看法。
<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES-->

在本文中,我们将紧随本系列的第二期“ 有状态网络的 J2EE 技术”。在那一期,您可以了解到 J2EE 中有状态应用程序开发的一些基础知识。这一次,我们将把注意力从大范围的概述转移到如何创建和管理有状态用户体验的细节上来。

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

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

首先我们来快速回顾一下 J2EE 中有状态 Web 应用程序的开发。

构建有状态 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 页面,还给出了对每种作用域的描述。

表 1. 4种会话作用域

会话作用域 Servlets JSP 页面 描述
page 代表与一个页面相关的对象和属性。一个页面由一个编译好的 Java servlet 类(可以带有任何的 include 指令,但是没有 include 动作)表示。这既包括 servlet 又包括被编译成 servlet 的 JSP 页面
request 代表与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件(由于 forward 指令和 include 动作的关系)
session 代表与用于某个 Web 客户机的一个用户体验相关的对象和属性。一个 Web 会话可以也经常会跨越多个客户机请求
application 代表与整个 Web 应用程序相关的对象和属性。这实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域

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





回页首

将数据存储在作用域中

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

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

类名 作用域 注释
javax.servlet.jsp.PageContext page 特定于 JSP 的一个类型,代表当前的 JSP 页面 。PageContext 是一个抽象类,设计用来供 JSP 引擎供应商加以扩展以提供特定于实现的类型。 PageContext 实例提供了对所有与一个 JSP 页面相关的名称空间的访问途径
javax.servlet.http.HttpServletRequest requset 这种类型代表当前的 HTTP 请求。 HttpServletRequest 类型是一个接口,设计用来供 servlet 引擎供应商加以实现。由客户机提供的特定于请求的数据(request方法,UTI,HTTP 参数,等等),以及由另一个 servlet 或者 JSP 页面提供的数据,都可以存储在一个 request 作用域中
javax.servlet.http.HttpSession session 这种类型代表当前的 HTTP 会话。 HttpSession 类型是一个接口,设计用来供 servlet 引擎供应商加以实现
javax.servlet.ServletContext application 这种类型代表整个的运行时 Web 模块。 ServletContext 类型是一个模块,设计用来供 servlet 引擎供应商加以实现

乍一看来,使用这 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 会话属性 <%@ page session="true" %>
  • 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 模式的组件。


 

分享到:
评论

相关推荐

    C#Web应用程序入门经典

    其中前两章讲述了WEB环境和web开发的基础切识,在随后的11章中从理论和实践两个方而讲解了web应用程序的创建、测试、调试和部署等环节,如服务器控件、数探访问、数据绑定、Asp.NET状态管理、XML与web开发、web应用...

    vs.Net2003无法打开或创建Web应用程序若干解决办法

    - 如果你在开发过程中使用了 FrontPage 扩展来管理 Web 应用程序,则需要确保 VS.NET 和 IIS 之间的关系正确配置。 - 可以考虑将 VS.NET 中的 Web 应用项目路径与 IIS 中默认网站的路径分开,避免权限冲突。 3. *...

    c#+web应用程序入门经典.pdf

    ***是.NET框架的一部分,它允许开发者用C#语言来创建动态网站、Web应用程序和Web服务。 《C# + Web应用程序入门经典》这本书很可能是针对初学者而设计的。这类入门书籍通常会介绍如何安装和配置C#开发环境,如何...

    ASP.NET Web应用程序的开发

    ASP.NET Web应用程序开发是微软公司推出的用于构建动态网站、Web应用程序和Web服务的框架。它基于.NET Framework,提供了丰富的功能和工具,使开发者能够高效地创建高性能、安全性和可伸缩性的Web解决方案。 在开发...

    C#Web应用程序入门经典电子书1

    《C# Web应用程序入门经典电子书1》是一本专为初学者设计的教程,旨在帮助读者快速掌握使用C#语言开发Web应用程序的基本技能。这本书详细介绍了C#与Web开发的相关概念和技术,是学习C# Web编程的理想起点。 一、C#...

    c#+web应用程序入门经典源码

    此外,Web应用程序的生命周期管理和状态管理也是重要的知识点。ASP.NET会自动管理Web页面的生命周期,包括初始化、加载、回发和卸载等阶段。理解这些阶段对于知道何时何地进行数据操作至关重要。同时,由于HTTP协议...

    面向.net的web应用程序设计实验文件

    面向.NET的Web应用程序设计实验文件是针对学习微软认证课程的学生或开发者的重要资源,它涵盖了构建基于.NET框架的Web应用程序所需的关键技术与实践。这个实验文件集合旨在深化对Web开发的理解,提升实际操作技能,...

    WEB应用程序设计代码完整版

    Web应用程序通常需要存储和检索数据,因此数据库管理至关重要。关系型数据库如MySQL、PostgreSQL和非关系型数据库如MongoDB、Redis各有优势,开发者需根据需求选择合适的数据库,并熟练掌握SQL(结构化查询语言)或...

    Web应用程序 NET程序设计

    Web应用程序和.NET程序设计是构建基于互联网的交互式系统的基石,它们涉及到许多关键概念和技术。在本实验中,主要目标是理解和掌握Web应用程序的状态管理、应用程序缓存的使用,以及会话状态与Cookie的关系。 首先...

    asp.net web应用程序设计教程

    压缩包中的"ASP.NETWeb应用程序设计教程相关资源.rar"可能包含了源代码示例、项目文件、教程文档等,这些资源对于理解和实践上述知识点非常有帮助。通过实际操作和研究这些资源,你可以加深对ASP.NET Web应用程序...

    面向.NET的Web应用程序设计-微软考证

    Web应用程序设计通常基于ASP.NET,它是.NET Framework的一部分,用于构建动态网站、Web服务和富互联网应用。ASP.NET提供了多种模型,如Web Forms、MVC(Model-View-Controller)和Web Pages,它们各有优势,可以根据...

    基于VB.NET的Web应用程序设计

    6. **状态管理**:了解如何在Web应用程序中管理用户状态,如ViewState、Session、Cookie等。 7. **部署和配置**:学习如何将VB.NET Web应用程序部署到IIS服务器,并进行必要的配置。 8. **错误处理和调试**:掌握...

    java的web应用程序框架

    - **区别于传统MVC**:Sun Java Studio Web应用程序框架的MVC实现了更细粒度的控制,例如通过特定的方法和组件来更好地管理视图和控制器的交互。 #### 应用程序开发流程 - **创建应用程序**: - 定义应用程序的...

    《Visual C#.NET Web应用程序设计(第2版)》(程序源代码)

    通过对这些源码的分析和实践,读者可以深入了解C#.NET Web应用程序的设计原理,掌握实际开发中的技巧和最佳实践。同时,这也为自定义和扩展应用程序提供了基础,帮助开发者不断提升技能,应对复杂项目挑战。

    Web应用程序开发教程——ASP.NET+SQL Server(源码)

    《Web应用程序开发教程——ASP.NET+SQL Server》是由岳学军和李晓黎主编的一本专业教程,由人民邮电出版社出版。这本书深入浅出地介绍了如何使用ASP.NET技术和SQL Server数据库来构建高效的Web应用程序。ASP.NET是...

    小巧WEB服务器应用程序

    这对于处理敏感信息的WEB应用程序尤其关键,例如在线交易、个人信息管理等。 【HTTPS双向认证】则进一步增强了安全性。在双向认证中,不仅服务器会验证客户端的身份,客户端也会验证服务器的身份。这种方式可以防止...

    ASP.NET WEB应用程序设计 PPT课件

    6. **第6章 HTTP请求、响应及状态管理**:HTTP协议是Web应用程序的基础,理解请求和响应的工作原理对于开发至关重要。这一章将解释如何处理HTTP请求和响应,以及如何利用ASP.NET的状态管理机制(如视图状态、控制...

    C#Web应用程序入门经典电子书

    其中前两章讲述了Web环境和Web开发的基础知识,在随后的11章中从理论和实践两个方面讲解了Web应用程序的创建、测试、调试和部署等环节,如服务器控件、数据绑定、ASP.NET状态管理、XML与Web开发、Web应用程序中的Web...

Global site tag (gtag.js) - Google Analytics