文档介绍:第8章状态管理
(时间:2次课,4学时)
第8章状态管理
网站与桌面系统的工作方式不同,与传统的分布式系统也不相同。在桌面系统中,系统资源被独占;在传统的分布式系统中,资源虽然分布在系统的各个环节,但是只要不专门指定,系统总是保持连接的。网站系统虽然也是一个分布式系统,但由于服务器要为众多的用户服务,浏览器与服务器之间的连接是不连续的,状态也是不保持的,HTTP是一个无状态的通信协议。这就是说,在网站系统中,每次浏览器与服务器之间的连接都是暂时的。当浏览器与服务器之间的一次会话结束,它们之间的连接也就自动断开了,下一次会话与本次连接无关,两次连接之间不存在任何联系。
为什么不保持状态呢?这是因为访问网站的用户常常川流不息。如果要求系统将所有被访问的网页的状态都记忆下来,必然会耗费大量的系统资源,严重地降低程序的运行效率。
然而,在网站应用中有的状态却是需要保留的,比如用户在购货车中订购商品、用户登录的身份、对问卷调查所作的回答等,这些状态中有的希望能够保留一定的时间,以便联合处理或者在一定的范围内进行传递和共享。
为此,系统提供了状态管理方法,允许有选择地将一些状态(数据)在一定的时间内持续地保存下来。本章将要介绍几种状态的管理方法,具体内容包括:
状态的类型
视图状态
应用程序状态
会话状态
Cookie状态
Web窗体页的生命周期
第8章状态管理
状态的类型
视图状态
应用程序状态
会话状态
Cookie状态
简单的应用示例
Web窗体页的生命周期
小结
习题
状态的类型
提供了4种状态类型,分别应用于不同的目的。
视图状态:用于保存本窗体页的状态。
应用程序状态:用于保存整个应用程序的状态,状态存储在服务器端。
会话状态:用于保存单一用户的状态,状态存储在服务器端。
Cookie状态:用于保存单一用户的状态,状态存储在浏览器端。
视图状态
什么是视图状态?简单地说,视图状态就是本窗体的状态。保持视图状态就是在反复访问本窗体页的情况下,能够保持状态的连续性。
为什么要保持视图状态?时追求的目标之一,是尽量使网站的设计与桌面系统一致。中的事件处理模型是实现本目标的重要措施(参见第7章),该模型是基于服务器处理事件的,当服务器处理完事件后通常再次返回到本窗体以便继续后续的操作。如果不保持视图状态,就是说当窗体页返回时,窗体页中原有的状态(数据)都不再存在,这种情况下怎样能够继续窗体的操作?
下面用一个简单的示例来说明这种情况。
假定向窗体中放入几个HTML控件(浏览器端控件)。
一个Input(Text)控件:用来输入姓名。
一个Input(Password)控件:用来输入密码。
一个Input(Text)控件:用来输入数量。 使用HTML控件的示例
一个Input(Submit)按钮控件:用来向服务器提交数据。
视图状态
视图状态
这说明在网页中已经自动增加了一个隐含控件,控件的名字为“__VIEWSTATE”。由于这个新控件是隐含控件(type="hidden"),因此增加它并不会改变界面上的布局。控件中的value属性就是窗体页中各个控件以及控件中的数据(状态)。为了安全,这些数据经过哈希函数加密,已经变得难以辨认。当网页提交时,浏览器端将首先将当前网页中的各种状态保留到这个字段中,当网页再次返回到本窗体页时,再自动将把这些状态反馈给返回的窗体页,也就恢复了窗体页中各控件的状态。
视图状态只能在本网页与服务器的往返中保持,而不能在不同网页之间传递,这是和其他状态所不同的地方。在默认情况下几乎所有服务器控件都具有保持视图状态的功能。
保持视图状态带来了好处,但同时也带来一些新的矛盾。如果控件中包括的数据量很大(例如某控件内有数百条记录)时,将会延长网页往返时需要的时间。另外,尽管视图状态存储在窗体页的隐藏域中,并且经过哈希函数的加密处理,但它仍然有可能被篡改,这就导致了潜在的安全问题。
应用程序状态
Application对象是HTTPApplicationState类的实例。Application是属于全局性的对象,用于存放应用程序中多个用户共享的信息。当用户第一次访问某虚拟目录的资源时被创建,退出应用程序或关闭服务器时被撤销。
Application对象利用“键—值”对的字典方法来定义,其中“键”为字符串,代表状态的“名”,“值”可以是任何类型的数据。例如:
Application["Message"] = " MyMsg";
// 给名为"Message"的Application对象赋值" MyMsg"
string Myvar= Application["Messa