状态管理的必要性
浏览器向服务器请求某个页面,服务器处理完返回该页面对象,
之后在服务器端会清除该页面对象的数据,就是是对同一个页面的多次请求,服务器每次也都是返回一个新的对象实例,如果用户需要保存页面中的数据,就需要进行状态管理。
状态管理分类:
视图状态是在单个页面(在单个页面的多次回传请求过程)中保存信息的第一选择。视图状态依赖于字典集合。
视图状态中的内容在服务端会被序列化后保存在一个隐藏域中,作为页面中的一个隐藏控件跟随页面回发到客户端浏览器。
图示:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cGcq5CO4UTM3UGO2IDZwI2N2E2NxYzX4QDNwcTM4IzLcBTMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL3M3Lc9CX6MHc0RHaiojIsJye.jpg)
视图状态在服务器端处理时是一个字典集合,当页面处理完毕后,视图状态中所有的信息会进行序列化操作,形成Base64编码的单个字符串保存在页面中id为__VIEWSTATE的隐藏域控件中,当用户操作导致页面回传时,此隐藏域中的信息会随着表单一起回发到服务器端,系统会将其内容还原为保存前的信息。
保存数据
<code>ViewState["Key"] = Value;</code>
取数据
<code>object obj = ViewState["Key"]</code>
保存的位置:客户端的隐藏域控件
保存的数据类型:object
不跨页面,不跨用户
当存储大量和复杂数据时,会让客户端浏览器的解析速度受到影响,会占用大量带宽
当视图状态保存数据为对象类型时,要将对象标记为可序列化类,也就是在类前面加上Serializeable特性
应用程序状态管理指:web应用程序在运行过程中需要对整个应用程序级别的信息进行保存或者读取的操作。简单来说就是在Web服务器运行期间保存或者读取数据的方式。
使用Application对象进行信息处理
使用Global类(全局类)的静态属性进行信息处理
使用应用程序缓存进行信息处理
Application属性是Page类中定义的属性,返回值类型是HttpApplication类型的对象,这种类型的对象主要用来进行全局信息保存。
作用:用来进行全局信息共享,任何一个用户通过客户端登录到这个网站都能看到这个对象里的数据
保存数据:value为object类型,可以保存任意信息且无需序列化
<code>this.Application[string name]=value;//</code>
读取数据:对象中的信息需要先声明再提取,并且在提取时需要进行类型转换
<code>object obj=Application[name];</code>
1、跨用户:任意一个用户写入在Application里面的数据,其他用户也能读取。
2、跨页面:在任意页面写入的数据,其它任意页面也能读取。
服务器端的内存中,所以服务器端关闭项目后,Application里的数据就会清空
数据写入 --> 应用程序关闭(或手动移除)
<code>this.Application.Remove("key");</code>
Application因为是用户共享的,所以可能会出现多个用户同时操作这个Application对象,为了避免发生这种冲突导致并发性的异常,
当一个用户在操作这个对象的时候进行加锁,这样其它用户就操作不了这个对象了,只有等当前用户操作完了解锁 之后才能操作。
加锁:<code>this.Application.Lock();</code>
解锁:<code>this.Application.UnLock();</code>
如:
因为保存的类型为object类型,所以写入进行装箱,读取需要拆箱,如果处理大量数据时,可能会影响效率
常用于:聊天室中的在线用户列表、网站中在线人员总数、系统公告等