📄 掌握 ajax,第 7 部分 在请求和响应中使用 xml.htm
字号:
<TR vAlign=top>
<TD width=8><IMG height=1 alt=""
src="掌握 Ajax,第 7 部分 在请求和响应中使用 XML.files/c.gif"
width=8></TD>
<TD width=16><IMG height=16 alt=""
src="掌握 Ajax,第 7 部分 在请求和响应中使用 XML.files/c.gif"
width=16></TD>
<TD class=small width=122>
<P><SPAN class=ast>未显示需要 JavaScript
的文档选项</SPAN></P></TD></TR></NOSCRIPT></FORM></TBODY></TABLE></TD></TR></TBODY></TABLE><!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- 03/20/06 updated by gretchen --><BR>
<TABLE cellSpacing=0 cellPadding=0 width=150 border=0>
<TBODY>
<TR>
<TD class=v14-header-2-small>拓展 Tomcat
应用</TD></TR></TBODY></TABLE>
<TABLE class=v14-gray-table-border cellSpacing=0 cellPadding=0
border=0>
<TBODY>
<TR>
<TD class=no-padding width=150>
<TABLE cellSpacing=0 cellPadding=0 width=143 border=0>
<TBODY>
<TR vAlign=top>
<TD width=8><IMG height=1 alt=""
src="掌握 Ajax,第 7 部分 在请求和响应中使用 XML.files/c.gif"
width=8></TD>
<TD><IMG height=16 alt=""
src="掌握 Ajax,第 7 部分 在请求和响应中使用 XML.files/fw_bold.gif"
width=16 vspace=3 border=0></TD>
<TD width=125>
<P><A class=smallplainlink
href="http://www.ibm.com/developerworks/cn/kickstart/webserver.html?S_TACT=105AGX52&S_CMP=simpleart">下载
IBM 开源 J2EE 应用服务器 WAS CE 新版本 V1.1</A>
</P></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><!--END RESERVED FOR FUTURE USE INCLUDE FILES--><BR></TD></TR></TBODY></TABLE>
<P>级别: 中级</P>
<P><A
href="http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro7.html#author">Brett
McLaughlin</A> (<A
href="mailto:brett@oreilly.com?subject=在请求和响应中使用 XML&cc=htc@us.ibm.com">mailto:brett@oreilly.com?subject=在请求和响应中使用
XML&cc=htc@us.ibm.com</A>), 作家,编辑, O'Reilly and
Associates<BR></P>
<P>2006 年 10 月 23 日</P>
<BLOCKQUOTE>偶尔使用 Ajax 的开发人员也会注意到 Ajax 中的 <I>x</I> 并意识到它代表
<I>XML</I>。XML
是编程中最常用的数据格式之一,对于异步应用程序中的服务器响应能够带来切实的好处。在本文中,您将看到服务器如何在请求响应中发送
XML。</BLOCKQUOTE><!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
<P>现在如果不使用 XML 就不能进行任何有意义的编程。无论考虑转向 XHTML 的网页设计人员、使用 JavaScript 的
Web 程序员、使用部署描述文件和数据绑定的服务器端程序员,还是研究基于 XML
的数据库的后端开发人员,都在使用这种可扩展标记语言。因此,XML 被认为是 Ajax 底层的核心技术之一就不足为奇了。</P>
<P>但是,这种观点反映到 Ajax 应用程序就表现在其核心对象所选的名称 ——
<CODE>XMLHttpRequest</CODE>,这个名称不是很好,因为它并没有反映技术上的实际情况。换句话说,多数人之所以认为
XML 是 Ajax 的核心组成部分,仅仅是因为他们想当然地以为 <CODE>XMLHttpRequest</CODE>
对象在任何时候都使用 XML。但实情并非如此,本文第一部分给出了原因。实际上,您将看到在多数 Ajax 应用程序中 XML
很少出现。</P>
<P>XML 确实有应用在 Ajax 中,而且 <CODE>XMLHttpRequest</CODE>
也支持这种用法。也确实没有什么能阻挡您向服务器发送 XML。在本系列前面的文章中,我们使用普通文本和名/值参数发送数据,但 XML
也是一种可行的格式。本文将介绍如何来这样做。但最重要的是,我将讨论<I>为何</I>可以使用 XML
作为请求格式,以及为何在多数情况下<I>不应该</I>使用它。</P>
<P><A name=1><SPAN class=atitle>XML:到底用没用?</SPAN></A></P>
<P>对 Ajax 应用程序及它们使用 XML
的情况很容易犯想当然的错误:这种技术的名称(Ajax)及其使用的核心对象(<CODE>XMLHttpRequest</CODE>)都暗示了
XML 的使用,谈到 Ajax 应用程序的时候也经常听到
XML。但是,这种观点大错特错,如果希望在编写异步应用程序时真正做到胸有成竹,必须<I>知道</I>这种想法是错误的,而且最好知道<I>为什么</I>错误。</P>
<P><A name=1.1><SPAN class=smalltitle>XMLHttpRequest:糟糕的名称和
HTTP</SPAN></A></P>
<P>一项技术可能遇到的最糟的境况之一是它变得太炙手可热以至于无法再改变它的一些基本内容。<CODE>XMLHttpRequest</CODE>
恰恰是这种情形,它是 Ajax 应用程序中使用的基本对象。听起来它似乎是为通过 HTTP 请求发送 XML 或者以某种 XML 格式发出
HTTP 请求而设计的。但不论这个对象的名称<I>听起来</I>像什么,实际上它要<I>做</I>的只不过是为客户机代码(在网页中通常是
JavaScript)提供一种发送 HTTP 请求的方式。仅此而已,别无其他。</P>
<P>因此,如果将 <CODE>XMLHttpRequest</CODE> 改成某种更准确的名称可能更好一些,比如
<CODE>HttpRequest</CODE>,或者简简单单的
<CODE>Request</CODE>。但是,现在成千上万的人在应用程序中使用了
Ajax,而且我们知道需要几年时间(如果不是十几年的话)大部分用户才会改用 Internet Explorer 7.0 或
Firefox 1.5 这些新版本的浏览器,因此这么修改实际上是不可行的。最终我们不得不使用
<CODE>XMLHttpRequest</CODE>,这就要求开发人员要知道其名不符实的这一事实。</P>
<P>在一定程度上讲,对于不支持 <CODE>XMLHttpRequest</CODE> 的浏览器(特别是在 Windows
上)的最佳回溯方法之一就是使用 Microsoft <CODE>IFRAME</CODE> 对象。听起来可不像是 XML、HTTP
或请求,是不是?当然,所有这些都可能涉及到,但是这正清楚地说明了一点 —— <CODE>XMLHttpRequest</CODE>
对象更多的是关于在不重新加载页面的情况发出请求,而不会太多地涉及 XML 甚至 HTTP。</P>
<P><A name=1.2><SPAN class=smalltitle>请求是 HTTP 而非 XML</SPAN></A></P>
<P>另一种常见的错误是认为 XML 在幕后使用 ——
坦白地说,我也曾这么认为!但是,持这种观点表明您对这种技术还不甚了解。当用户打开浏览器从服务器上请求网页时,会输入
<CODE>http://www.google.com</CODE> 或者
<CODE>http://www.headfirstlabs.com</CODE> 这样的东西。即便不输入
<CODE>http://</CODE>,浏览器也会在地址栏的这部分加上。第一部分,即
<CODE>http://</CODE>,是关于如何通信的很直观的线索:通过超文本传输协议
HTTP。在网页中编写代码与服务器通信时,无论使用 Ajax 还是普通的表单 POST,甚至超链接,打交道的都是 HTTP。</P>
<TABLE cellSpacing=0 cellPadding=0 width="40%" align=right
border=0><TBODY>
<TR>
<TD width=10><IMG height=1 alt=""
src="掌握 Ajax,第 7 部分 在请求和响应中使用 XML.files/c.gif" width=10></TD>
<TD>
<TABLE cellSpacing=0 cellPadding=5 width="100%" border=1>
<TBODY>
<TR>
<TD bgColor=#eeeeee><A name=sidebar1><B>HTTPS:仍然是
HTTP</B></A><BR>
<P>那些刚接触 Web 的人可能对
<CODE>https://intranet.nextel.com</CODE> 这样的 URL
感到奇怪。<CODE>https</CODE> 表示安全的 HTTP,只是使用了比一般 Web 请求更安全的
HTTP 协议形式。因此即便是 HTTPS,实际上用的仍然是
HTTP,虽然增加了某些安全层来挡住那些好奇的眼睛。</P></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<P>既然浏览器和服务器之间的所有 Web 通信都通过 HTTP 进行,认为 XML 是
<CODE>XMLHttpRequest</CODE> 幕后所用的某种传输技术的想法就毫无道理了。当然在 HTTP
请求<I>中</I>可以发送 XML,但是 HTTP 是一个精确定义的协议,短时间内不可能消失。除了在请求中明确使用
XML,或者服务器用 XML 发送响应之外,<CODE>XMLHttpRequest</CODE> 对象使用的只是普普通通的
HTTP。因此,当再有人对您说 “哦,称为 <CODE>XMLHttpRequest</CODE> 是因为在幕后使用 XML”
的时候,您最好一笑了之,并耐心地解释什么是 HTTP,告诉他们虽然 XML 可以<I>通过</I> HTTP 发送,但 XML
是一种数据格式而不是传输协议。通过这样的讨论,加深对它的理解。</P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><IMG height=1 alt=""
src="掌握 Ajax,第 7 部分 在请求和响应中使用 XML.files/blue_rule.gif"
width="100%"><BR><IMG height=6 alt=""
src="掌握 Ajax,第 7 部分 在请求和响应中使用 XML.files/c.gif" width=8
border=0></TD></TR></TBODY></TABLE>
<TABLE class=no-print cellSpacing=0 cellPadding=0 align=right>
<TBODY>
<TR align=right>
<TD><IMG height=4 alt=""
src="掌握 Ajax,第 7 部分 在请求和响应中使用 XML.files/c.gif"
width="100%"><BR>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD vAlign=center><IMG height=16 alt=""
src="掌握 Ajax,第 7 部分 在请求和响应中使用 XML.files/u_bold.gif"
width=16 border=0><BR></TD>
<TD vAlign=top align=right><A class=fbox
href="http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro7.html#main"><B>回页首</B></A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR><BR>
<P><A name=2><SPAN class=atitle>使用 XML(真正)</SPAN></A></P>
<P>到目前为止,我说的只是 Ajax 在哪些地方<I>不</I>使用 XML。但 Ajax 中的 <I>x</I> 和
<CODE>XMLHttpRequest</CODE> 中的 <CODE>XML</CODE> 仍然有其实际意义,在 Web
应用程序中使用 XML 有多种选择。这一节将讨论基本的选择,剩下的部分再深入探讨细节问题。</P>
<P><A name=2.1><SPAN class=smalltitle>XML 选项</SPAN></A></P>
<P>在异步应用程序中 XML 有两种基本的用法:</P>
<UL>
<LI>以 XML 格式从网页向服务器发送请求
<LI>以 XML 格式在网页中从服务器接收请求 </LI></UL>
<P>其中第一种用法,即用 XML 发送请求,需要将请求的格式设置为 XML,可以使用 API
来完成,也可以与文本连成字符串,然后将结果发送到服务器。按照这种思路,主要的任务就是通过既符合 XML
规则又能被服务器理解的方式构造请求。因此这里的关键实际上是 XML 格式,得到需要发送的数据之后,只需要用 XML
语法将其包装起来。本文后面讨论 XML 在 Ajax 应用程序中的这种用法。</P>
<P>第二种用法,即用 XML 接收请求,需要从服务器上接收响应,然后从 XML 提取数据(同样,可以用 API
或者采用蛮力方法)。这种情况下,关键在于来自服务器的数据,而您恰好需要从 XML
中提取这些数据以便使用。这是本系列下一期文章的主题,到那时候我们再详加讨论。</P>
<P><A name=2.2><SPAN class=smalltitle>一点忠告</SPAN></A></P>
<P>再详细讨论使用 XML 的细节之前,首先给您一句忠告:XML
不是一种简洁、快速和节省空间的格式。在后面几节以及本系列的下一期文章中将看到,在上下文中使用 XML 确实有一些很好的理由,XML
与普通文本的请求和响应(特别是响应)相比也确实有一些长处。但是,和普通文本相比,XML
通常总会占用更多的空间,速度也更慢,因为需要在消息中增加 XML 所需要的标签和语义。</P>
<P>如果需要编写速度很快、看起来像桌面应用的程序,XML 可能不是最佳选择。如果从普通文本开始,然后发现确实需要
XML,那么就使用它;但是如果从一开始就使用 XML,基本上可以肯定一定会降低应用程序的响应性。多数情况下,与将文本转化成下面这种
XML 相比,发送普通文本会更快一些(使用类似 <CODE>name=jennifer</CODE> 的名/值对):</P>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode><name>jennifer</name>
</PRE></TD></TR></TBODY></TABLE><BR>
<P>看看哪些地方使 XML 增加了处理时间:将文本包装成 XML;发送额外信息(要注意我没有包含任何包围元素、XML
头或者可能出现在实际请求中的其他任何内容);让服务器解析 XML、生成响应、用 XML
包装响应,并将它发送<I>回</I>网页;让网页解析响应,最后使用它。因此要清楚什么时候使用
XML,不要一开始就认为它在很多情况下都能够加快应用程序;但,它可以增强灵活性,这就是我们现在要讨论的。</P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><IMG height=1 alt=""
src="掌握 Ajax,第 7 部分 在请求和响应中使用 XML.files/blue_rule.gif"
width="100%"><BR><IMG height=6 alt=""
src="掌握 Ajax,第 7 部分 在请求和响应中使用 XML.files/c.gif" width=8
border=0></TD></TR></TBODY></TABLE>
<TABLE class=no-print cellSpacing=0 cellPadding=0 align=right>
<TBODY>
<TR align=right>
<TD><IMG height=4 alt=""
src="掌握 Ajax,第 7 部分 在请求和响应中使用 XML.files/c.gif"
width="100%"><BR>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD vAlign=center><IMG height=16 alt=""
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -