摘要:Web 页本是无状态而断续的
Web 模型,B/S 是 C/S 的一个特例,但它仍然延续了 C/S 的“请求”-“响应”机制:从接到请求,分析请求并根据请求、在服务器上索取响应数据库及其他资源,加工处理形成一份 HTML 页面(这里可能会包含客户端脚本以达到特定效果),然后向客户端浏览器发回“响应”。Web 就这样一个来回(loop),一个来回的运行着。
这样来说,Web 显然是断续的。那“无状态”怎么讲?以 Windows 程序为例,比如文本框,它的 Text 属性值如果发生改变,你可以知道改变前的值和改变后的值,这就是状态的一个作用。
传统 Web 处理引擎(CGI, ASP, PHP, JSP 等)的编程,就基本上沿用着这套线性的模型。
ASP.NET Web Form 的“连续”和“有状态”假象
从根本上说,ASP.NET 并没有改变 Web 页的本质:每次请求 ASP.NET 页时,服务器就会加载一个 ASP.NET 页,并在请求完成时卸载该页。页及其包含的服务器控件负责执行请求并将 HTML 呈现给客户端。
ASP.NET 的设计者们,从实际访问者的角度重新考虑了这一过程:访问者打开一个页面,点击一个按钮,看到新的画面……这一切似乎都是连续的。
这种连续性假象是由 ASP.NET 页框架、页及其控件实现的。回发后,控件的行为必须看起来是从上次 Web 请求结束的地方开始的。另一方面,对于 Web Form 中的 TextBox,ASP.NET 也让它们具有了状态,可以知道上一个 loop 和这一个 loop 之间的 TextBox 值的变化;如果变化,可能会触发 TextBox 的 TextChanged 事件。这同样是 ASP.NET 特意实现的一个假象。
ASP.NET 服务器控件的生命周期一般如下:
1. 初始化 - Init 事件 (OnInit 方法)
2. 加载视图状态 - LoadViewState 方法
3. 处理回发数据 - LoadPostData 方法 对实现 IPostBackDataHandler 接口的控件,即可以自动加载回发数据的控件,如 TextBox, DropDownList 等。
4. 加载 - Load 事件 (OnLoad 方法)
5. 发送回发更改通知 - RaisePostDataChangedEvent 方法 对实现 IPostBackDataHandler 接口的控件,即可以自动加载回发数据的控件。 在第 3 步中加载回发数据,如果回发前后数据发生更改,则在这一步触发相应的服务端事件。
6. 处理回发事件 - RaisePostBackEvent 方法 对实现 IPostBackEventHandler 接口的控件,即能引起回发的控件,如 Button, LinkButton,......[
阅读全文]