第5章 使用已有资源——ASP.NET的内置对象
本章视频教学录像:19分钟
ASP.NET内置了几个常用对象,这些对象使用户更容易收集通过浏览器发送的请求信息、响应浏览器信息以及用户储存的信息,以实现特定的状态管理和信息传递。
本章要点(已掌握的在方框中打钩)
□ Response 对象
□ Request 对象
□ Server 对象
□ Application 对象
□ Session 对象
□ Cookie 对象
5.1 ASP.NET的内置对象
本节视频教学录像:11分钟
ASP.NET已经为我们提供了很多的内置资源,合理地使用这些资源可以提高开发的效率。ASP. NET的基本对象主要包括Application、Session、Cookie等,它们都能存储应用程序的数据。Request和Response这两个对象是ASP所提供的内置对象中最常用的两个。在浏览器和Web服务器之间,请求与响应中发生的信息交流可以通过ASP中的这两个内置对象进行访问和管理。
5.1.1 Response对象
ASP.NET的早期版本ASP中就包含有Page、Response、Request等对象。而在ASP.NET中,这些对象仍然存在,使用的方法也大致相同,不同的是这些对象改由.NET Framework中封装好的类来实现。并且由于这些对象是在ASP.NET页面初始化请求时自动创建的,所以能在程序中的任何地方直接调用,而无需对类进行实例化操作。
Response对象常用的属性如下表所示。
【范例5-1】使用Response对象的相关属性和方法。
⑴在 Visual Studio 2010中,新建名为“Response”的ASP.NET网站。添加一个名为ResponseTest. aspx的页面并设置为起始页。
⑵切换到ResponseTest.aspx页面的设计视图,添加一个按钮Button1,修改按钮的Text属性为“新浪”。双击ResponseTest.aspx页面或者按F7键,打开ResponseTest.aspx.cs页面,在Page_Load()事件中输入以下代码。
Response.Write("现在时间是:"+ DateTime.Now);
⑶添加Button1_Click()事件,输入以下代码。
Response.Redirect("http://www.sina.com.cn");
【运行结果】
按【Ctrl+F5】组合键或是单击工具栏中的按钮,在浏览器中会输出如图所示的结果。
单击“新浪”按钮,即可导向新浪网站。
【范例分析】
Response对象实际是在执行System.Web命名空间中的HttpResponse类。CLR会根据用户的请求信息建立一个Response对象。Response.Write()实现向客户端输出信息;Response.Redirect()实现定向到其他URL;Response.BinaryWrite()方法实现以二进制的方式输入。
5.1.2 Request对象
Request对象的功能是从客户端得到数据。Request对象常用的属性及方法如表所示。
【范例5-2】使用Request对象的Browser属性获取客户端信息。
⑴在 Visual Studio 2010 中,新建名为“RequestBrowser”的 ASP.NET 网站,添加一个名为getBrowser.aspx的页面。
⑵双击getBrowser.aspx页面,打开getBrowser.aspx.cs页面,在Page_Load()事件中输入以下代码(代码5-2.txt)。
01 protected void Page_Load(object sender,EventArgs e)
02 {
03 Response.Write("你使用的操作系统是:"+Request.Browser.Platform+"<br>");
04 Response.Write("是否支持HTML框架:"+Request.Browser.Frames+ "<br>");
05 Response.Write("浏览器的版本是:"+Request.Browser.Version+ "<br>");
06 }
【运行结果】
按【Ctrl+F5】组合键或是单击工具栏中的按钮,在浏览器中会输出如图所示的结果。
5.1.3 Server对象
Server对象提供对服务器上访问的方法和属性,大多数方法和属性是作为实用程序的功能提供的。Server对象常用的属性及方法如下表所示。
其中的ScriptTimeout属性用来设置脚本最长执行时间,默认时间为90秒。用户可以自己设置脚本最长执行时间:
Server.ScriptTimeout=150;
【范例5-3】使用Server对象的MapPath方法获取当前文件路径。
⑴在 Visual Studio 2010中,新建名为“ServerMapPath” 的ASP.NET网站,添加名为ServerTest.aspx的页面。
⑵在ServerTest.aspx.cs页面的Page_Load()事件中输入以下代码:
Response.Write("当前文件所在的物理路径为:"+ Server.MapPath("."));
【运行结果】
按【Ctrl+F5】组合键或是单击工具栏中的按钮,在浏览器中会输出如图所示的结果。
【范例分析】
本范例使用了Server对象的MapPath方法在页面加载时读取当前文件的位置,即Page_Load()事件中的Server.MapPath(".")。
5.1.4 Application对象
Application对象提供对所有会话的应用程序范围的方法和事件的访问,还提供对可用于存储信息的应用程序范围的缓存的访问。应用程序状态是可供 ASP.NET 应用程序中的所有类使用的数据储存库。它存储在服务器的内存中,因此与在数据库中存储和检索信息相比,它的执行速度更快。与特定和单个用户会话的会话状态不同,应用程序状态应用于所有的用户和会话。因此,应用程序状态非常适合存储那些数量少、不随用户的变化而变化的常用数据。
Application的关键特性有:存储于服务器内存中,与用户无关即多用户共享,在应用程序的整个生存期中存在即不会被主动丢弃,不被序列化,不发生服务器和客户端之间的数据传输。
Application对象的使用格式如下。
Application[“变量”] =“变量内容”;
Application对象的属性如下表所示。
Application对象的事件如下表所示。
【范例5-4】使用Application对象存取变量内容。
⑴在Visual Studio 2010中,新建名为“Application”的ASP.NET网站,添加名为AppTest.aspx的页面并设置为起始页。
⑵在AppTest.aspx页面上添加一个标签控件Label1。
⑶在AppTest.aspx.cs页面的代码窗口的Page_Load事件中输入以下代码(代码5-4.txt)。
01 protected void Page_Load(object sender,EventArgs e)
02 {
03 Application.Lock();
04 Application["usercount"]= (Convert.ToInt32(Application["usercount"])+ 1).ToString();
05 Application.UnLock();
06 Label1.Text= "您是第 "+Application["usercount"].ToString()+ "位访客 ";
07 }
【运行结果】
单击工具栏中的按钮,运行结果如图所示,该列可以实现对在线访问人数的统计。
【范例分析】
此范例中,第4行代码实现将Application变量usercount的自增1的操作,并保存到usercount中,然后在第6行代码中,通过标签控件将Application对象中的变量内容输出。第3行和第5行代码是为了实现对Application对象usercount的锁定和解锁,以防止多线程同时对该对象进行访问。
提示
Application对象是多用户共享的,它并不会因为一个用户离开而消失,一旦创建了Application对象,那么它就会一直存在,直到网站关闭或该对象被卸载。
因为Application是多用户共享的,为了防止在使用的使用被其他用户改变其值,需要用到Application对象变量的Lock方法,其语法如下。
Application.Lock
Application[“变量”] =表达式
Application.UnLock
Application.Lock是对Application值的锁定,这个时候其他用户是不能使用的,当使用完之后才能通过Application.UnLock来解锁,只有解锁之后其他用户才能够使用。
5.1.5 Session对象
Session对象为当前用户会话提供信息,还提供对可用于存储信息的会话范围的缓存的访问,以及控制如何管理会话的方法。应用程序状态是可供 ASP.NET 应用程序中的所有类使用的数据储存库。它存储在服务器的内存中,因此与在数据库中存储和检索信息相比,它的执行速度更快。与不特定于单个用户会话的应用程序状态不同,会话状态应用于单个的用户和会话。因此,应用程序状态非常适合存储那些数量少、随用户的变化而变化的常用数据。而且由于其不发生服务器与客户端之间的数据传输,所以Session还适合存储关于用户的安全数据,如购物车信息。
Session是单用户操作,当用户第一次登录时,系统会自动为其分配一个SessionID,这个ID是随机分配的,不会重复,可用来标志每一个不同的用户。当页面刷新或者重新打开该页面时,该值都会变化。
【范例5-5】使用Session对象记录当前用户的登录信息。
⑴在Visual Studio 2010中,新建名为“Session”的ASP.NET网站,添加名为Login.aspx的页面和一个名为Admin.aspx的页面。
⑵在Login.aspx页面上添加两个Label控件,两个TextBox控件和两个Button控件,属性设置如下表所示。
⑶双击“登录”按钮,在btnLogin_Click()事件中输入以下代码:
01 protected void btnLogin_Click(object sender,EventArgs e)
02 {
03 if (txtUserName.Text== "admin"&& txtPwd.Text== "123456")
04 {
05 Session["userName"]= txtUserName.Text; //使用Session变量记录用户名
06 Session["loginTime"]=DateTime.Now.ToString(); //使用Session变量记录登录时间
07 Response.Redirect("Admin.aspx"); //Redirect方法导向另外一个页面
08
09 }
10 else
11 {
12 Response.Write("<script>alert('用户名或密码错误 ')< /script>");
13 }
14 }
⑷在Admin.aspx的Page_Load()事件中输入以下代码:
01 protected void Page_Load(object sender,EventArgs e)
02 {
03 Response.Write("欢迎管理员 :"+Session["userName"].ToString()+"<br>");
04 Response.Write("您登录时间为 :"+Session["loginTime"].ToString());
05 }
【运行结果】
将Login.aspx页面设置为起始页,单击工具栏中的按钮,运行结果如图所示。输入用户名和密码并单击【登录】按钮,如果输入正确的用户名和密码,则会导向Admin.aspx页面;如果错误,则会提示用户名或密码错误。
【范例分析】
步骤⑶中的第5行和第6行代码是将用户输入的信息保存到Session对象中,单击【登录】按钮后,如果信息正确,将导向管理员页面,读取Session变量信息并显示。
提示
在网站建设中一般用Session来判断用户登录权限操作。系统在用户登录时获得用户信息,根据用户信息判断用户操作权限。
5.1.6 Cookie对象
Cookie 提供了一种在Web应用程序中存储用户特定信息的方法。例如,当用户访问您的站点时,您可以使用 Cookie 存储用户首选项或其他信息。当该用户再次访问您的网站时,应用程序便可以检索以前存储的信息。在开发人员以编程方式设置Cookie时,需要将自己希望保存的数据序列化为字符串(并且要注意,很多浏览器对Cookie有4096字节的限制),然后进行设置。
Cookie对象的属性如下表所示。
【范例5-6】使用COOKIE对象记录用户输入的信息。
⑴在范例5-5的Login.aspx的页面的密码框下方添加上一个复选框控件,界面如图所示,属性设置如表所示。
⑵双击【登录】按钮,将其单击事件中的代码修改为以下代码(代码5-6-1.txt)。
01 protected void btnLogin_Click(object sender,EventArgs e)
02 {
03 if (txtUserName.Text== "admin"&& txtPwd.Text== "123456")
04 {
05 if (chkAuto.Checked)//如果复选框选中
06 {
07 HttpCookie mycookie=new HttpCookie("mycookie", txtUserName.Text); //创建一个cookie对象,并将用户名存入cookie对象中
08 mycookie.Expires=DateTime.Now.AddDays(14); //设置cookie过期时间
09 Session["loginTime"]=DateTime.Now.ToString();
10 Response.Cookies.Set(mycookie); //将cookie写入到客户端
11 }
12 else
13 {
14 Session["userName"]= txtUserName.Text;
15 Session["loginTime"]=DateTime.Now.ToString();
16 }
17 Response.Redirect("Admin.aspx");
18 }
19 else
20 {
21 Response.Write("<script>alert('用户名或密码错误 ')< /script>");
22 }
23 }
⑶相应的也需要修改Admin.aspx的Page_Load()事件代码。
01 protected void Page_Load(object sender,EventArgs e)
02 {
03 HttpCookie mycookie=null;
04 mycookie=Request.Cookies["mycookie"];
05 if (mycookie !=null)
06 {
07 Response.Write("欢迎管理员:"+mycookie.Value+"<br>");
08 Response.Write("您登录时间为 :"+DateTime.Now.ToString());
09 }
10 else
11 {
12 if (Session["userName"]==null)
13 {
14 Response.Redirect("Login.aspx");
15 }
16 else
17 {
18 Response.Write("欢迎管理员 :"+Session["userName"].ToString()+ "<br>");
19 Response.Write("您登录时间为 :"+Session["loginTime"].ToString());
20 }
21 }
22 }
【运行结果】
设置Login.aspx为起始页,单击工具栏中的按钮。输入用户名和密码,选中复选框,单击【登录】按钮,即可跳转到管理员页面,并输出用户信息。选中复选框的作用就是将用户信息写入到客户端,下一次可以直接访问Admin.aspx页面而不需要登录。
【范例分析】
此范例是将用户输入的信息保存到Cookie对象中,并通过Request方法来读取Cookie对象中的这些信息。
5.2 高手点拨
本节视频教学录像:8分钟
1. Response的Write方法和Redirect方法的特殊应用
Response.Write()方法实现向客户端输出数据,如果希望输出一个提示性的对话框,可以使用如下方法:Response.Write(”<script>window.alert(‘添加成功!’);< /script>”);将会弹出一个添加成功的“确定”对话框。
Response.Rediect方法可以在定位到某个页面的同时传递变量值,我们简称“问号传值”,那么使用问号传值是可以传递多个参数的。传递多个参数时,参数与参数之间使用“&”分隔。格式如下:Response.Redirect(”Abc.aspx?parameter1=one¶meter2=two”)。
2. Application,Session,Cookie对象的区别
Application对象被整个应用程序共享,即多个用户共享一个Application对象;Session对象被每一个用户所独享,且每一个用户都具有唯一的Session标识,常用于存储用户信息;Cookie对象用于保存客户浏览器请求信息。其中Application和Session是把信息保存在服务器端,Cookie则是把信息保存在客户端。
5.3 实战练习
编写一个网站在线人数统计计数器,要求实现以下功能:每次用户打开页面计数器加1,某个用户会话结束后计数器减1。