网络开发人员总是抱怨基于浏览器的应用软件的无状态性。就是说,一旦向服务器发出数据请求,且数据发送完毕后,所产生的连接即会断开。随后的数据请求又要建立新的连接。
虽然可以应用许多方法,如cookie或ASP.NET之类的专利技术,将数据保存在客户端;但xml(标准化越来越近了)HttpRequest对象提供一种减少响应时间的标准方法。浏览器中的xml(标准化越来越近了)
xml(标准化越来越近了)HttpRequest对象是ajax(动态网站静态化)(异步JavaScript+xml(标准化越来越近了))开发范例的焦点所在,但它并非最近才出现。微软最先在Windows IE5中将xml(标准化越来越近了)HttpRequest对象应用为ActiveX对象。Mozilla也在它的Mozilla 1.0(与Netscape 7)中应用了它的一个本地兼容版本。苹果也在它的Safari 1.2 中应用此对象。加入W3C DOM规格更使其成为网络开发的标准。
xml(标准化越来越近了)HttpRequest对象允许JavaScript不需重新装载页面即可发送HTTP请求。实质上,HTTP请求是通过后台收到的响应来发送的,但是,由于没有可见的中断产生,用户完全意识不到后台的处理过程,而会继续工作。对开发人员来说,这真是意外的收获,导致了能够实时向服务器发送数据的响应用户界面。
方法
xml(标准化越来越近了)HttpRequest对象包含少量的方法,如下所示:
open方法的第三个可选参数是一个布尔代数值,它对你是否异步处理即将发生的交易进行控制;这也是ajax(动态网站静态化)首字母缩写异步部分进入图片的地方。异步处理为边默认行为(真),就是说在调用send()方法后,不用
等待响应就立即执行脚本处理。如果将此值设为假,此脚本等待发出请求,服务器做出反映后再执行。
网络或服务器可能会引起问题,使脚本无法执行,因此在继续处理之前等待响应并非总是明智之举。更稳妥的做法是:在请求对象的onreadystatechange事件发生时,异步发送并设计代码,如下面的xml(标准化越来越近了)HttpRequest对象属性表所示:
你可以在用户继续使用应用软件的同时,利用xml(标准化越来越近了)HttpRequest对象的方法与属性,在后台发送请求。
了解应用中的对象
有两种在JavaScript代码中应用xml(标准化越来越近了)HttpRequest对象的方法。以下是IE方法:
varreq = new ActiveXObject("Microsoft.xml(标准化越来越近了)HTTP");
以下为非IE方法:
varreq = new xml(标准化越来越近了)HttpRequest();
由于这个原因,根据你所使用的浏览器,你可能想包括建立对象实例的代码,如下面的代码所示:
if (window.xml(标准化越来越近了)HttpRequest) {
req = new xml(标准化越来越近了)HttpRequest();
} else if (window.ActiveXObject) {
req = new ActiveXObject("Microsoft.xml(标准化越来越近了)HTTP");
}
这样就建立了一个基于浏览器的xml(标准化越来越近了)HttpRequest类。使对象工作的代码与示例对象相同。
在列表A中,网页应用ASP.NET,对输入到文本框中的公司名执行电话号码查询(我使用的是标准的sql server(WINDOWS平台上强大的数据库平台) Northwind数据库)。文本域的JavaScript onblur事件触发查询。
列表A<HTML><head>
<title>TechRepublic.com Example</title>
<script type="text/JavaScript" language="JavaScript">
function getTelephone(cName) {
document.body.style.cursor='wait';
varobj = null;
if (window.xml(标准化越来越近了)HttpRequest) {
obj = new xml(标准化越来越近了)HttpRequest();
} else if (window.ActiveXObject) {
obj = new ActiveXObject("Microsoft.xml(标准化越来越近了)HTTP");
}
vargoUrl = "http://localhost/test3.ASPx?cname=" + cName
obj.open("POST",goUrl, false );
obj.send();
if ((obj.responseText == "Error") || (obj.responseText == ""))
alert("The company name is invalid.");
else
this.document.forms[0].telephone.value = obj.responseText;
document.body.style.cursor='auto';
}
</script></head><body>
<form id="frmText">
<input type="text" name="telephone" /><br />
<input type="text" name="cname" onblur="getTelephone(this.value);" />
</form>
</body></HTML>
对HTML页面的几点提示:
在列表B中,xml(标准化越来越近了)HttpRequest对象调用ASP.NET代码。ASP.NET页面很简单。它应用通过QueryString变量提交到页面的值来定位SQL服务器数据库中匹配的数据,并返回匹配数据,如果发生异常,则返回错误。
列表B
<%@ Page Language="C#" ContentType="text/plain" Debug="true" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Data" %>
<script language="C#" runat="server">
private SqlConnection conn = null;
private SqlCommand cmd = null;
private String connString;
private String strSQL;
private void Page_Load(object sender, System.EventArgs e) {
if (!IsPostBack) {
connString = "data source=SALESLAPTOP;uid=test;pwd=test;initial catalog=Northwind";
strSQL = "SELECT Phone FROM dbo.Customers WHERE CompanyName LIKE '%" + Request.QueryString["cname"] + "%'";
try {
conn = new SqlConnection(connString);
cmd = new SqlCommand(strSQL, conn);
conn.Open();
Response.Write(cmd.ExecuteScalar().ToString());
conn.Close();
}catch (Exception ex) {Response.Write("Error");
} finally {
if (conn.State == ConnectionState.Open) {
conn.Close();
}conn.Dispose();
} } }
</script>
本例应用一个终端ASP.NET页面,但它可以使用任何开发语言。另外,由于终端页面只是简单地应用返回值,终端页面不必与调用它的页面使用同样的开发语言或平台。终端页面也可能是一个网络服务。
保持连接
该例说明了应用xml(标准化越来越近了)HttpRequest对象的精确性与简化性,这也为许多改善用户体验的其它应用打开大门。下面是许多其它应用中的几个: