Web 应用程序是无状态的,这表示不存在用于保存和检索客户或用户交互的状态的内置机制。换言之,仅根据浏览器信息,Web 应用程序并不知道谁正在访问 Web 页面。当 Web 应用程序需要跟踪一个用户时,它必须存储有关该用户与应用程序交互的信息。此信息必须以下列其中一种持久格式保存在 Web 页面外部:
您已经知道如何读写数据库。使用 HTTP 请求变量可用于少量非安全数据。大多数 Web 应用程序使用应用程序服务器会话变量来跟踪用户与应用程序的交互。在此练习中,将通过创建两个 Web 页面学习如何使用会话变量。第一个页面允许用户输入数据,该数据将存储在会话对象中。第二个页面访问会话对象并显示该数据。
会话变量是由应用程序服务器创建并处理的变量,用来存储有关用户会话的信息。这些变量存储在会话对象中,而会话对象是当用户访问应用程序时应用程序服务器定义的一个内存区域。由于会话对象存储在内存中而不是存储在磁盘中,所以它们的性能比数据库或文件好。会话对象在用户与应用程序交互时存在,或者在应用程序需要的时间内存在。还可以将会话对象设置为:在经过一定时间的不活动状态之后到期。存在的时间长度称为会话对象的限定作用域。
UpdateSession
package pagehandlers; import data.*; PageHandler UpdateSession {view = "UpdateSession.jsp", onPageLoadFunction = onPageLoad} userSession sessionData; enterUpdate char(1) {value = "N"}; Function onPageLoad() getSessionAttr("enter",enterUpdate); if (enterUpdate == "Y") getSessionAttr("sess",userSession); userSession.msg = "Update your information"; end End function updateSession() setSessionAttr("sess",userSession); forward to "ViewSession"; end End Record sessionData type basicRecord msg char(50) {value = "Enter the following"}; name char(50) {displayName = "Your name"}; phone char(50) {displayName = "Phone: (xxx)xxx-xxxx"}; age int {displayName = "Your age"}; userid char(50) {displayName = "Your personal user ID"}; password char(50) {displayName = "A password"}; end
以下是一些有关刚才插入的代码的技术说明:
ViewSession
package pagehandlers; import data.*; PageHandler ViewSession {view = "ViewSession.jsp", onPageLoadFunction = onPageLoad} userSession sessionData; enterUpdate char(1) {value = "Y"}; Function onPageLoad() getSessionAttr("sess",userSession); end function updateSession() setSessionAttr("enter",enterUpdate); forward to "UpdateSession"; end End
既然创建了两个使用会话对象的页面,就可以测试它们以查看当用户使用 Web 应用程序时会话对象是否存在。应用程序可以包含访问同一个会话对象的许多不同页面,但这两个页面的交互可以说明原理。
当在 Web 浏览器中打开 UpdateSession.jsp 页面时,注意 msg 字段显示的内容是“Enter the following”。此字段仍然设置为缺省值,原因是您还没有会话对象。如果您确实有会话对象,则页面代码应已将消息值设置为“Update your information”。
该页面看起来应如下所示:
这就会将信息添加至会话对象。于是,浏览器就会被重定向至 ViewSession.jsp 页面,该页面显示您刚才输入的信息。ViewSession.jsp 页面看起来应如下所示:
浏览器就会被重定向至 UpdateSession.jsp 页面。由于 PageHandler 检测到会话对象中的信息,所以它会显示这些信息和消息“Update your information”而不是“Enter the following”。
继续练习 3.4:验证数据。