|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
ASP.NET和ASP的比较,技术上比较已经没什么可说的了.新一代在大部分程度来说当然是比旧一代好了. 关键看你对所做软件的理解了.因人而定.会写的话也可能比ASP.NET写得更有效率和更方便重用request|xml|xmlhttprequest|对象 XMLHttpRequest对象是现今一切AJAX和Web 2.0使用法式的手艺基本。虽然软件经销商和开源社团如今都在供应各类AJAX框架以进一步简化XMLHttpRequest对象的利用;然而,咱们依然很有需要了解这个对象的具体任务机制。
1、 引言
异步JavaScript与XML(AJAX)是一个公用术语,用于完成在客户端剧本与办事器之间的数据交互进程。这一手艺的长处在于,它向开辟者供应了一种从Web办事器检索数据而不用把用户以后正在察看的页面回馈给办事器。与古代阅读器的经由过程存取阅读器DOM布局的编程代码(JavaScript)静态地改动被显示内容的撑持相共同,AJAX闪开发者在阅读器端更新被显示的HTML内容而不用刷新页面。换句话说,AJAX可使基于阅读器的使用法式更具交互性并且更相似传统型桌面使用法式。
Google的Gmail和Outlook Express就是两个利用AJAX手艺的咱们所熟习的例子。并且,AJAX可以用于任何客户端剧本言语中,这包含JavaScript,Jscript和VBScript。
AJAX使用一个构建到一切古代阅读器外部的对象-XMLHttpRequest-来完成发送和吸收HTTP恳求与呼应信息。一个经过XMLHttpRequest对象发送的HTTP恳求其实不请求页面中具有或回寄一个<form>元素。AJAX中的"A"代表了"异步",这意味着XMLHttpRequest对象的send()办法可以当即前往,从而让Web页面上的其它HTML/JavaScript持续其阅读器端处置而由办事器处置HTTP恳求并发送呼应。虽然缺省情形下恳求是异步停止的,然而,你可以选择发送同步恳求,这将会暂停其它Web页面的处置,直到该页面吸收到办事器的呼应为止。
微软在其Internet Explorer(IE) 5中作为一个ActiveX对象模式引入了XMLHttpRequest对象。其他的熟悉到这一对象主要性的阅读器制作商也都纷繁在他们的阅读器内完成了XMLHttpRequest对象,然而作为一个当地JavaScript对象而不是作为一个ActiveX对象完成。而现在,在熟悉到完成这一类型的价值及平安性特点以后,微软已在其IE 7中把XMLHttpRequest完成为一个窗口对象属性。侥幸的是,虽然其完成(因此也影响到挪用体例)细节分歧,然而,一切的阅读器完成都具有相似的功效,而且本色上是不异办法。今朝,W3C组织正在勉力停止XMLHttpRequest对象的尺度化,而且已刊行了有关该W3C标准的一个草案。
本文将对XMLHttpRequest对象API停止具体会商,并将注释其一切的属性和办法。
2、 XMLHttpRequest对象的属性和事务
XMLHttpRequest对象表露各类属性、办法和事务以便于剧本处置和掌握HTTP恳求与呼应。上面,咱们将对此睁开具体的会商。
readyState属性
当XMLHttpRequest对象把一个HTTP恳求发送到办事器时将履历若干种形态:一向守候直到恳求被处置;然后,它才吸收一个呼应。如许以来,剧本才准确呼应各类形态-XMLHttpRequest对象表露一个描写对象确当前形态的readyState属性,如表格1所示。
表格1.XMLHttpRequest对象的ReadyState属性值列表。
ReadyState取值描写0 描写一种"未初始化"形态;此时,已创立一个XMLHttpRequest对象,然而还没有初始化。1 描写一种"发送"形态;此时,代码已挪用了XMLHttpRequest open()办法而且XMLHttpRequest已筹办好把一个恳求发送到办事器。2 描写一种"发送"形态;此时,已经由过程send()办法把一个恳求发送到办事器端,然而还没有收到一个呼应。3 描写一种"正在吸收"形态;此时,已吸收到HTTP呼应头部信息,然而动静体局部还没有完整吸收停止。4 描写一种"已加载"形态;此时,呼应已被完整吸收。
onreadystatechange事务
不管readyState值什么时候产生改动,XMLHttpRequest对象城市激起一个readystatechange事务。个中,onreadystatechange属性吸收一个EventListener值-向该办法唆使不管readyState值什么时候产生改动,该对象都将激活。
responseText属性
这个responseText属性包括客户端吸收到的HTTP呼应的文本内容。当readyState值为0、1或2时,responseText包括一个空字符串。当readyState值为3(正在吸收)时,呼应中包括客户端还未完成的呼应信息。当readyState为4(已加载)时,该responseText包括完全的呼应信息。
responseXML属性
此responseXML属性用于当吸收到完全的HTTP呼应时(readyState为4)描写XML呼应;此时,Content-Type头部指定MIME(媒体)类型为text/xml,application/xml或以+xml开头。假如Content-Type头部其实不包括这些媒体类型之一,那末responseXML的值为null。不管什么时候,只需readyState值不为4,那末该responseXML的值也为null。
其实,这个responseXML属性值是一个文档接口类型的对象,用来描写被剖析的文档。假如文档不克不及被剖析(例如,假如文档不是良构的或不撑持文档响应的字符编码),那末responseXML的值将为null。
status属性
这个status属性描写了HTTP形态代码,并且其类型为short。并且,仅当readyState值为3(正在吸收中)或4(已加载)时,这个status属性才可用。当readyState的值小于3时试图存取status的值将激发一个异常。
statusText属性
这个statusText属性描写了HTTP形态代码文本;而且仅当readyState值为3或4才可用。当readyState为其它值时试图存取statusText属性将激发一个异常。
3、 XMLHttpRequest对象的办法
XMLHttpRequest对象供应了各类办法用于初始化和处置HTTP恳求,以下将逐一睁开具体会商。
abort()办法
你可使用这个abort()办法来暂停与一个XMLHttpRequest对象相接洽的HTTP恳求,从而把该对象复位到未初始化形态。
open()办法
你需求挪用open(DOMString method,DOMString uri,boolean async,DOMString username,DOMString password)办法初始化一个XMLHttpRequest对象。个中,method参数是必需供应的-用于指定你想用来发送恳求的HTTP办法(GET,POST,PUT,DELETE或HEAD)。为了把数据发送到办事器,应当利用POST办法;为了从办事器端检索数据,应当利用GET办法。别的,uri参数用于指定XMLHttpRequest对象把恳求发送到的办事器响应的URI。借助于window.document.baseURI属性,该uri被解析为一个相对的URI-换句话说,你可使用绝对的URI-它将利用与阅读器解析绝对的URI一样的体例被解析。async参数指定是不是恳求是异步的-缺省值为true。为了发送一个同步恳求,需求把这个参数设置为false。关于请求认证的办事器,你可以供应可选的用户名和口令参数。在挪用open()办法后,XMLHttpRequest对象把它的readyState属性设置为1(翻开)而且把responseText、responseXML、status和statusText属性复位到它们的初始值。别的,它还复位恳求头部。注重,假如你挪用open()办法而且此时readyState为4,则XMLHttpRequest对象将复位这些值。
send()办法
在经由过程挪用open()办法筹办好一个恳求以后,你需求把该恳求发送到办事器。仅当readyState值为1时,你才可以挪用send()办法;不然的话,XMLHttpRequest对象将激发一个异常。该恳求被利用供应给open()办法的参数发送到办事器。当async参数为true时,send()办法当即前往,从而答应其它客户端剧本处置持续。在挪用send()办法后,XMLHttpRequest对象把readyState的值设置为2(发送)。当办事器呼应时,在吸收动静体之前,假如存在任何动静体的话,XMLHttpRequest对象将把readyState设置为3(正在吸收中)。当恳求完成加载时,它把readyState设置为4(已加载)。关于一个HEAD类型的恳求,它将在把readyState值设置为3后再当即把它设置为4。
send()办法利用一个可选的参数-该参数可以包括可变类型的数据。典范地,你利用它并经由过程POST办法把数据发送到办事器。别的,你可以显式地利用null参数挪用send()办法,这与不必参数挪用它一样。关于大多半其它的数据类型,在挪用send()办法之前,应当利用setRequestHeader()办法(见前面的注释)先设置Content-Type头部。假如在send(data)办法中的data参数的类型为DOMString,那末,数据将被编码为UTF-8。假如数据是Document类型,那末将利用由data.xmlEncoding指定的编码串行化该数据。
setRequestHeader()办法
该setRequestHeader(DOMString header,DOMString value)办法用来设置恳求的头部信息。当readyState值为1时,你可以在挪用open()办法后挪用这个办法;不然,你将失掉一个异常。
getResponseHeader()办法
getResponseHeader(DOMString header,value)办法用于检索呼应的头部值。仅当readyState值是3或4(换句话说,在呼应头部可用今后)时,才可以挪用这个办法;不然,该办法前往一个空字符串。
getAllResponseHeaders()办法
该getAllResponseHeaders()办法以一个字符串模式前往一切的呼应头部(每个头部占独自的一行)。假如readyState的值不是3或4,则该办法前往null。
<P> 4、 发送恳求
在AJAX中,很多利用XMLHttpRequest的恳求都是从一个HTML事务(例如一个挪用JavaScript函数的按钮点击(onclick)或一个按键(onkeypress))中被初始化的。AJAX撑持包含表单校验在内的各类使用法式。有时,在填充表单的其它内容之前请求校验一个独一的表单域。例如请求利用一个独一的UserID来注册表单。假如不是利用AJAX手艺来校验这个UserID域,那末全部表单都必需被填充和提交。假如该UserID不是无效的,这个表单必需被从头提交。例如,一个响应于一个请求必需在办事器端停止校验的Catalog ID的表单域能够按以下模式指定:
<form name="validationForm" action="validateForm" method="post">
<table>
<tr><td>Catalog Id:</td>
<td>
<input type="text" size="20" id="catalogId" name="catalogId" autocomplete="off" onkeyup="sendRequest()">
</td>
<td><div id="validationMessage"></div></td>
</tr>
</table></form>
后面的HTML利用validationMessage div来显示响应于这个输出域Catalog Id的一个校验动静。onkeyup事务挪用一个JavaScript sendRequest()函数。这个sendRequest()函数创立一个XMLHttpRequest对象。创立一个XMLHttpRequest对象的进程因阅读器完成的分歧而有所区分。假如阅读器撑持XMLHttpRequest对象作为一个窗口属性(一切通俗的阅读器都是如许的,除IE 5和IE 6以外),那末,代码可以挪用XMLHttpRequest的机关器。假如阅读器把XMLHttpRequest对象完成为一个ActiveXObject对象(就象在IE 5和IE 6中一样),那末,代码可使用ActiveXObject的机关器。上面的函数将挪用一个init()函数,它担任反省并决意要利用的恰当的创立办法-在创立和前往对象之前。
<script type="text/javascript">
function sendRequest(){
var xmlHttpReq=init();
function init(){
if (window.XMLHttpRequest) {
return new XMLHttpRequest();
}
else if (window.ActiveXObject) {
return new ActiveXObject("Microsoft.XMLHTTP");
}
}
</script>
接上去,你需求利用Open()办法初始化XMLHttpRequest对象-指定HTTP办法和要利用的办事器URL。
var catalogId=encodeURIComponent(document.getElementById("catalogId").value);
xmlHttpReq.open("GET", "validateForm?catalogId=" + catalogId, true);
默许情形下,利用XMLHttpRequest发送的HTTP恳求是异步停止的,然而你可以显式地把async参数设置为true,如下面所展现的。
在这类情形下,对URL validateForm的挪用将激活办事器真个一个servlet,然而你应当可以注重到办事器端手艺不是基本性的;实践上,该URL多是一个ASP,ASP.NET或PHP页面或一个Web办事-这可有可无,只需该页面可以前往一个呼应-唆使CatalogID值是不是是无效的-便可。由于你在作一个异步伐用,所以你需求注册一个XMLHttpRequest对象将挪用的回调事务处置器-当它的readyState值改动时挪用。记住,readyState值的改动将会激起一个readystatechange事务。你可使用onreadystatechange属性来注册该回调事务处置器。
xmlHttpReq.onreadystatechange=processRequest;
然后,咱们需求利用send()办法发送该恳求。由于这个恳求利用的是HTTP GET办法,所以,你可以在不指定参数或利用null参数的情形下挪用send()办法。
xmlHttpReq.send(null);
<P> 5、 处置恳求
在这个示例中,由于HTTP办法是GET,所以在办事器真个吸收servlet将挪用一个doGet()办法,该办法将检索在URL中指定的catalogId参数值,而且从一个数据库中反省它的无效性。
本文示例中的这个servlet需求机关一个发送到客户真个呼应;并且,这个示例前往的是XML类型,因而,它把呼应的HTTP内容类型设置为text/xml而且把Cache-Control头部设置为no-cache。设置Cache-Control头部可以禁止阅读器复杂地从缓存中重载页面。
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
...
...
response.setContentType("text/xml");
response.setHeader("Cache-Control", "no-cache");
}
来自于办事器真个呼应是一个XML DOM对象,此对象将创立一个XML字符串-个中包括要在客户端停止处置的指令。别的,该XML字符串必需有一个根元素。
out.println("<catalogId>valid</catalogId>");
【注重】XMLHttpRequest对象的设计目标是为了处置由通俗文本或XML构成的呼应;然而,一个呼应也多是别的一品种型,假如用户代办署理(UA)撑持这类内容类型的话。
当恳求形态改动时,XMLHttpRequest对象挪用利用onreadystatechange注册的事务处置器。因而,在处置该呼应之前,你的事务处置器应当起首反省readyState的值和HTTP形态。当恳求完成加载(readyState值为4)而且呼应已完成(HTTP形态为"OK")时,你就能够挪用一个JavaScript函数来处置该呼应内容。以下剧本担任在呼应完成时反省响应的值并挪用一个processResponse()办法。
function processRequest(){
if(xmlHttpReq.readyState==4){
if(xmlHttpReq.status==200){
processResponse();
}
}
}
该processResponse()办法利用XMLHttpRequest对象的responseXML和responseText属性来检索HTTP呼应。如下面所注释的,仅当在呼应的媒体类型是text/xml,application/xml或以+xml开头时,这个responseXML才可用。这个responseText属性将以通俗文本模式前往呼应。关于一个XML呼应,你将按以下体例检索内容:
var msg=xmlHttpReq.responseXML;
借助于存储在msg变量中的XML,你可使用DOM办法getElementsByTagName()来检索该元素的值:
var catalogId=msg.getElementsByTagName("catalogId")[0].firstChild.nodeValue;
最初,经由过程更新Web页面的validationMessage div中的HTML内容并借助于innerHTML属性,你可以测试该元素值以创立一个要显示的动静:
if(catalogId=="valid"){
var validationMessage = document.getElementById("validationMessage");
validationMessage.innerHTML = "Catalog Id is Valid";
}
else
{
var validationMessage = document.getElementById("validationMessage");
validationMessage.innerHTML = "Catalog Id is not Valid";
}
6、 小结
下面就是XMLHttpRequest对象利用的一切细节完成。经由过程不用把Web页面寄送到办事器而完成数据传送,XMLHttpRequest对象为客户端与办事器之间供应了一种静态的交互才能。你可使用JavaScript启动一个恳求并处置响应的前往值,然后利用阅读器的DOM办法更新页面中的数据。缺点:安全性不是太差了,还行,只要你充分利用系统自带的工具;唯一缺点就是执行效率慢,如何进行网站优化以后,效果会比较好。 |
|