页面的生命周期,你能掌握么?
了解页面生命周期的重要性:
每一个页面都有它自己的周期,深入了解页面的生命周期不仅可以使我们对页面的流程更加了解,更有利于我们去添加对象!
如果你还不那么了解页的周期的话,也许这篇文可以让你明白一些!重点要看每个过程的先后次序!
首先我们看一下页面的生命周期是从请求页,到返回页之间的时间,在这期间它主要做了以下的9件事:我们要十分明白,各个过程的先后顺序与明确各个过程在做什么操作~
接来要说的是每个过程的具体内容:
1、请求页:当浏览器向服务器发出请求时,服务器先是解析HTTP报文,查看所请求的页面是否需要分析与编译,或是可以在不运行页面的情况下输出页面缓存来进行响应(如果不太懂页面缓存与HTTP报文的话下面的补充知识中有包含)
2、开始:用于初始化页面类的属性,用于处理用户请求还有要回发数据库的响应的对象,Request与Response就在这个过程中设置,还根据是回发请求来设置IsPostBack属性)
3、页面初始化:对应事件是Page_PreInit事件,页面初始化期间可以使用控件,并将设置每一个控件是UniqueID属性,此外,任何主题都将应用于页。如果当前的请求是回发请求(也就不是第一次请求)那么这个时候我们是没有办法获取控件的属性的,因为它还没有从ViewState中还原,用户控件和母版页是没有这个事件的,这个事件只有是页面级的事件中有。
4、控件加载:对应的是Page_Init,在这个事件中,读取或者初始化控件的属性,如果是回发请求的话,则将使用从视图状态和控件状态恢得多的信息加载控件属性
5、验证:调用所有验证程序控件的Validate()方法,将设置各个验证程序控件和页的IsValid属性
6:页面加载:在Page_Load事件中,可以读取和更新控件属性
7:回发事件处理(我们经常使用的是两个事件)
8:呈现:在这个步骤中,ASP.NET会处理当前的视图状态,并将其序列化保存到页。接着调用每一个控件,将其呈现通过Respose.OutputStream输出
9:卸载:在页面完全呈现并准备丢弃时,调用卸载Page_Unload()事件,包括关闭打开了的文件和数据库连接,完成日志记录或者其他的事务
(补充知识---页面缓存:
缓存的原理:缓存的原理是在浏览器对资源的第一次请求之后,把资源中的一部分存储在计算机的临时文件空间中,当再次请求的时候,按照特 定的策略加载缓存的资源,减少HTTP的请求次数与传输数据量,以此提高浏览效率。浏览器直接读取缓存中资源的情况:1、cache-control设定了有效时间,在这个时间内新打开新网页(或者地址栏回车)不需要去请求服务器。2、页面刷新时,则是发送HTTP请求,检查服务器,如果文件没有修改(文件最新修改时间与缓存的一样的话),则浏览器将从缓存中获得资源。
特殊情况:
IE前进与后退时:一般取自缓存,比如Cache-control设定为private、must-revalidate、max-age,如果
Cache-control为no-cache,还需要再次请求服务器,因为这种情况是不会在浏览器缓存区留下任何痕迹。
IE刷新:不管cache-control的为何值,都会检查服务器。
检查要访问网页的最新版本,如果存在最新版本,则返回最新网页的内容,并更新缓存;如果不存在最新版本,则只返回标题,内容去缓存中获取。
IE强刷新(crtl+F5):获取要访问网页的服务器最新版本,返回最新的版本,并删除缓存中的相应内容,将最新的内容写入缓存。
其实强制刷新情况下,请求的HTTP报文头里,Cache-control为no-cache。
IE脱机情况:这是一种比较特殊的重新浏览方式,这种情况下是没有任何面向服务器的请求过程的,直接去浏览器的缓存寻找数据,如果缓存没有命中,脱机就没办法工作了。显而易见的是,no-cache方式,是没办法脱机工作的。
补充知识---HTTP报文(转):
HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。
HTTP请求报文的形式:
(1)请求行
请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。
HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。这里介绍最常用的GET方法和POST方法。
GET:当客户端要从服务器中读取文档时,使用GET方法。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。
POST:当客户端给服务器提供信息较多时可以使用POST方法。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据。
(2)请求头部
请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
User-Agent:产生请求的浏览器类型。
Accept:客户端可识别的内容类型列表。
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
(3)空行
最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。
(4)请求数据
请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。
)
总结:
之前我一直都没有太多关注页面生命周期,而在做一个用户控件时出现了一系列的错误,吃一堑长一智。编程快乐!