收藏 分享(赏)

02WebForm与状态保持_邹华栋三期.ppt

上传人:saw518 文档编号:9413307 上传时间:2019-08-06 格式:PPT 页数:38 大小:880.50KB
下载 相关 举报
02WebForm与状态保持_邹华栋三期.ppt_第1页
第1页 / 共38页
02WebForm与状态保持_邹华栋三期.ppt_第2页
第2页 / 共38页
02WebForm与状态保持_邹华栋三期.ppt_第3页
第3页 / 共38页
02WebForm与状态保持_邹华栋三期.ppt_第4页
第4页 / 共38页
02WebForm与状态保持_邹华栋三期.ppt_第5页
第5页 / 共38页
点击查看更多>>
资源描述

1、WebForm,cs可以调用aspx中的runat=server的控件(根本原因),aspx中也可以访问cs中定义的非私有的成员(根本原因),还可以编写复杂的C#代码, for等所有C#代码都可以写在aspx中(不推荐) 前面 后面 在当前位置输出表达式的值的时候使用,不要丢了=,相当于在当前位置调用Response.Write(UserName) 使用的函数、代码相当于在这个位置调用函数、执行代码。注意aspx中调用cs的只能是非私有成员(非private修饰-因为继承关系) 中的代码是运行在服务器端的,是C#语法,在服务端运行完成才输出到浏览器,其他部分是运行在浏览器端的,是html、Ja

2、vaScript语法。,前台文件和后台文件在运行的时候是两个分开的 类-前台文件类 继承于 后台文件类。,北京传智播客教育 ,ASP.NET WebForm 和 状态的保持,讲师:邹华栋,既然有了Ashx,为什么还要有Aspx?,如果每次输出网页都 一般处理程序(ashx) 的话太痛苦了,所以一般生成html的时候都直接创建aspx(Web窗体,WebForm),新建aspx页面,代码结合图片分析,前后台文件运行次序,WebForm介绍,WebForm分为两个文件aspx和aspx.csaspx是页面模板,是页面描述文件,就是html+js+css的内容,和aspx.cs结合的更好,不用像一般

3、处理程序那样程序员自己去输出HTML字符串或读取填充模板,控件都是定义在aspx中,内联的JavaScript、CSS也是写在aspx中的。前台页面上的Page指令集。服务端的C#代码是定义在aspx.cs中。aspx控制页面长相,cs控制程序逻辑,这种“前aspx后cs”的方式就被称为CodeBehind(代码后置)。强调:后台页面可以把Page_Load看成是WinForm里的Load事件(“最先运行“)。,后台向前台输出内容,1.直接在后台通过Response.Write(“内容“); aspx中也可以访问cs中定义的非私有的成员 缺点:全都输出在页面的最上面。2.使用在前台页面指定输出

4、。 可以编写复杂的C#代码, for等所有C#代码都可以写在aspx中(不推荐) 例如: ,aspx、cs、dll之间的关系(*),1.我们写的网站,在运行的时候其实都会被编译成程序集。页面会被编译成类。2.程序集在哪呢?在WebForm的页面中执行下面的代码 Response.Write(this.GetType() + “); Response.Write(this.GetType().Assembly.Location + “); 使用Reflector打开这个临时dll(老师带领同学看)。3.小结:aspx最终也会生成一个类,这个类是继承自aspx.cs的类 查看反编译以后的代码,可以

5、看到就是编译生成了普通的.Net 代码。因为aspx生成的代码是cs类的子类,所以就明白了为什么“aspx中调用cs的成员级别必须是protected或者public,不能是private的。”,小练习(注册),填写用户名和密码 (登陆练习,不允许使用服务器控件,只能用webform结合html),登录,用户打开登录页面,填入用户名密码,点击【登录】按钮,浏览器将用户输入的用户名、密码发送给网站服务器,网站服务器让负责处理登录请求的ASP.Net程序来处理这个登录请求,处理程序判断用户名、密码是否正确,然后将判断结果返回给浏览器。 开发一个登录页面需要做两个工作: 1.显示在浏览器中的页面、D

6、om特效,和C#代码没关系,也就是前端(前台)页面,相当于这个页面要生成的HTML代码模板; 2.处理浏览器请求的服务器端代码,C#代码,也就是后台代码。,画图区分第一次请求和之后的提交,练习,练习:做一个加法计算器 步骤:1.新建网站 2.添加新建项-Web窗体(Cul.aspx) 3.打开Cul.aspx,进入设计视图,从工具栏选择html控件拖入到页面适当的位置(可以使用适当的HTML代码布局-Table) 5.在Form_Load事件中编写代码,WebForm的运行流程,1.整体运行流程和ashx一样2.不同之处: 调用了Page类的ProcessRequest方法 创建了页面控件树*

7、(后面讲) 执行了页面生命周期(PageLoad和Render):老师带开源码。3.ASP.NET运行图,Request其它成员,1、Request.UrlReferrer 请求的来源,可以根据这个判断从百度搜的哪个关键词、防下载盗链、防图片盗链,可以伪造(比如迅雷)。“本图片仅供如鹏网内部交流使用“。(使用全局一般处理程序)2、Request.UserHostAddress获得访问者的IP地址,通过Socket获得的。3、Request.MapPath(virtulPath)将虚拟路径转换为磁盘上的物理路径,Request.MapPath(“./a/b.aspx“)就会得到D:2008Web

8、SitesWebSite4ab.aspx Server.MapPath里就是调用的Request.MapPath,Response其它成员,响应的缓冲输出:为了提高服务器的性能,ASP.Net向浏览器Write的时候默认并不会每Write一次都会立即输出到浏览器,而是会缓存数据,到合适的时机或者响应结束才会将缓冲区中的数据一起发送到浏览器。 Response对象的主要成员: 1、Response.Buffer、Response.BufferOutput:经过Reflector反编译,发现两个属性是一样的,Buffer内部就是调用的BufferOutput。这个属性用来控制是否采用响应缓存,默认

9、是true。 2、Response.Flush()将缓冲区中的数据发送给浏览器。这在需要将Write出来的内容立即输出到浏览器的场合非常适用。案例:大批量数据的导入,显示正在导入第*条数据,用Thread.Sleep模拟耗时。 3、Response.Clear()清空缓存区中的数据,这样在缓存区中的没有发送到浏览器端的数据被清空,不会被发送到浏览器。 4、Response.ContentEncoding输出流的编码。 5、Response.ContentType 输出流的内容类型,比如是html(text/html)还是普通文本(text/plain)还是JPEG图片(image/JPEG)。

10、,Response其它成员,5、Response.OutputStream 输出流,在输出图片、Excel文件等非文本内容的时候要使用它 6、Response.End() 终止响应,将之前缓存中的数据发给浏览器,End()之后的代码不会被继续执行,End方法里调用了Flush()方法。在终止一些非法请求的时候,比如盗链等可以用End()立即终止请求。,Server 属性,Server属性是HttpServerUtility的一个实例,它提供对服务器上的方法和属性的访问。,Server对象,HtmlEncode方法和 HtmlDecode方法,Execute 方法和 Transfer 方法,Ur

11、lEncode方法和 UrlDecode方法,MapPath方法,取得文件的物理路径,执行另一个页面的脚本,将文本编码成可以在浏览器 中可正确浏览的格式,URL编码和解码,Server(HttpServerUtility),Server是上下文对象context的一个属性,是HttpServerUtility类的一个对象 Server.HtmlDecode()、Server.HtmlEncode() Server.UrlEncode()、 Server.UrlDecode()是对HttpUtility类中相应方法的一个代理调用。推荐总是使用HttpUtility,因为有的地方很难拿到Serve

12、r对象,而且Server的存在是为以前ASP程序员习惯而留的。别把HtmlEncode、UrlEncode混了,UrlEncode是处理超链接中的中文问题, HtmlEncode是处理html代码的。还是推荐用HttpUtility.HtmlEncode。 Server.Transfer(path) 内部重定向请求,Server.Transfer(“JieBanRen.aspx”)将用户的请求重定向给JieBanRen.aspx处理,是服务器内部的接管(不能重定向到外部网站),浏览器是意识不到这个接管的,不是象Response.Redirect那样经历“通知浏览器请重新访问url这个网址和浏览

13、器接到命令访问新网址的过程”,是一次http请求,因此浏览器地址栏不会变化。因为是内部接管,所以在被重定向到的页面中是可以访问到Request、Cookies等这些来源页面接受的参数的,就像这些参数是传递给他的,而Redirect则不行,因为是让浏览器去访问的。注意Transfer是内部接管,因此不能像Redirect那样重定向到外部网站。 (常考)Response.Redirect就可以重定向到外部网站。 不能内部重定向到ashx,否则会报错“执行子请求出错”. Server.MapPath。,无状态Http,通俗:一个浏览者发出的请求都是由实现了IHttpHandler接口的对象进行响应,

14、由于下次访问不一定还是上次那个对象进行响应,上次响应完毕对象可能已经被销毁了,写的类变量值早就不存在了,因此不要将状态信息保存到类变量中。例子:编写一个aspxprivate int i; public void Count() Response.ContentType = “text/plain“;Response.Write(i+); 多次刷新我们发现,变量根本不会记忆上次的值。,无状态Http,画图理解什么是无状态。 无状态的根本原因是:浏览器和服务器使用Socket通信,服务器将请求结果返回给浏览器后,会关闭当前Socket连接。而且服务器会在处理页面完毕后销毁页面对象。 应用层面的原

15、因是:浏览器和服务器之间通信都遵守HTTP协议。Http协议是无状态的,不会记得上次和网页“发生了什么”(故事:24小时记忆)。服务器不记得上次给了浏览器什么。 对网站造成的影响:如果用户录入了一些信息,当跳转到下一个页面时,数据丢失,再也不能获得那些数据。 如果要知道上一次的状态信息,我们就得把这个状态信息记录在某个地方:a.服务器端b.浏览器端c. 表单元素中如:隐藏域(Http报文),画图.思考:如果要保持用户登录状态怎么办?,ASP.NET中的状态(信息)保持方案,客户端本质上3种:隐藏域/Cookies/QueryString(url?name=1),常用的状态(信息)保持方式(重点

16、),ViewState:ASP.NET 的 .aspx页面特有,页面级的;就是在页面上的一个隐藏域中保存客户端单独使用的数据的一种方式;服务器端控件的值都自动保存在ViewState中; Cookie:HTTP协议下的一种方式,通过该方式,服务器或脚本能够在客户机上维护状态信息;就是在客户端保存客户端单独使用的数据的一种方式;就像你的病历本一样,医院直接给你带回家; Session:现在指的是进程内Session。 在服务器端保存客户端单独使用的数据的一种方式;就像银行账户,钱都存在银行里,你就拿一张银行卡(SessionId)回家; Application:在服务器端保存共享数据的一种方式;

17、就像银行的单人公共卫生间,谁进去都行,但一次去一个,进去了就锁上门,出来再把锁打开;,ViewState(页面级),两种使用方式: 作用域-页面级1.用户数据保存方式:ViewState“myKey“=“MyData“;读取数据方式:string myData;if(ViewState“myKey“!=null) myData=(string)ViewState“myKey“; 注意:ViewState不能存储所有的数据类型,仅支持可序列化对象。2.非单值服务器控件的状态也自动保存在ViewState中列入:下拉框。(文本框是单值控件,所以不会保存在ViewState中)使用ViewState

18、的前提:页面上必须有一个服务器端窗体标记() 服务器在接收到用户请求一个页面后,会自动在请求报文中找看是否包含_VIEWSTATE的隐藏域,如果有,则将中间的值解码后添加到页面的ViewState属性中。 服务器在输出的时候,也会自动的将ViewState中的值添加到表单里名叫_VIEWSTATE的隐藏域中 VIEWSTATE适用于同一个页面在不关闭的情况下多次与服务器交互,ViewState图,服务器将ViewState里保存的值经过Base64编码后,自动添加到页面的隐藏域中。,使用ViewState可以方便的在服务器端将数据输出保存到客户端页面的一个隐藏域中,ViewState禁用,禁用

19、ViewState的方法,禁用单个控件的ViewState设定enableviewstate=false,禁用ViewState以后TextBox版本不受影响,Div版本受影响,因为input的value不依靠ViewState。 禁用整个页面的,在aspx的Page指令区加上EnableViewState=“false“ 。内网系统、互联网的后台可以尽情的用ViewState。 当某些控件的某些属性不属于浏览器表单的提交范围时,fw将会把这些属性添加到ViewState中保存。 WebForm的IsPostBack依赖于_ViewState,Cookie(小甜饼)病历本,Cookie是一种能

20、够让网站服务器把少量数据(4kb左右)储存到客户端的硬盘或内存,并且读取出来的一种技术。 当你浏览某网站时,由Web服务器放置于你硬盘上的一个非常小的文本文件,它可以记录你的用户ID、浏览过的网页或者停留的时间等网站想要你保存的信息。当你再次通过浏览器访问该网站时,浏览器会自动将属于该网站的Cookie发送到服务器去,服务器通过读取Cookie,得知你的相关信息,就可以做出相应的动作。 如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等等。 浏览器访问一个站点时,只将属于当前站点的Cookie发过到服务器。(根据域名)(没必要把每家医院的病历本都带过去。) Cookie不兼容浏览

21、器!(不同浏览器不共享Cookie文件数据) 最好是将要保存的内容在服务器端加密,然后再写入cookie,为什么? 在硬盘中存放的位置与使用的操作系统和浏览器密切相关。 浏览器保存Cookie有两种方式: 1浏览器的内存中; 2浏览器所在的电脑的硬盘中。为将要写入到浏览器的Cookie对象设置失效时间: cook.Expires = DateTime.Now.AddMinutes(5);/设置cook5分钟后失效开发场景:常用于登录和保存用户最近浏览商品从浏览器发来的Cookie的Expires属性值是无效的.(浏览器在向服务器发送Cookie的时候,没有将Cookie的失效时间发送过去),C

22、ookie图,注意:Cookie储存在客户端,Cookie的操作,服务器设置Cookie:HttpCookie cok = new HttpCookie(“uId”, “10001”);/(“键”,”值”)cok.Expires = DateTime.Now.AddDays(18);/设置失效日期-现在之后的18天后context.Response.Cookies.Add(cok); /添加到响应中服务器获得客户端传来的Cookie:string strUName=context.Request.Cookies“uId”.Value;/从请求中获得Cookie,登录示例,Cookie原理 -具

23、体如何往返的?,1.普通GET请求:无Cookie,2.服务器通过响应报文头里的set-cookie向浏览器设置Cookie信息,3.浏览器通过请求报文头里的Cookie传递浏览器存储的Cookie信息,提问:,如果服务器两次都输出同一个名称的Cookie,浏览器会怎么办? 如果服务器输出两个不同名的Cookie,浏览器怎么办? 如何删除浏览器Cookie?补充: cookie.Path(为指定的文件夹生成Cookie) cookie.Domain (域/域名) Response.Cookies和Request.Cookies中间的关系 有共用部分,Cookie注意,表单是和页面相关的,只

24、有浏览器端提交了这些数据,服务器端才能得到。而有时候希望在服务端任意的地方存取一些和访问者相关的信息,这时候就不方便将这些信息保存到表单中了,因为如果那样的话必须随时注意在所有页面表单中都保存这些信息。Cookie是和站点相关的,并且每次向服务器请求的时候除了发送表单参数外,还会将和站点相关的所有Cookie都提交给服务器,是强制性的。Cookie也是保存在浏览器端的,而且浏览器会在每次请求的时候都会把和这个站点的相关的Cookie提交到服务器,并且将服务端返回的Cookie更新到硬盘,因此可以将信息保存在Cookie中,然后在服务器端读取、修改。服务器返回数据除了普通的html数据以外,还会

25、返回修改的Cookie,浏览器把拿到的Cookie值更新本地浏览器的Cookie就可以。 哪怕请求jpg、js、css这种文件也会带着Cookie,因为服务器端可能要进行Session的操作,比如判断是否登录。互联网优化的案例:图片服务器和主站域名不一样,降低Cookie流量的传输。面试时聊网站调优 Cookie的缺点和表单一样,而且还不能存储过多信息。客户端、服务器端设置的Cookie双方都能读。,练习,登录练习,Session,Session提供了一种把信息保存在服务器内存中的一种方式。它能存储任何数据类型包括自定义对象。 每个客户端的Session是独立存储。 Session 对象用于存

26、储有关用户的信息。 在整个用户会话过程中(浏览器关闭之前)都会保留此信息。(保存SessionId的cookie丢失之前) 当用户在应用程序中从一个网页浏览到另一个网页时,存储在 Session 对象中的变量不会被丢弃。 Session只可由该会话的用户访问(因为SessionId的东东以cookie的方式保存访问者浏览器的缓存里了) 用户不能访问或修改他人的Session注意:当会话(Session)过期或终止时,服务器就会清除 Session 对象 开发场景:常用于保存登录用户ID,Session图,Session的操作,开始并为Session赋值:Session“uName”=“CNYa

27、oMing”; 取值:string strName = Session“uName”.ToString(); 销毁(取消/退出):Session.Abandon();/销毁服务器端的Session对象 Session.Clear();/清空服务端的Session对象里的键值对,Session对象并没有从Session池里销毁,Session常用属性、方法,Session详解,ASP.Net已经内置了Session机制。不要放太多的对象到Session(因为存储在服务器端fw的一个辅助进程里,不稳定,数据多了容易丢失。),Session会有超时销毁的机制。Cookie是存在客户端,Session

28、是存在服务器端,目的是一样的:保存和当前客户端相关的数据(当前网站的任何一个页面都能取到Session、Cookie)。 如果浏览器禁用了Cookie可以启用Url来传递SessionID。可以看到Session机制并不是Http协议规定的,是ASP.net实现的,现在PHP、JSP等大部分服务端技术都实现了Session,原理都差不多。 Session有自动销毁机制(设置失效时间,默认就是滑动过期机制),如果一段时间内浏览器没有和服务器发生任何的交互,则Session会定时销毁。案例:Session实现登录,登录以后才能看一些内容。 案例:用Session实现验证码。HttpHandler要

29、能够操作Session,要实现IRequiresSessionState接口。 点击图片产生新的验证码。 每次点击都生成一个新的地址,让浏览器去请求。,Application对象,Application对象可以存储应用程序级的数据。 “Application”:应用程序 第一个用户访问站点时,应用程序启动,并创建一个Application对象。 创建成功后,整个应用程序中都可以使用该对象。 除非应用程序关闭,否则对象一直存储在内存中。,系统对象,WebForm增删改查(不使用服务器控件),列表 删除 修改 新增,Web应用程序和网站,WebApplication(Web应用程序)和WebSite(网站)的区别,WebSite用起来简单,比如不需要创建命名空间、CS代码修改以后不需要重启就能看到变化(WebApplication每次修改以后点击【生成解决方案】也能立即看到修改效果),但是不利于工程化开发,比如代码不分命名空间。开发技术上没有任何区别,只是开发、调试习惯不同而已。 方便开发不用每次调试都设定起始页,在项目的选项中设定【Web】启动操作当前页面,这样当前激活的页就是起始页。 此次课程知识使用WebSite;,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报