详细讲解HTTP的故事_白酒网
您的位置:网站首页 > 白酒资讯 >资讯

详细讲解HTTP的故事

2015-03-18     发布者:高小生
导读要理解状态是什么,就要意识到在设计时HTTP(用来在Web浏览器中请求和服务页面的协议)是无状态的。它的意思是Web服务器不会记录从特定浏览器中发出的请求。就Web服务器而言,从浏览器中对服务器发出的页面请求和单击链接对其他页面的请求仍然是原来的意思。We

  要理解状态是什么,就要意识到在设计时HTTP(用来在Web浏览器中请求和服务页面的协议)是无状态的。它的意思是Web服务器不会记录从特定浏览器中发出的请求。就Web服务器而言,从浏览器中对服务器发出的页面请求和单击链接对其他页面的请求仍然是原来的意思。Web服务器不会回收以前请求的页面。

  这样会产生一些有趣的问题。例如,我们看一个简单的登录到站点的登录页面,比如Web邮件程序。

  现在假设用一个正确的用户名和错误的口令登录。那么页面会通知登录尝试失败了,这时用户会希望已自动填好了用户名,而不希望Remember me next time复选框也保持选中。以这种方式,用户就容易输入正常的口令并再次单击Log In按钮。这只是一个简单的示例,不过如果控件能维持它们自身的状态,这在很多情况下都会很有用。

  然而,默认情况下Web页面或控件不会自己完成这一切。由于每个请求都是独立的请求,因此服务器不会回送之后再次填充文本框,而是会简单地以它首次加载时的方式处理页面。在其他Web技术中,比如经典ASP或PHP,可以通过手工写代码,在回送后预先填充控件来做到这一点。幸运的是,ASP.NET将这个功能集成到了ASP.NET功能集中,因此这样做容易多了。

  4.4.2 状态引擎的工作原理

  ASP.NET中的状态引擎可以存储很多控件。它不仅能存储用户输入控件(比如TextBox和CheckBox)的状态,而且可以存储其他控件(比如Label,甚至是Calendar)的状态。这一点通过一个示例可以很好地演示。下面的练习显示了如何用能维护它们的状态的控件创建一个页面。然后接下来的小节会解释ASP.NET是如何做到这一点的。

  试一试 分析ASP.NET状态引擎

  在本练习中将向页面添加Label、Button和Calendar控件。这些控件用以演示ASP.NET的一些内部工作方式,包括回送和ASP.NET维护状态的方式。

  (1) 在Demo文件夹下面,创建一个新页面,命名为State.aspx。一定要使用Code Behind,并且不要忘记从下拉列表中选择喜欢的语言。

  (2) 将页面切换到Design View,在虚线

内单击以把焦点放在它上面,然后从主菜单中选择Table | Table命令,添加一个两行两列的表。

 

  (3) 在第一行的第一个单元格中,从Toolbox中拖动一个Label控件。在第二行的第一个单元格里,拖动一个Calendar控件。如果在前面的“试一试”中按字母顺序排列了Toolbox,那么Calendar就是Toolbox的Standard类别中的第4个控件。否则,就会发现日历控件在Standard类别中大约下面三分之二处。

  (4) 注意,一旦把日历控件放在单元格中,Calendar的Smart Tasks面板就会弹出来,

  在Calendar的例子中,这个面板上只有一个选项:Auto Format,它允许修改日历的外观。单击该链接,从预先定义的颜色模式之一中选择,并单击OK按钮。

  (5) 然后,把Button控件拖到表的右列中的两个单元格里。

  (6) 单击第一行中的Button,然后按F4键打开Properties面板。将Button的ID设置为btnSetDate,并将它的Text属性设置为Set Date。ID属性将一直在属性列表末尾,或者,如果让属性列表按字母顺序排列的话,它就一直在列表开头。

  (7) 为其他按钮重复上一步,不过将它命名为btnPlainPostBack,并将它的Text属性设置为PlainPostBack。此时,页面在Design View中应如图4-16所示。

  (8) 在Design View中双击Set Date 按钮,并在VWD插入的代码行之间的空行上添加下面的代码:

  VB.NET

  Protected Sub btnSetDate_Click(ByVal sender As Object, ByVal e As _

  System.EventArgs) Handles btnSetDate.Click

  Label1.Text = DateTime.Now.ToString()

  End Sub

  C#

  protected void btnSetDate_Click(object sender, EventArgs e)

  {

  Label1.Text = DateTime.Now.ToString();

  }

  (9) 按Ctrl+F5键在浏览器中打开页面。单击星期中的某一天以在日历上选择一个日期。注意,单击了日期后,页面可能会重新加载,这是由一个回送引起的。在本练习后面的“工作原理”部分会了解更多这方面的知识。

  (10) 单击几次Set Date按钮。页面又会被发送回服务器,每次单击该按钮时Label都会更新为今天的日期和时间。等待几秒钟,然后单击Plain PostBack按钮。这时又发生了一个回送,然后页面就会重新加载。

  现在看一下Label的文本。它仍然含有上次单击Set Date按钮时显示的日期和时间。再多单击Plain PostBack按钮几次,注意,Label没有变化。

  (11) 回到VWD,在Design View中打开Label控件的Properties面板。定位EnableViewState属性,并通过下拉列表将它的值设置为false。

  (12) 在浏览器中再次打开页面,重复第(9)步和第(10)步,并单击日历和按钮。这次,当单击Plain PostBack按钮时,将看到Label控件默认是它的初始文本:Label。