《第9单元内置对象.ppt》由会员分享,可在线阅读,更多相关《第9单元内置对象.ppt(46页珍藏版)》请在三一办公上搜索。
1、第9单元 内置对象,学习目标:,Request 对象Server 对象Response 对象Session对象Cookie对象Application对象,现在的Web应用程序通常都是数据驱动的,但是在状态处理中,我们应该尽量减少对数据库的依赖:数据库是存放在磁盘上的。如果把数据存放在数据库中则性能会比较差。很多数据是和用户相关的。如果把数据存放在数据库中,又没有一个唯一的标志来区分哪条记录对应哪个客户端(浏览器)。很多数据是临时的,用户关闭了浏览器这些数据就不再需要了。如果把数据存放在数据库,不知道是哪个用户关闭了浏览器,也就不能及时把数据删除。,ASP.NET提供了很多状态管理机制,如:多个
2、可使用的内置对象,它们各有各的特点。,与所有基于 HTTP 的技术一样,Web 窗体页是无状态的,这意味着它们不自动指示序列中的请求是否全部来自相同的客户端,或者单个浏览器实例是否一直在查看页或站点。,HttpContext类,Response,Request,Server,Application,Session,Cookie,向客户端输出信息或设置客户端状态,获取客户端信息,处理Web交互操作,获取服务器信息,可以创建一些组件的实例,保存的信息在整个Web站点上可共享使用,信息保存在服务器中,信息保存在客户端,保存单个用户的信息,页,面 初,时,系,统自,动创,建,始化,一、概 述,服务器,
3、服务器域名,URL,资源的名称,响应,这是 HTTP 请求,这是 HTTP 响应,二、Request对象,Request对象封装了客户端请求信息,它是HttpRequest类的实例。,1.Request对象简介,2.Request对象常见属性与方法列表,实例:例1 常见属性举例,页面设置:一个标签,id=lblRequest;Text=“”,protected void Page_Load(object sender,EventArgs e)lblRequest.Text=lblRequest.Text+HttpRequest.Browser=+HttpContext.Current.Requ
4、est.Browser+,;lblRequest.Text=lblRequest.Text+HttpRequest.Url=+HttpContext.Current.Request.Url+,;lblRequest.Text=lblRequest.Text+HttpRequest.UserHostAddress=+HttpContext.Current.Request.UserHostAddress+,;lblRequest.Text=lblRequest.Text+HttpRequest.UserHostName=+HttpContext.Current.Request.UserHostNa
5、me+,;,3.Request对象的使用,访问HTML基于表单的数据通过URL发送参数列表信息接收来自客户端的Cookie信息.,QueryString,Form,Cookies,ServerVaribles说明:这里的Collection可省略不写,系统会依据从左到右的次序依次查找。,Request.Form“表单元素名”,Request.QueryString“url变量”,Request.Cookies“cookie变量”,Request.ServerVariables“服务器变量字符串”,访问方法:Request.Collection“变量名”,(1)Request.Form与Requ
6、est.QueryString,POST 表单数据以form集合的形式提交给服务器 使用方法:用Request.Form“表单元素”获取值GET 窗体里的表单数据以查询的字符串用URL形式提交给服务器 使用方法:用Request.QueryString“url变量名”获取值,窗体提交事件,例2:传递方式举例:直接获取用户在表单中输入的用户名和密码,TextBox1,TextBox2,分别取出用户输入的用户名和密码,并在页面上显示,protected void Button1_Click(object sender,EventArgs e)Response.Write(用户名:+Request.
7、FormTextBox1);Response.Write(密码:+Request.FormTextBox2);,查看“源”,没有设置method,说明默认情况下是以post方式提交表单的,浏览后查看源文件,PostDemo.aspx,页面设计:,将上例中的表单提交方式改为”get”“源”中标签中加method=“get”修改按钮的事件代码:,protected void Button1_Click(object sender,EventArgs e)Response.Write(用户名:+Request.QueryStringTextBox1);Response.Write(密码:+Reque
8、st.QueryString TextBox2);,浏览,浏览时注意观察地址栏,表单数据是通过地址栏的参数列表传到服务器的,例3:,两种方式比较:,GET方式 在URL中显示提交的数据-不安全 地址栏的长度有限 不够保密POST方式 可以传送更多数据 安全性高,例4:从page1跳转到page2,由地址栏到参数,并在page2中显示所传递的参数的值。page1页面中加入一个文本框TextBox1和一个按钮(Text为“通过地址栏传值”)给按钮加事件,protected void Button1_Click(object sender,EventArgs e)Response.Redirect(
9、page2.aspx?id=+TextBox1.Text);,page2中输出所传递的参数,protected void Page_Load(object sender,EventArgs e)if(!IsPostBack)string id=Request.QueryString id.ToString();Response.Write(页面page1到page2传递的参数是:+id);,(2)ServerVarible集合,保存客户机与服务器的相关环境变量,如:用户的IP地址,浏览器的版本信息用法:Request.ServerVarible(“环境变量值”),例5:输出几个与服务器相关的信
10、息,protected void Page_Load(object sender,EventArgs e)Response.Write(你所使用的浏览器是:+Request.ServerVariablesHTTP_USER_AGENT);Response.Write(你的IP地址是:+Request.ServerVariablesREMOTE_ADDR);Response.Write(服务器主机名是:+Request.ServerVariablesSERVER_NAME);Response.Write(服务器的协议是:+Request.ServerVariablesSERVER_PROTOCO
11、L);,小测试,(1)Request对象通过什么来获取URL变量的值A、form B、queryString C、serverVariables D、url(2)Request对象通过什么来获取表单元素的值A、form B、queryString C、serverVariables D、url(3)Request对象通过什么来获取服务器环境变量的值A、form B、queryString C、serverVariables D、url(4)网页表单默认的提交方式是:A、post B、get,三、Response对象,从输出页面读取/写入文本将用户重新定向到另一个页面有条件地结束应用程序连接设置
12、/获取输出内容类型检查客户端与服务器的连接状态读取/写入 Cookie,Response:服务器响应对象,它是HttpResponse类的实例。每次客户端发出一个请求的时候,服务器会用一个响应对象来处理这个请求,处理完这个请求之后,服务器会销毁这个响应对象,以便继续接受其它客户的请求。,Response的属性、方法,1.Write()方法,例6:输出一个九九乘法表将HTML与C#代码混写,ResponseDemo1.aspx,for(int i=1;i);,回忆纯C#代码:,表达式,用来编写程序的代码部分,可以在其中声明变量和方法即写C#语句。用来向输出流中输出变量的值如:(等价于),2.Re
13、direct(),作用:页面跳转 如:Response.Redirect(“Register.aspx”)跳转会花费大量的服务器时间,一般不要不加限制地使用,3.缓冲机制,将数据先保存在服务器缓存区域,这样访问时不用每次都执行文件,只是从缓存区取得数据,从而加快页面处理的速度和服务器响应时间。Response.Buffer和Response.BufferOutPut设置是否缓冲要输出到客户端的数据Response.BufferOutPut=True:完成对整个页面和处理之后才向客户端输出,Buffer和BufferOutPut属性实现的功能一样,.NET提供Buffer属性仅仅是为了与asp兼
14、容,而通常在.net中所使用的是BufferOutPut属性,4.Clear和Flush,Clear、Flush使用的前提条件是:BufferOutPut或Buffer的属性设置为True,Clear:用于清除缓冲区中所有的HTML输出Flush:用于将当前缓冲区里的内容强制输出到客户端,例7:修改上例中的九九乘法表,1.无标题页,浏览并解释结果:,前五行送入缓冲区,并用Clear()清空了缓冲区,连同一起清空了。,ResponseDemo2.aspx,例8:将例7修改,改为 if(i=5)Response.Flush();,if(i=5)Response.Clear();,将,观察结果:整个
15、九九乘法表又能显示。说明:因为数据比较小,还看不出缓存的效果,例9:在页面的最后将缓存清空。(在例8的基础上修改),说明前5行送入客户端了,后面的被清空了,ResponseDemo3.aspx,5.End,例10:将所有缓存输出到客户端,并停止当前页的执行。,结果:输出前5行,因为条件不满足,所以没有停止。,例11:在地址栏中输入?end=1 使得Request.QueryString“end”.ToString()=“1“,输入后回车,ResponseDemo.aspx,缓冲区的内容送入客户端,页面就停止执行了,没有执行最后的语句”Response.Clear()“;,四、Server对象,
16、Server对象是HttpServerUtility类的一个实例,它提供了服务器信息地封装,定义了一个与Web服务器相关的类,实现对服务器的方法和属性的访问。,1.机器名与超时,例12:protected void Page_Load(object sender,EventArgs e)Server.ScriptTimeout=5;/设置超时为5秒 Response.Write(服务器的计算机名:+Server.MachineName);/下面用循环来测试超时的效果显著 string time=DateTime.Now.ToString();/取出现在的机器时间 Response.Write(
17、+time);int i=0;while(i+DateTime.Now.ToString();time=DateTime.Now.ToString();i+;Response.Flush();,ServerDemo1.aspx,2.HtmlEncode属性,protected void Page_Load(object sender,EventArgs e)Response.Write(的 Server对象);Response.Write(Server.HtmlEncode(的 Server对象);,3.url编码与解码,当服务器向用户发送有关URL信息时,有一些符号如:/、&可能会被截断或误
18、解,这时就要对URL进行编码(&在URL中是连接符号),编码后的文本为:%2fmore.aspx%3fpage%3d1,protected void Page_Load(object sender,EventArgs e)string str=Response.Write(Server.UrlEncode(str);,对编码后的进行解码:,protected void Page_Load(object sender,EventArgs e)string str=Response.Write(Server.UrlEncode(str);Response.Write(Server.UrlDecod
19、e(Server.UrlEncode(str);,ServerDemo2.aspx,4.Execute,protected void Page_Load(object sender,EventArgs e)Server.Execute(ResponseDemo1.aspx);Response.Write(执行本页);,5.Transfer,执行了ResponseDemo1.aspx页面后,再回来执行Response.wrter(),用处:当一个页面根据不同条件去执行不同的功能(每个功能的实现由一个页面完成),当某个功能发生改变时,只需要去更改那一个页面就够了。,protected void P
20、age_Load(object sender,EventArgs e)Server.Transfer(ResponseDemo1.aspx);Response.Write(执行本页);,最后一条语句并没有被执行。因为它已终止执行后不再回到本页面执行,Session中的数据保存在服务器端,客户端需要时创建它,不需要时销毁它(remove),使它不占用服务器内存。Session对象中的信息只能被用户自己使用,每个连接的客户端都有各自的Session对象,不同的客户端不能互相存取Session变量Session中可以保存任意类型的数据Session默认的生命周期是20分钟,用户也可以设置它。Sess
21、ion变量对于每个会话都是独立的,每个会话都有一个SessionID,它是唯一的,由于24个字符组成。,五、Session对象,Session对象:表示会话状态,用来保存与当前会话相关的信息,它是HttpSessionState类的实例。,1.Session对象,例13:页面设置:5个按钮:分别创建sesstion、获取SessionID的值、输出Session的值以及移出Session等操作,protected void Button2_Click(object sender,EventArgs e)SessionstrUser=Session变量;Session“number”=12;/等
22、价于 Session.Add(number,12);int intarr=new int6;Sessionarr=intarr;,运行:(1)单击Button1,结果:SessionID是变化的。(2)单击Button2后,再单击Button1,结果:SessionID的值不断变化,结论:Session变量被创建后,SessionID就固定了。,SessionDemo1.aspx,protected void Button1_Click(object sender,EventArgs e)Response.Write(Session ID:+Session.SessionID);,2.Sess
23、ion的使用,protected void Button3_Click(object sender,EventArgs e)/通过Session变量获取其值 Response.Write(strUser=+SessionstrUser);Response.Write(/number=+Sessionnumber);Response.Write(arr=);int a=new int6;a=(int)Sessionarr;for(int i=0;i a.Length;i+)Response.Write(ai+);/for(int i=0;i(int)(Sessionarr).Length;i+)
24、/Response.Write(int)Sessionarr)i+);,protected void Button4_Click(object sender,EventArgs e)/通过索引获取其值 for(int i=0;i+Session.Keysi+Session i.ToString();/说明最后的一个数据无法获得值,因为它是一个数组(若干个数),protected void Button5_Click(object sender,EventArgs e)/删除Session变量 Session.Remove(arr);Session.RemoveAt(1);Session.Rem
25、oveAll();,3.Abandon(),Abandon()可以删除所有的Session变量,它还会结束当前会话,触发Session_End事件,使用方法:Session.Abandon();,Session超时当Session超时时相当于执行了Abandon()如:Session.Timeout=1;/时间1分钟超时时间不能设置超过525600分钟(一年)也可以Web.config中设置如:,六、Cookie对象,Cookie对象用来保存特定的用户相关的数据,这是HttpCookie类的实例。信息保存在客户端,每次客户端发出请求时都会把Cookie一起发送到服务器,服务器每次响应客户端请求
26、时重新把Cookie发送到客户端保存。Cookie只能保存字符串类型的数据。Cookie也有默认的生命周期,默认关闭浏览器时Cookie消失。也可以手动设置最大可设置成50年。,Response.Cookies“uname”.Value=“张三;string str=Request.Cookiesuname.Value;Response.Write(str);,例14:Cookie举例,protected void Page_Load(object sender,EventArgs e)HttpCookie cookie=Request.Cookiesname;/获取客户端所有的Cookie中
27、key为name的Cookie if(cookie=null)/如果没有 cookie=new HttpCookie(name,王芳);/创建一个Cookie cookie.Expires=DateTime.Now.AddDays(10);/设置有效期为到10天后 Response.Cookies.Add(cookie);/发送到客户端保存 else Response.Write(Cookie中保存的数据是:+cookie.Value);cookie.Expires=DateTime.Now.AddYears(-1);/设置一年前就过期 Response.Cookies.Add(cookie)
28、;/发送到客户端,客户端就删除它(因为已过期),说明:第一次运行,因为cookie为空,没有显示,执行if部分,创建一个cookie;刷新1次,因为已赋值,所以显示cookie的值,再刷新,又被删除了,没有cookie,也不显示。,CookieDemo.aspx,七、Application,Application是HttpApplicationState类的实例。Application和 Session存储的数据类型(任意类型)和存储的位置(服务器上)一样,不同的是Application中的数据可以由网站中的所有用户来设置或者获取。并且存放的数据没有时间期限。除非服务器重启或手动删除。,例15
29、:Application与Session对比。,ApplictionSessionDemo.aspx,);Response.Write(当前Session被访问的有+sessionCount+次了);%,运行时不断的刷新页面,会发现两个值同时变化,关闭页面后,再重新浏览,会发出两个值就不一样了。(一个记录的所有用户的值,一个记录的特定会话的值,),总结,传递Form表单中的控件值用Request.Form 获取值,地址栏中传递的参数用 Request.QueryString获取通常用HttpResponse 类的属性Buffer、Cache、Cookie 和 Expires来设置站点的一些特性
30、HttpResponse 类的常用方法是 Write()、End()和 Redirect()HttpServerUtility 类的Execute()和Transfer()的区别关键在于执行后控制权是否返回原先页面、URLEncode()和HTMLEncode()主要用于对HTML 标签和URL进行编码,对站点或程序的安全具有重要意思,MapPath()获取物理路径时需要注意是绝对路径还是相对路径,阅读材料,Global.asax文件 在每个应用程序项目的根目录中有一个Global.asax文件,它定义了一个Global类(派生自System.Web.HttpApplication基类)。Gl
31、obal类定义了一些有关项目的全局性事件。在其中可以编写响应或http模块引发的应用程序级别的事件处理代码。通常也把内部对象的初始化代码放在这些事件处理程序中。(系统自动生成的事件代码框架不全,用户可以根据需要手动添加),Global.asax文件提供的事件代码框架:,void Application_Start(object sender,EventArgs e)/在应用程序启动时运行的代码 void Application_End(object sender,EventArgs e)/在应用程序关闭时运行的代码 void Application_Error(object sender,Ev
32、entArgs e)/在出现未处理的错误时运行的代码 void Session_Start(object sender,EventArgs e)/在新会话启动时运行的代码 void Session_End(object sender,EventArgs e)/在会话结束时运行的代码。注意:只有在 Web.config 文件中的/sessionstate 模式设置为InProc 时,才会引发 Session_End 事件。/如果会话模式设置为 StateServer 或 SQLServer,则不会引发该事件,说明:,1.Application_start事件 应用程序启动时触发此事件,此事件在程
33、序的生命周期中仅被触发一次。通常可将所有供客户端共享的内部对象初始化代码入在这里。注意不可将这些初始化代码放在首页的Page_Load事件中,因为这样会导致每当首页被加载时都会重新初始化这些对象,将这些对象此前的值丢弃。应用程序启动时也会触发一次Session_Start事件。先触发Application_Start事件,再触发Session_Start事件。在程序的生命同期中Application_Start事件仅被触发一次,而Session_Start事件可多次被触发。2.Application_End事件 应用程序关闭时触发Application_End事件,此事件在程序的生命周期中仅被
34、触发一次。当程序结束时,会自动释放应用程序的内存,若应用程序还占用了系统其他资源可在这里编写代码释放。,3.Session_Start事件 一个新的客户端请求应用程序某个页面时触发Session_Start事件。在应用程序的生命周期中,不断有新的客户端对应用程序提出请求,Session_Start事件会被反复触发。对特定客户端在各个页面中共享的内部对象的初始化代码放在这里比较合适。因为从某个客户端访问本应用程序开始,一直到该用户关闭浏览器为止,这个初始化仅被执行一次。4.Session_End事件 Session超时或Session被关闭时Session_End事件,当特定的客户端用户访问本应用程序开始,Session_Start事件被触发,当该用户转向其他应用的URL时,应用程序并没有结束这个Session,当从其他应用程序返回到本应用程序中时,保存在Session中的数据仍然有效,直到用户关闭浏览器为止。一般可以通过Session超时来限制用户离开本应用程序。当设定的超时时间到时Session_End事件被激发。,