第十一讲 ASP.NET内置对象(二)
教学目的:
一、状态管理的基本概念二,Server对象的应用三,Cookie对象的应用教学重点:
一,Server对象的主要用法二,Cookie对象的主要用法一、状态管理概述
网站系统由于服务器要为众多的用户服务,浏览器与服务器之间的连接是不连续的,状态也是不保持的,HTTP是一个无状态的通信协议,即每次浏览器与服务器之间的连接都是暂时的。当浏览器与服务器之间的一次会话结束,它们之间的连接也就自动断开了,下一次会话与本次连接无关,
两次连接之间不存在任何联系。
为什么不保持状态呢?这是因为访问网站的用户常常川流不息。如果要求系统将所有被访问的网页的状态都记忆下来,必然会耗费大量的系统资源,严重地降低程序的运行效率。
然而,在网站应用中有的状态却是需要保留的,比如用户在购货车中订购商品、用户登录的身份、对问卷调查所作的回答等,这些状态中有的希望能够保留一定的时间,以便联合处理或者在一定的范围内进行传递和共享。
为此,系统提供了状态管理方法,允许有选择地将一些状态 (数据 )在一定的时间内持续地保存下来。主要介绍几种状态的管理方法,具体内容包括:
状态的类型
视图状态
应用程序状态
会话状态
Cookie状态
Web窗体页的生命周期二、状态的类型
ASP.NET提供了 4种状态类型,分别应用于不同的目的。
视图状态,用于保存本窗体页的状态。
应用程序状态,用于保存整个应用程序的状态,
状态存储在服务器端。
会话状态,用于保存单一用户的状态,状态存储在服务器端。
Cookie状态,用于保存单一用户的状态,状态存储在浏览器端。
三,视 图 状 态
什么是视图状态?简单地说,视图状态就是本窗体的状态。保持视图状态就是在反复访问本窗体页的情况下,能够保持状态的连续性。
为什么要保持视图状态?当服务器处理完事件后通常再次返回到本窗体以便继续后续的操作。如果不保持视图状态,就是说当窗体页返回时,窗体页中原有的状态 (数据 )都不再存在,这种情况下怎样能够继续窗体的操作?
下面用一个简单的示例来说明这种情况。
假定向窗体中放入几个 HTML控件 (浏览器端控件 )。
一个 Input(Text)控件:用来输入姓名。
一个 Input(Password)控件:用来输入密码。
一个 Input(Text)控件:用来输入数量。图
8.1 使用 HTML控件的示例
一个 Input(Submit)按钮控件:用来向服务器提交数据。
这说明在网页中已经自动增加了一个隐含控件,
控件的名字为,__VIEWSTATE” 。由于这个新控件是隐含控件 (type="hidden"),因此增加它并不会改变界面上的布局。控件中的 value属性就是窗体页中各个控件以及控件中的数据 (状态 )。
为了安全,这些数据经过哈希函数加密,已经变得难以辨认。当网页提交时,浏览器端将首先将当前网页中的各种状态保留到这个字段中,当网页再次返回到本窗体页时,再自动将把这些状态反馈给返回的窗体页,也就恢复了窗体页中各控件的状态。
视图状态只能在本网页与服务器的往返中保持,而不能在不同网页之间传递,这是和其他状态所不同的地方。 在默认情况下几乎所有服务器控件都具有保持视图状态的功能。
保持视图状态带来了好处,但同时也带来一些新的矛盾。如果控件中包括的数据量很大 (例如某控件内有数百条记录 )时,将会延长网页往返时需要的时间。另外,尽管视图状态存储在窗体页的隐藏域中,并且经过哈希函数的加密处理,但它仍然有可能被篡改,这就导致了潜在的安全问题。
使用视图状态
对于单个页面的信息,视图状态是用来保存其信息的首选视图状态在每次回发之间保留控件的属性。视图状态中保存的数据机可以是简单数据类型,也可以是自定义的复杂对象。
使用视图状态的优点有以下几点:
不需要任何服务器资源
实现简单
增强的安全功能
但是,视图状态的也有一些弱点:
性能注意事项
设备限制
潜在的安全风险
private void SaveAllText(ControlCollection
controls,bool saveNested)
{
foreach (Control control in controls)
{
// 使用控件 ID来存储文本内容
if (control is TextBox)
ViewState[control.ID] =
((TextBox)control).Text;
if ((control.Controls!=null) && saveNested)
SaveAllText(control.Controls,true);
}
}
private void RestoreAllText(ControlCollection
controls,bool saveNested)
{
foreach (Control control in controls)
{
if ((control is TextBox &&
(ViewState[control.ID] != null)))
((TextBox)control).Text =
(string)ViewState[control.ID];
if ((control.Controls!=null) && saveNested)
RestoreAllText(control.Controls,true);
}
}
思考,ViewStata和 Session之间的区别一,ViewStata和 Session的相同点二,ViewStata和 Session的不同点三,ViewStata和 Session的选择一,ViewState和 Session对象都能够作为容器保存网页当中的数据。
二,ViewState只能在当前网页和服务器之间进行数据传输,而 Session对象能够在不同的网页之间进行数据传输。
三、在实际应用当中,Session对象应用的更为广泛。
四,Server对象
Server对象提供了对服务器上方法和属性的访问。 Server对象是 ASP.NET当中和服务器关系最紧密的一个内置对象。最常用的方法是创建 ActiveX组件的实例,其他方法可用于 将 URL或者 HTML编码成字符串,或者将虚拟路径映射到物理路径 以及设置脚本的超时时间等。
1,Server对象的属性和方法
MachineName属性,获取服务器的计算机名称。
ScriptTimeout属性,获取和设置请求超时(以秒计)。
Server对象的 GetLastError方法可以获得前一个异常,当发生错误时可以通过该方法访问错误信息。通过
ClearError方法可以清除前一个异常。
Transfer方法用于终止当前页的执行,并为当前请求开始执行新页。
MapPath方法应用返回与 Web服务器上的指定虚拟路径相对应的物理文件路径。
Execute 和 Transfer
HTMLEncode
URLEncode
MapPath
属性 描述
ScriptTimeout 用于指定脚本在终止之前在服务器上运行的时间周期。
MachineName 用于获取服务器的计算机名 。
Server.property | method
Transfer 方法
Server.Transfer("Ch5Ex5.aspx");
HTMLEncode 方法
Response.Write(Server.HtmlEncode("<H1>是标题标记的示例 </H1>"));
Server.HTMLEncode (string)
Response.Write("<br><H1> 是标题标记的示例 </H1>");
URLEncode 方法
Response.Write(Server.UrlEncode("http://localhost/
code/map.aspx"));
Server.URLEncode (string)
MapPath 方法
<%@ Page Debug ="true"%>
<html>
<script language="C#" runat="server">
void Page_Load (Object Src,EventArgs E)
Response.Write(Server.MapPath("/Ch5Ex5.aspx"));
}
</script>
<form runat ="server">
</form>
</html>
Response.Write( Server.MapPath("/Ch5Ex5.aspx"));
Server.MapPath (path)
五,Cookie对象
1、基本概念和 Session对象一样,Cookie对象也是保存下来作为单个用户共享的状态,但是这个对象保存的位置与 Session不同。 Session被保存在服务器端,
而 Cookie是保存在浏览器端的。 在 Cookie中只能含有较少量的信息,通常不超过 4096个字节 (有些较新的浏览器可以达到 8192个字节 )。
在客户端的默认存储位置:
C:\Documents and
Settings\Administrator\Cookies
2、工作原理
Cookie的作用是与 Session对象相结合来识别用户。 每当用户开始连接站点时,系统将自动在内存块中创建一个用户有关的会话状态,同时创建一个用户的 ID存放在浏览器端,与当前的用户惟一地联系起来。这样,服务器保存了 Session,
浏览器保存了 Cookie(用户的 ID)。当下一次用户发出请求时,请求的用户将被要求提交用户的 ID,
两者对照以正确地还原原来的会话状态。这就是在无状态协议的 HTTP条件下保持用户标志的方法。
可以通过 Response.Cookies.Add()方法直接向浏览器写入 Cookie,通过 Request,Cookies方法读取已经设置好的 Cookie。
写入 Cookie的方法是,先创建一个 HttpCookie对象,通过这个对象来构造一个 Cookie。例如:
//创建一个 HttpCookie对象
HttpCookie cookie = new HttpCookie
( NameField.Text ) ;
//设定此 Cookie值
cookie1,Value = ValueField.Text ;
//加入此 Cookie
Response.Cookies.Add ( cookie ) ;
Cookie有临时的,也有永远的。永久的 Cookie以文件形式存储在计算机上,关闭 Internet Explorer时仍然保留在计算机上。再次访问该站点时,创建该 Cookie的网站可以读取。在具体的编程时候,是在写入此 Cookie的时候,设定 Cookie的生命周期,其代码如下:
DateTime dtNow = DateTime.Now ;
TimeSpan tsMinute = new TimeSpan ( 0,1,0,
0 ) ;
cookie.Expires = dtNow + tsMinute ;
Response,Cookies,Add ( cookie1 ) ;
以上代码是设定新产生的 Cookie的生命期为一个小时,可以通过修改 TimeSpan的属性来设定 Cookie具体的生命期。
如果不设定时间,默认时间为 20分钟。
读取指定的 Cookie时的语句如下:
HttpCookie cookie =
Request.Cookies["Cookie的名称 "];
如果想将读出的 Cookie显示出来时,可以使用以下语句:
Response.Write(cookie.Value.ToString());
ASP.NET 2.0现在已经完全解决了在不使用
Cookie的情况下,识别用户的方法。解决的方法很简单,只需要在应用程序的根目录下的 Web.config文件中,对
<sessionState>节点进行配置,其他任何程序都不需要修改。为什么一定要在应用程序的根目录下配置?因为会话状态的设置是应用程序范围的设置。站点中的网页要么全都使用该配置,要么全都不使用。
配置的语句是:
<sessionState cookieless="useUri"/>
下面通过具体的题目来说明 Cookie对象的具体用法:
void Page_Load(object sender,EventArgs e)
{
if (Request.Cookies["MySettings"] == null)
{
// 创建 Cookie对象 MySettings
HttpCookie cookie = new HttpCookie
("MySettings");
// 设定 Mysettings的值
cookie.Values.Add ("FontName","MS Sans
Serif");
// 设定该 Cookie永不过期
cookie.Expires = DateTime.MaxValue;
// 通过 Responese对象写入 Cookie
Response.Cookies.Add (cookie);
}
}
protected void
DropDownList1_SelectedIndexChanged (object
sender,EventArgs e)
{
HttpCookie cookie = new HttpCookie
("MySettings");
// 添加 Cookie的 FontName值为所选定的下拉列表的值
cookie.Values.Add ("FontName",
DropDownList1.SelectedValue);
cookie.Expires = DateTime.MaxValue;
Response.Cookies.Add (cookie);
}