您的位置:首页 > 其它

web的基础知识

2008-04-07 12:34 148 查看
HTTP协议

HTTP这个缩写词对开发者来说实在是太熟悉了,以至于很多人甚至无法立即说出它代表什么。实际上,HTTP代表Hypertext Transfer Protocol(超文本传输协议)。HTTP是一个基于文本的协议,定义了Web浏览器和Web服务器如何进行通信。RFC 2068详细描述了HTTP数据包的格式,我们可以从http://www.w3.org/Protocols/rfc2068/rfc2068.txt下载它。HTTP数据包通过指向目标IP(Internet Protocol)地址的默认端口80的TCP(Transmission Control Protocol,传输控制协议)连接进行传输。

1. HTTP请求

浏览器指向一个URL时,它使用可用的DNS(Domain Name System,域名系统)将通过URL提供的服务器名转换为一个IP地址。接着,浏览器打开一个套接字(socket),并连接到该IP地址的端口80。带下载请求http://www.contoso.com/default.aspx页面的报文可以采用如下简单形式:

GET /default.aspx HTTP/1.1

Host: www.contoso.com

一个请求中的第1行文本是该请求的开始行。它必须包含要执行的HTTP命令的名称(这里为GET)、资源的URL以及要使用的HTTP协议的版本。

一个HTTP请求可以包含(而且往往包含)很多报头。HTTP报头是一行有关请求的附加信息的文本。在刚才所示的HTTP请求中,以“Host”开头的一行是HTTP报头。HTTP请求中可以发现以下报头:

? User-Agent 标识发出该请求的浏览器的类型。

? Connection 关闭一个连接或保持一个连接有效。

? If-Modified-Since 提供客户端缓存确认。

GET和POST是最常用的HTTP命令或动词。GET命令指检索该请求的URL标识的任何信息。POST命令用来请求初始服务器接受该请求包含的内容并处理它。通常,POST命令用来把一个数据块(即提交一个窗体后得到的结果)提供给一个数据处理进程。

2. HTTP响应

服务器端的响应包括一个状态行,该状态行由消息的协议版本和一个退出码(表示成功或发生一个错误)组成。状态行后面跟着几个报头(通常是页面的内容类型和长度)和主体内容。一个空行将主题内容与消息的其余内容分开,如下面的HTTP响应所示:

HTTP/1.1 200 OK

Server: Microsoft-IIS/5.0

Content-Type: text/html

Content-Length: 51

<html><body><h1>ASP.NET is cool!</h1></body></html>

上述代码说明了Web服务器返回的简单的HTML输出。请求和响应是根据HTTP模式进行格式化的字符串,它们通过TCP连接进行传输。代码200指该请求一切正常。指定的Web服务器处理该请求,并返回以给定的MIME(Multipurpose Internet Mail Extensions)类型(text/html)表示的某一长度的内容。HTTP规范列出了可以返回的HTTP代码,HTTP规范参见上述URL。另外还应注意,最后一个报头和HTTP响应的内容之间的空行并不只是起着格式化作用——回车和换行是必需的,并且是该标准的一个精确组成部分。

下面出现的内容主要依赖于MIME类型和本地浏览器的功能。只要MIME类型是text/html,浏览器就以HTML形式显示内容。如果MIME类型是text/xml,则一些浏览器将以纯文本形式显示内容,而另一些(例如,Microsoft Internet Explorer 6.0)将应用一个内置的样式表。

3. 构建服务器端抽象层

浏览器和Web服务器之间的每次会话都会牵涉到报文的交换,正如前面分析的那样。如果请求的URL是一个HTML页面,则Web服务器通常读取.html文件的内容,并把它刷新到响应报文的主体中。如果URL是一个ASP.NET页面,则会涉及一个特殊的IIS模块。该模块是一个IIS ISAPI插件。

ISAPI扩展是根据每个文件一个扩展注册的动态链接库(dynamic-link library,简称DLL)。每当对.aspx文件的请求到达时,就要注册一个用来处理这种资源的ISAPI扩展。该ISAPI扩展分析该请求,并配置将实际处理该页面的资源的服务器端环境。如果已经成功地检索该请求的状态,并且已经完全还原,则允许运行该页面并产生HTML输出。

4. 提交窗体

HTML <form>标签是惟一被授权的元素,它将客户端数据传输给服务器。当用户单击一个“提交(submit)”类型的按钮时,根据设计,浏览器将该窗体所属的所有控件的内容组合成一个字符串。然后将该字符串作为GET或POST命令的一部分传递给服务器。

下面的HTML片段说明一个简单的窗体,该窗体包含一个文本框和一个提交按钮。不难看出,该窗体将POST命令和default.aspx URL关联在一起:

<form method="post" action="default.aspx">

<input type="text" name="EmpCode" />

<input type="submit" value="Send" />

</form>

下面的请求用户单击该提交按钮后会显示命中该Web服务器的POST命令:

POST /default.aspx HTTP/1.1

Host: www.contoso.com

Content-Type: application/x-www-form-urlencoded

Content-Length: 12

EmpCode=1001

在处理该页面请求时,ISAPI扩展解析该请求的主体部分,并通过一个对程序员更友好的对象模型揭示已发现的任何信息。例如,不是保留一个简单的名称/值对,EmpCode变量移入一个应用级的集合(Request.Form集合)中。这代表在原始的HTTP编程模型之上建立的第一层抽象。Request、Response和Server等对象构成该调用的HTTP上下文,因而代表大多数Web开发平台(包括JSP和ASP)中的最小对象集合。然而在ASP.NET中,还有更多的对象。

1.1.4 ASP.NET页面的结构

ASP.NET页面是一个用.aspx扩展名来保存的服务器端文本文件。页面的内部结构是非常模块化的,包括三个独立的部分:页面指令、代码和页面布局。

? 页面指令 页面指令建立该页面的运行环境,规定HTTP运行库如何处理该页面,并确定对该页面可以安全做出的假设。这些指令还允许导入命名空间来简化编码,装入当前不在全局程序集缓存(global assembly cache,简称GAC)中的程序集,以及用定制标签名和命名空间前缀注册新的控件。

? 代码部分 代码部分包含页面和控件事件的处理程序,以及任选的帮助例程(helper routine)。与该页面有关的任何源代码可以按内联方式插入该页面中,或者通过一个独立的文件附加到该页面。如果以内联方式插入,则代码放在<script>标签下,script这个名称容易使人产生误解。(之所以选择<script>这个名称,是为了向后兼容。)通过使用runat=server属性,可以将服务器端<script>标签与客户端<script>标签区别开来。(后面还会讲到这一点。)任何页面代码总是先编译后执行。在ASP.NET 2.0中,它还可以进行预编译,并以二进制程序集的形式进行部署。

? 页面布局 页面布局表示页面的框架包括服务器控件、文本和HTML标签。服务器控件的用户界面可以用声明的属性和控件属性进行填充。

要使页面起作用,并不需要规定页面的所有部分。虽然真实的页面包括上述的所有部分,但是一些只包含代码部分或页面布局的页面,也可能是完全合法的并可用的。在一些特殊情况下,一个ASP.NET页面甚至只由一个指令组成。

在第2章中,将深入讨论ASP.NET页面及其构建块的特征。第3章还要进一步讨论 它们。

1.ASP.NET页面示例

现在来看一个ASP.NET页面。最初,一个简单的文本编辑器就足够用了,因此,打开记事本(Notepad),并把“沉睡的巨人”(Microsoft Visual Studio .NET)放在一边。如下代码实现了一个简单的ASP.NET页面,该页面允许输入一个字符串,然后,在单击按钮以后,它会将该字符串转换为大写字母。为了便于说明,这里会用内联代码。(从本书下面的内容可知,在实际应用中或者在任何比较复杂的页面中,都不会采用内联代码。)


<!-- Directives -->






<%... @Page Language="C#" %>




<!-- Code Section -->






<script runat="server">...




private void MakeUpper(object sender, EventArgs e)






...{




string buf = TheString.Value;




TheResult.InnerText = buf.ToUpper();




}




</script>




<!-- Layout -->




<html>




<head><title>Pro ASP.NET (Ch 01)</title></head>




<body>




<h1>Make It Upper</h1>




<form runat="server">




<input runat="server" id="TheString" type="text" />




<input runat="server" id="Button1" type="submit" value="Proceed..."




OnServerClick="MakeUpper" />




<hr>




<h3>Results:</h3>




<span runat="server" id="TheResult" />




</form>




</body>




</html>





上述代码清单中的空行和注释把它分成三个部分:指令、代码和页面布局。注意,runat属性被频繁使用——runat属性是整个ASP.NET“拼板玩具”中最重要的部件之一。在下一节中,将更详细地讨论runat属性。而现在,只要知道runat属性将原本无生气的服务器端标签提升为一个组件实例。
页面布局由文字和HTML标签组成,其中一些标签包含上述的runat属性。这样标记的任何东西(不管它的外观如何)实际上不是HTML元素。更精确地讲,它是一个服务器端组件(一个ASP.NET控件)的标记占位符——实际负责向浏览器提供服务的最终标记。在ASP.NET源代码中,用runat属性标记的每个标签并非是原封不动的输出,而是要在服务器上经历一个转换过程,然后产生真正的标记。ASP.NET运行库负责把这些标签映射到控件实例。下面将快速浏览一下该代码。

2.代码快速浏览

由于有了runat属性,在服务器上处理该页面时,文本输入字段就成为HtmlInputControl类的一个实例。该类的Vaule属性确定赋给该输入字段的默认文本。当用户单击提交按钮时,该页面自动回送给自己。这是由<form>标签的runat属性集来执行的。一旦页面到达服务器,服务器就读取输入字段已投递的值,并自动地赋给一个最新创建的HtmlInputControl实例的Value属性。接着,与OnServerClick事件关联的代码运行。该代码获取文本框的当前内容(已投递的字符串),并把它转变为大写字母。最后,把大写的字符串赋给HTML <span>标签绑定的服务器端控件的InnerText属性。MakeUpper事件处理程序结束时,该页面就准备显示。这时,已更新的HTML代码被发送给浏览器。

为了测试页面,应把该.aspx文件复制到Web服务器的根目录下。根目录通常是c:/inetpub/wwwroot。根据需要,也可以创建一个临时的虚拟目录。假设页面命名为hello.aspx。接着,让浏览器指向该页面。图1.3给出了这个页面在浏览器中的显示结果。



第一次向用户显示该页面时,即在用户单击提交按钮将文本转换为大写之前,最好先看一下该页面的HTML源代码。


<!-- Directives -->




<!-- Code Section -->




<!-- Layout -->




<html>




<head><title>Pro ASP.NET (Ch 01)</title></head>




<body>




<h1>Make It Upper</h1>




<form method="post" action="hello.aspx" id="Form1">




<div>




<input type="hidden" name="__EVENTTARGET" value="" />




<input type="hidden" name="__EVENTARGUMENT" value="" />




<input type="hidden" name="__VIEWSTATE" value="/wEPDwUJNzM4N…==" />




</div>






<script type="text/javascript">...




<!--




var theForm = document.forms['Form1'];






if (!theForm) ...{




theForm = document.Form1;




}






function __doPostBack(eventTarget, eventArgument) ...{






if (!theForm.onsubmit || (theForm.onsubmit() != false)) ...{




theForm.__EVENTTARGET.value = eventTarget;




theForm.__EVENTARGUMENT.value = eventArgument;




theForm.submit();




}




}




// -->




</script>




<input name="TheString" type="text" id="TheString" value="Hello, world" />




<input name="Button1" type="submit" id="Button1" value="Proceed ..." />




<hr>




<h3>Results: </h3><span id="TheResult"></span>




</form>




</body>




</html>





在<form>标签内,添加了一个硬编码的action属性,强制该页面发送给自己。这是故意的,而且也是ASP.NET最有特色的一点。各个隐藏字段是实现回送(postback)机制的基本要素,而且它们是自动生成的。嵌入式脚本代码也一样。<input>标签几乎相当于.aspx源代码中的对应元素——只不过没有runat属性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: