??xml version="1.0" encoding="utf-8" standalone="yes"?>精品国产成人亚洲午夜福利,亚洲国产精品高清久久久,亚洲狠狠色丁香婷婷综合http://www.tkk7.com/hua/category/12540.html即世界明天毁灭Q我也要在今天种下我的葡萄树?zh-cnWed, 25 Apr 2007 18:31:31 GMTWed, 25 Apr 2007 18:31:31 GMT60直接telnet 25端口发邮?/title><link>http://www.tkk7.com/hua/archive/2007/04/24/113200.html</link><dc:creator>?/dc:creator><author>?/author><pubDate>Tue, 24 Apr 2007 07:43:00 GMT</pubDate><guid>http://www.tkk7.com/hua/archive/2007/04/24/113200.html</guid><wfw:comment>http://www.tkk7.com/hua/comments/113200.html</wfw:comment><comments>http://www.tkk7.com/hua/archive/2007/04/24/113200.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/hua/comments/commentRss/113200.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/hua/services/trackbacks/113200.html</trackback:ping><description><![CDATA[<p>Q)可以自己写个E序发邮件咯。用jmail控g也行?br>下次说telnet上收邮gQ可以做邮g到达提醒。:Q偶们的oa里用得到哦?br><br>使用以下命o启动 TELNET 会话Q?br>Telnet xxx.xxx.xxx.xxx 25<br>如果正常Q您会看到以下来自 IMC 的响应:<br>       220 site.company.com Microsoft Exchange Internet Mail<br>       Connector 4.0.xxx.xx<br><br>其中Qxxx.xx ?nbsp;RTM ?nbsp;837.3Q对 SP1 ?nbsp;838.14?br><br>键入以下命o开始进行通讯Q?br>HELO test.company.com<br>您应看到如下响应Q?br>       250 OK<br><br>键入以下命o来通知 IMC 邮g源于何处Q?br>MAIL FROM:Admin@test.company.com<br>您应得到如下响应Q?br>       250 OK - MAIL FROM <[email]Admin@test.company.com[/email]><br><br>键入以下命o来通知 IMC 邮g的目标地址Q用一个有效的 Microsoft Exchange 收g?nbsp;SMTP 地址Q?br>RCPT TO:<[email]User@Site.Domain.Com[/email]><br>您应看到如下响应Q?br>       250 OK - Recipient <[email]User@Site.Domain.Com[/email]><br><br>键入以下命o以通知 IMC 您已准备好发送数据:<br>DATA<br>您应看到如下响应Q?br>       354 Send data.  End with CRLF.CRLF<br><br>键入以下命o以添加主题行Q?br>Subject: test message<br><br>然后按两?nbsp;Enter 键?br><br>该命令看不到M响应?br><br>备注Q?nbsp;两个 Enter 命oW合 RFC 822 规则Q即 822 命o后必跟I?br><br><br>键入以下命o来添加邮件正文:<br>This is a test message<br>您将看不到来自该命o的响应?br><br><br>在紧接着的空行处键入句号Q然后按 ENTER 键?br><br>您应看到如下响应Q?br>       250 OK<br><br>键入以下命o以关闭连接:<br>QUIT<br>您应看到如下响应Q?br>221 closing connection<br><br>对于上述M命oQ如果您收到“500 Command not recognized”错误消息Q则表明׃语法错误或无效的命oD IMC 无法识别您所键入的内宏V?br><br>dq入您在上述步骤 4 中选择的邮件收件h?nbsp;Microsoft Exchange 客户邮箱?nbsp;如果邮箱中有您的试邮gQ说明传?nbsp;IMC 通讯工作正常?br><br>如果应用E序事g日志昄M错误消息Q或在接攉件时出现问题Q请查配|或C机的通讯?/p> <div id="qeq4444" class=summary> <h2>概要</h2> 本文介绍如何 telnet 到运行简单邮件传输协?nbsp;(SMTP) 服务的计机上的端口 25Q以解决 SMTP 通信问题。默认情况下QSMTP 侦听端口 25?br><br>您可以根据您遇到的问题类型选用以下适当的疑难解{步骤。例如,如果您在两台 Microsoft Exchange 2000 Server 服务器之间通过 SMTP 发送邮件时遇到问题Q则可以通过在发送服务器上?nbsp;Telnet q接到目标服务器上的端口 25 来测?nbsp;SMTP q接。或者,如果您在接收来自 Internet ?nbsp;SMTP 邮g旉到问题,则可以按照本文中列出的步骤,试ȝ?nbsp;Internet 上但不在您的|络上的L与您?nbsp;SMTP 服务器的q接?br></div> <div id="g26wck4" class=moreinformation> <h2>更多信息</h2> Microsoft 产品U中?nbsp;SMTP 的多个不同变体。Microsoft Windows 产品U的 SMTP 服务包含?nbsp;Internet 信息服务 (IIS) 中,而在 Microsoft Windows NT Server 4.0 中,SMTP 服务包含?nbsp;Option Pack 中。在较新版本?nbsp;Windows 中,IIS 已被集成到操作系l中Qƈ且您可以使用“控制面板”中的“d或删除程?#8221;d IIS。此外,Exchange 2000 ?nbsp;Microsoft Exchange Server 2003 都?nbsp;IIS 中的现有 SMTP 服务及其他功能。Microsoft Exchange Server 版本 4.0?.0 ?nbsp;5.5 均包含它们自q SMTP 版本Q所采用的Ş式ؓ Internet Mail Connector (IMC) ?nbsp;Internet Mail Service (IMS)?br><br><strong>注意</strong>Q在 Exchange 5.0 及更高版本中QInternet Mail Connector (IMC) 被重命名?nbsp;Internet Mail Service?br><br>在启?nbsp;Telnet 会话之前Q必d有要此试邮g发送到的目标用L完整 SMTP 电子邮g地址。该电子邮g地址必须采用以下格式Q?nbsp; <p class=indent><var>User@Site.Domain.com</var></p> 您也可以hq行 SMTP 服务的服务器计算机的完全限定域名 (FQDN) ?nbsp;IP 地址Q例如,10.120.159.1Q。如果服务器在您的组l中Q您可能已经拥有q些信息。如果服务器是外部服务器Q查找这些信息最单的Ҏ是?nbsp;Nslookup.exe 以找到包含这些信息的 DNS 记录?nbsp;有关 NSlookup 的其他信息,请单M面的文章~号Q以查看 Microsoft 知识库中相应的文章:  <p class=indent><a class=KBlink ><font color=#0000ff><u>200525</u></font></a> 使用 NSlookup.exe</p> 有关如何获取 Internet 邮g交换器记录的其他信息Q请单击下面的文章编P以查?nbsp;Microsoft 知识库中相应的文章:  <p class=indent><a class=KBlink ><font color=#0000ff><u>203204</u></font></a> XFORQ如何获?nbsp;Internet 邮g交换器记?/p> <br>保q行 SMTP 服务的服务器上已启动 SMTP。要试 SMTP 是否已启动,您可以运行本文中列出的基本测试,q证您是否会收到来自远E服务器?nbsp;220 消息。这q将验证 SMTP 是否正在q行?br><br><strong>注意Q?/strong>  <ul> <li>有些 Telnet 应用E序要求您打开本地回显功能Q以查看键入的命令。要?nbsp;Microsoft Telnet 会话中执行此操作Q请在命令提C符处键?nbsp;<kbd><font face=新宋?set local_echo</font></kbd>?nbsp; <li>?nbsp;Microsoft Windows XP 中,应键?nbsp;<kbd><font face=新宋?set localecho</font></kbd> 而不?nbsp;<kbd><font face=新宋?set local_echo</font></kbd>?nbsp; </li> </ul> <h3>基本试</h3> 按照下列步骤操作Q以保L和远E?nbsp;SMTP 服务器能够通信。如果在您键入以下Q一命o之后Q收C下错误信息,则说?nbsp;SMTP 服务器因法错误或命o错误而无法识别您所键入的内容:<br> <div id="6y4wm4m" class=errormsg>500 Command not recognized</div> 查该命oq再ơ键入它Q或者验证您是否正在?nbsp;Microsoft SMTP 服务器直接通信?br><br><strong>注意</strong>QMicrosoft Telnet 不允许您使用 Backspace 键。如果在键入时出错,必须?nbsp;Enter 键,然后开始键入新的命令?br><br>在以下步骤中Q您要从命o行中q行 Telnet。要打开命o行,请单?#8220;开?#8221;Q单?#8220;q行”Q在“打开”框中键入 <kbd><font face=新宋?cmd</font></kbd>Q然后单?#8220;定”?nbsp; <ol class=dec> <li>您可以通过使用以下格式?nbsp;Telnet 命o来启?nbsp;Telnet 会话Q?br><br><strong>注意</strong>Q在键入每行内容之后?nbsp;Enter 键?nbsp; <p class=indent><kbd><font face=新宋?telnet <var>服务器名</var><var>端口?/var></font></kbd></p> 例如Q键入:  <p class=indent><kbd><font face=新宋?telnet <var>mail.contoso.com</var> <var>25</var></font></kbd></p> <font face="宋体, MS Song"><strong>注意</strong>Q您可以?var>服务器名</var> 替换为您要连接到?nbsp;SMTP 服务器的 IP 地址?nbsp;FQDN。记住在键入每个命o之后?nbsp;<strong class=uiterm>Enter</strong> 键?br><br>如果该命令v作用Q您会收到来自 SMTP 服务器的cM以下内容的消息:</font>  <p class=indent>?/P></p> <pre class=in_text>220 site.contoso.com Microsoft Exchange Internet Mail Connector <IMC 的版本号> </pre> <strong>注意</strong>Q由于有许多不同版本?nbsp;Microsoft SMTP 或第三方 SMTP 服务器,因此您可能会收到来自接收服务器的不同的消息。不q,您肯定会收到包含服务器的 FQDN ?nbsp;SMTP 的版本的 220 消息。此外,所有版本的 Microsoft SMTP ?nbsp;220 消息中都包含“Microsoft”一词?nbsp; <li>通过键入以下命o开始通信Q?nbsp; <p class=indent><kbd><font face=新宋?EHLO <var>test.com</var></font></kbd></p> <strong>注意</strong>Q您可以使用 HELO 命oQ但?nbsp;EHLO 是扩?nbsp;SMTP 动词集中的一个动词,SMTP 的所有当?nbsp;Microsoft 实现都支持该动词集。除非您认ؓ扩展 SMTP 动词有问题,否则最好?nbsp;EHLO?br><br>如果该命令成功,您会收到以下消息Q?nbsp; <p class=indent>?/P></p> <pre class=in_text>250 OK </pre> <li>键入以下命o向接?nbsp;SMTP 服务器通知邮g发g人:  <p class=indent><kbd><font face=新宋?MAIL FROM:<var>Admin@test.com</var></font></kbd></p> <strong>注意</strong>Q该地址可以是您想用的M SMTP 地址Q但是最好考虑以下问题Q?nbsp; <ol class=alpha> <li>有些 SMTP 邮gpȝ会基?nbsp;MAIL FROM:地址{选邮Ӟq且会禁止某?nbsp;IP 地址q接?nbsp;SMTP 邮gpȝQ或者如果连?nbsp;IP 地址?nbsp;SMTP 邮gpȝ所在的域不匚wQ它q会止该地址?nbsp;SMTP 邮gpȝ发送电子邮件。在本例中,该域?nbsp;<var>test.com</var>?nbsp; <li>如果您在发送邮件时没有使用有效的电子邮件地址Q您无法确定在发送邮件时是否有问题,因ؓ未送达报告 (NDR) 无法到达无效?nbsp;IP 地址。如果您使用有效的电子邮件地址Q您会收到来自 SMTP 服务器的以下消息Q?nbsp; <p class=indent>?/P></p> <pre class=in_text>250 OK - MAIL FROM Admin@test.com </pre> </li> </ol> <li>键入以下命o向接?nbsp;SMTP 服务器通知邮g的收件h?br><br><strong>注意</strong>Q最好始l用要发送到的域中的有效收g?nbsp;SMTP 地址。例如,如果您要发送到 <var>john@domain.com</var>Q必ȝ保域中存?nbsp;<var>john@domain.com</var>。否则,您会收到 NDR?br><br>使用您要发送到的h员的 SMTP 地址键入以下命oQ?nbsp; <p class=indent><kbd><font face=新宋?RCPT TO:<var>User@Domain.Com</var></font></kbd></p> 您会收到以下消息Q?nbsp; <p class=indent>?/P></p> <pre class=in_text>250 OK - Recipient User@ Domain.Com </pre> <li>键入以下命o通知 SMTP 服务器您已准备好发送数据:  <p class=indent><kbd><font face=新宋?DATA</font></kbd></p> 您会收到以下消息Q?nbsp; <pre>354 Send data. End with CRLF.CRLF </pre> <li>您现在已可以开始键入邮件的 822/2822 部分。用户将会在他们的收件箱中看到邮件的q一部分。键入以下命令以d主题行:  <p class=indent><kbd><font face=新宋?Subject:<var>test message</var></font></kbd></p> 按两?nbsp;Enter 键。此命o不会昄M信息?br><br><strong>注意</strong>Q按两次 Enter 键ؓ了与 Request for Comments (RFC) 822 ?nbsp;2822 保持一致。它规定 822 命o后面必须跟一个空行?nbsp; <li>键入以下命o以添加邮件正文:  <p class=indent><kbd><font face=新宋?This is a test message you will not see a response from this command.</font></kbd></p> <li>在下一个空行中键入英文句点 (.)Q然后按 Enter 键。您会收C下消息:  <p class=indent>?/P></p> <pre class=in_text>250 OK </pre> <li>键入以下命o关闭q接Q?nbsp; <p class=indent><kbd><font face=新宋?QUIT</font></kbd></p> 您会收到以下消息Q?nbsp; <p class=indent>?/P></p> <pre class=in_text>221 closing connection </pre> <li>验证收g人是否收到您发送的消息。如果在应用E序事g日志中出CQ何错误事件消息,或者接攉件时出现问题Q请查主机的配置或通信?nbsp; </li> </ol> <h3>高񔋹试</h3> 除本文前面列出的基本试步骤外,您还可以使用送达回执寚w件进行双向测试。您可以使用此方法验?nbsp;SMTP 服务器是否可以接受入站连接,q且为发件h生成一个送达回执以测?nbsp;SMTP 服务器的出站q接?br><br>要ؓ试邮gh送达回执Q请参见本文“基本试”一节的W?nbsp;4 步,以确保提供的信息是可以接攉达回执的有效电子邮件地址。然后在本文“基本试”一节的W?nbsp;5 步中Q在 Telnet 会话中键入以下命?/div> <img src ="http://www.tkk7.com/hua/aggbug/113200.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/hua/" target="_blank">?/a> 2007-04-24 15:43 <a href="http://www.tkk7.com/hua/archive/2007/04/24/113200.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>掌握 AjaxQ第 1 部分: Ajax ?/title><link>http://www.tkk7.com/hua/archive/2006/07/28/60574.html</link><dc:creator>?/dc:creator><author>?/author><pubDate>Fri, 28 Jul 2006 07:13:00 GMT</pubDate><guid>http://www.tkk7.com/hua/archive/2006/07/28/60574.html</guid><wfw:comment>http://www.tkk7.com/hua/comments/60574.html</wfw:comment><comments>http://www.tkk7.com/hua/archive/2006/07/28/60574.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/hua/comments/commentRss/60574.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/hua/services/trackbacks/60574.html</trackback:ping><description><![CDATA[ <p>五年前,如果不知?XMLQ您是一只无人重视的丑小鸭。十八个月前QRuby 成了x的中心,不知?Ruby 的程序员只能坐冷板凳了?今天Q如果想跟上最新的技术时,那您的目标就?Ajax?/p> <p>但是QAjax ?i>仅仅</i> 是一U时,它是一U构建网站的强大ҎQ而且不像学习一U全新的语言那样困难?/p> <p>但在详细探讨 Ajax 是什么之前,先让我们花几分钟了解 Ajax <i>?/i> 什么。目前,~写应用E序时有两种基本的选择Q?/p> <ul> <li>桌面应用E序 </li> <li>Web 应用E序 </li> </ul> <p>两者是cM的,桌面应用E序通常?CD Z质(有时候可从网站下载)q完全安装到您的计算Z。桌面应用程序可能用互联网下蝲?斎ͼ但运行这些应用程序的代码在桌面计机上。Web 应用E序q行在某处的 Web 服务器上 —?毫不奇怪,要通过 Web 览器访问这U应 用程序?/p> <p>不过Q比q些应用E序的运行代码放在何处更重要的是Q应用程序如何运转以及如何与其进行交互。桌面应用程序一般很快(在您的计算 Zq行Q不用等待互联网q接Q,h漂亮的用L面(通常和操作系l有养I和非凡的动态性。可以单凅R选择、输入、打开菜单和子?单、到处E游,基本上不需要等待?/p> <p>另一斚wQWeb 应用E序是最新的潮流Q它们提供了在桌面上不能实现的服务(比如 Amazon.com ?eBayQ。但是,伴随着 Web 的强大?出现的是{待Q等待服务器响应Q等待屏q刷斎ͼ{待hq回和生成新的页面?/p> <p>昄q样说过于简略了Q但基本的概念就是如此。您可能已经猜到QAjax 试建立桌面应用E序的功能和交互性,与不断更新的 Web 应用 E序之间的桥梁。可以用像桌面应用E序中常见的动态用L面和漂亮的控Ӟ不过是在 Web 应用E序中?/p> <p>q等什么呢Q我们来看看 Ajax 如何笨拙的 Web 界面转化成能q速响应的 Ajax 应用E序吧?/p> <p> <a name="N10098"> <span id="ym2gkuc" class="atitle">老技术,新技?/span> </a> </p> <p>在谈?Ajax Ӟ实际上涉及到多种技术,要灵zdq用它必L入了解这些不同的技术(本系列的头几文章将分别讨论q些技术)。好 消息是您可能已经非常熟悉其中的大部分技术,更好的是q些技术都很容易学习,q不像完整的~程语言Q如 Java ?RubyQ那样困难?/p> <table cellspacing="0" cellpadding="0" width="40%" align="right" border="0"> <tbody> <tr> <td width="10"> <img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" /> </td> <td> <table cellspacing="0" cellpadding="5" width="100%" border="1"> <tbody> <tr> <td bgcolor="#eeeeee"> <a name="N100A3"> <b>Ajax 的定?/b> </a> <br /> <p>Z说一下,Ajax ?Asynchronous JavaScript and XMLQ以?DHTML {)的羃写。这个短语是 Adaptive Path ?Jesse James Garrett 发明的(请参?<a >参考资?/a>Q,按照 Jesse 的解释,q?i>不是</i> 个首字母~写词?/p> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <p>下面?Ajax 应用E序所用到的基本技术:</p> <ul> <li>HTML 用于建立 Web 表单q确定应用程序其他部分用的字段? </li> <li>JavaScript 代码是运?Ajax 应用E序的核心代码,帮助改进与服务器应用E序的通信? </li> <li>DHTML ?Dynamic HTMLQ用于动态更新表单。我们将使用 <code>div</code>?code>span</code> 和其他动?HTML 元素来标?HTML? </li> <li>文档对象模型 DOM 用于Q通过 JavaScript 代码Q处?HTML l构和(某些情况下)服务器返回的 XML?</li> </ul> <p>我们来进一步分析这些技术的职责。以后的文章中我深入讨些技术,目前只要熟悉q些lg和技术就可以了。对q些代码熟悉,?容易从对这些技术的零散了解转变到真正把握这些技术(同时也真正打开?Web 应用E序开发的大门Q?/p> <p> <a name="N100D0"> <span id="644w426" class="smalltitle">XMLHttpRequest 对象</span> </a> </p> <p>要了解的一个对象可能对您来说也是最陌生的,?<code>XMLHttpRequest</code>。这是一?JavaScript 对象Q创对象很简单,?a >清单 1</a> 所C?/p> <br /> <a name="code1"> <b>清单 1. 创徏新的 XMLHttpRequest 对象</b> </a> <br /> <table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"> <tbody> <tr> <td> <pre> <code class="section"> <script language="javascript" type="text/javascript"> var xmlHttp = new XMLHttpRequest(); </script> </code> </pre> </td> </tr> </tbody> </table> <br /> <p>下一期文章中进一步讨个对象,现在要知道这是处理所有服务器通信的对象。l阅M前,先停下来想一惻I通过 <code>XMLHttpRequest</code> 对象与服务器q行对话的是 <i>JavaScript</i> 技术。这不是一般的应用E序,q恰恰是 Ajax 的强大功?的来源?/p> <p>在一般的 Web 应用E序中,用户填写表单字段q单?<i>Submit</i> 按钮。然后整个表单发送到服务器,服务器将它{发给处理表单的脚 本(通常?PHP ?JavaQ也可能?CGI q程或者类似的东西Q,脚本执行完成后再发送回全新的页面。该面可能是带有已l填充某些数?的新表单?HTMLQ也可能是确认页面,或者是hҎ原来表单中输入数据选择的某些选项的页面。当Ӟ在服务器上的脚本或程序处理和q?回新表单时用户必ȝ待。屏q变成一片空白,{到服务器返回数据后再重新绘制。这是交互性差的原因,用户得不到立卛_馈,因此感觉 不同于桌面应用程序?/p> <p>Ajax 基本上就是把 JavaScript 技术和 <code>XMLHttpRequest</code> 对象攑֜ Web 表单和服务器<i>之间</i>。当用户填写表单Ӟ?据发送给一?JavaScript 代码?i>不是</i> 直接发送给服务器。相反,JavaScript 代码捕获表单数据q向服务器发送请求。同时用户屏q?上的表单也不会闪烁、消失或延迟。换句话_JavaScript 代码在幕后发送请求,用户甚至不知道请求的发出。更好的是,h是异步发送的 Q就是说 JavaScript 代码Q和用户Q不用等待服务器的响应。因此用户可以l输入数据、滚动屏q和使用应用E序?/p> <p>然后Q服务器数据返?JavaScript 代码Q仍然在 Web 表单中)Q后者决定如何处理这些数据。它可以q速更新表单数据,让h感觉?用程序是立即完成的,表单没有提交或刷新而用户得C新数据。JavaScript 代码甚至可以Ҏ到的数据执行某种计算Q再发送另一个请求, 完全不需要用户干预!q就?<code>XMLHttpRequest</code> 的强大之处。它可以Ҏ需要自行与服务器进行交互,用户甚至可以完全不知?q后发生的一切。结果就是类g桌面应用E序的动态、快速响应、高交互性的体验Q但是背后又拥有互联|的全部强大力量?/p> <p> <a name="N1010E"> <span id="224kec4" class="smalltitle">加入一?JavaScript</span> </a> </p> <p>得到 <code>XMLHttpRequest</code> 的句柄后Q其他的 JavaScript 代码非常简单了。事实上Q我们将使用 JavaScript 代码完成非常 基本的Q务:</p> <ul> <li>获取表单数据QJavaScript 代码很容易从 HTML 表单中抽取数据ƈ发送到服务器? </li> <li>修改表单上的数据Q更新表单也很简单,从设|字D值到q速替换图像? </li> <li>解析 HTML ?XMLQ?JavaScript 代码操纵 DOMQ请参阅 <a >下一?/a>Q,处理 HTML 表单服务器返回的 XML 数据?l构?</li> </ul> <p>对于前两点,需要非常熟?<code>getElementById()</code> ҎQ如 <a >清单 2</a> 所C?/p> <br /> <a name="code2"> <b>清单 2. ?JavaScript 代码捕获和设|字D?/b> </a> <br /> <table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"> <tbody> <tr> <td> <pre> <code class="section"> // Get the value of the "phone" field and stuff it in a variable called phone var phone = document.getElementById("phone").value; // Set some values on a form using an array called response document.getElementById("order").value = response[0]; document.getElementById("address").value = response[1]; </code> </pre> </td> </tr> </tbody> </table> <br /> <p>q里没有特别需要注意的地方Q真是好极了Q您应该认识到这里ƈ没有非常复杂的东ѝ只要掌握了 <code>XMLHttpRequest</code>QAjax 应用E序的其他部分就是如 <a >清单 2</a> 所C的?JavaScript 代码了,混合有少量的 HTML。同Ӟq要用一点儿 DOM Q我们就来看看吧?/p> <p> <a name="dom"> <span id="46wm4gs" class="smalltitle">?DOM l束</span> </a> </p> <p>最后还?DOMQ即文档对象模型。可能对有些读者来?DOM 有点儿o人生畏,HTML 设计者很用它Q即?JavaScript E序员也不大?到它Q除非要完成某项高端~程d。大量?DOM ?i>?/i> 复杂?Java ?C/C++ E序Q这可能是 DOM 被认为难以学习的原因?</p> <p>q运的是Q在 JavaScript 技术中使用 DOM 很容易,也非常直观。现在,按照常规也许应该说明如何使用 DOMQ或者至要l出一些示?代码Q但q样做也可能误导您。即使不理会 DOMQ仍然能深入地探?AjaxQ这也是我准备采用的Ҏ。以后的文章再ơ讨?DOMQ现在只?知道可能需?DOM 可以了。当需要在 JavaScript 代码和服务器之间传?XML 和改?HTML 表单的时候,我们再深入研I?DOM。没有它?能做一些有的工作Q因此现在就?DOM 攑ֈ一边吧?/p> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td> <img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /> <br /> <img height="6" alt="" src="http://www.ibm.com/i/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="http://www.ibm.com/i/c.gif" width="100%" /> <br /> <table cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td valign="center"> <img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /> <br /> </td> <td valign="top" align="right"> <a class="fbox" > <b> </b> </a> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p> <a name="N10158"> <span id="qy2aki2" class="atitle">获取 Request 对象</span> </a> </p> <p>有了上面的基知识后,我们来看看一些具体的例子?code>XMLHttpRequest</code> ?Ajax 应用E序的核心,而且对很多读者来说可?q比较陌生,我们׃q里开始吧。从 <a >清单 1</a> 可以看出Q创建和使用q个对象非常单,不是吗?{一{?/p> <p>q记得几q前的那些讨厌的览器战争吗Q没有一样东西在不同的浏览器上得到同Ll果。不您是否怿Q这些战争仍然在l箋Q虽?规模较小。但令h奇怪的是,<code>XMLHttpRequest</code> 成了q场战争的牺牲品之一。因此获?<code>XMLHttpRequest</code> 对象可能 需要采用不同的Ҏ。下面我详l地q行解释?/p> <p> <a name="N10174"> <span id="242s4k4" class="smalltitle">使用 Microsoft 览?/span> </a> </p> <p>Microsoft 览?Internet Explorer 使用 MSXML 解析器处?XMLQ可以通过 <a >参考资?/a> q一步了?MSXML Q。因此如果编写的 Ajax 应用E序要和 Internet Explorer 打交道,那么必须用一U特D的方式创徏对象?/p> <p>但ƈ不是q么单。根?Internet Explorer 中安装的 JavaScript 技术版本不同,MSXML 实际上有两种不同的版本,因此必须对这两种 情况分别~写代码。请参阅 <a >清单 3</a>Q其中的代码?Microsoft 览器上创徏了一?<code>XMLHttpRequest</code>?</p> <br /> <a name="code3"> <b>清单 3. ?Microsoft 览器上创徏 XMLHttpRequest 对象</b> </a> <br /> <table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"> <tbody> <tr> <td> <pre> <code class="section"> var xmlHttp = false; try { xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e2) { xmlHttp = false; } } </code> </pre> </td> </tr> </tbody> </table> <br /> <p>您对q些代码可能q不完全理解Q但没有关系。当本系列文章结束的时候,您将?JavaScript ~程、错误处理、条件编译等有更q了解 。现在只要牢牢记住其中的两行代码Q?/p> <p> <code>xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");</code> </p> <p>?/p> <p> <code>xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");</code>?/p> <p>q两行代码基本上是试使用一个版本的 MSXML 创徏对象Q如果失败则使用另一个版本创对象。不错吧Q如果都不成功,则将 <code>xmlHttp</code> 变量设ؓ falseQ告诉您的代码出C问题。如果出现这U情况,可能是因为安装了?Microsoft 览器,需要?不同的代码?/p> <p> <a name="N101AE"> <span id="g4442sy" class="smalltitle">处理 Mozilla 和非 Microsoft 览?/span> </a> </p> <p>如果选择的浏览器不是 Internet ExplorerQ或者ؓ?Microsoft 览器编写代码,需要用不同的代码。事实上是 <a >清单 1</a> 所C的一行简单代码:</p> <img src ="http://www.tkk7.com/hua/aggbug/60574.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/hua/" target="_blank">?/a> 2006-07-28 15:13 <a href="http://www.tkk7.com/hua/archive/2006/07/28/60574.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ajax?/title><link>http://www.tkk7.com/hua/archive/2006/07/28/60573.html</link><dc:creator>?/dc:creator><author>?/author><pubDate>Fri, 28 Jul 2006 07:09:00 GMT</pubDate><guid>http://www.tkk7.com/hua/archive/2006/07/28/60573.html</guid><wfw:comment>http://www.tkk7.com/hua/comments/60573.html</wfw:comment><comments>http://www.tkk7.com/hua/archive/2006/07/28/60573.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/hua/comments/commentRss/60573.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/hua/services/trackbacks/60573.html</trackback:ping><description><![CDATA[作ؓJ2EE开发h员,我们gl常x“后端机Ӟbackend mechanicsQ”。我们通常会忘讎ͼJ2EE的主要成功之处在Web应用E序斚wQ许多原因得h们喜Ƣ利用Web开发应用程序,但主要还是因为其易于部v的特点允许站点以可能低的成本拥有上百万的用戗遗憄是,在过dq中Q我们在后端投入了太多的旉Q而在使我们的Web用户界面对用戯然和响应灉|斚w却投入不? <p>  本文介绍一U方法,AjaxQ用它可以构徏更ؓ动态和响应更灵敏的Web应用E序。该Ҏ的关键在于对览器端的JavaScript、DHTML和与服务器异步通信的组合。本文也演示了启用这U方法是多么单:利用一个Ajax框架Q指DWRQ构造一个应用程序,它直接从览器与后端服务q行通信。如果用得当,q种强大的力量可以应用E序更加自然和响应灵敏,从而提升用L览体验?/p><p>  该应用程序中所使用的示例代码已打包为单独的WAR文gQ可供下载?/p><p><strong>?/strong></p><p>  术语Ajax用来描述一l技术,它ɋ览器可以ؓ用户提供更ؓ自然的浏览体验。在Ajax之前QWeb站点强制用户q入提交/{待/重新昄范例Q用L动作L与服务器的“思考时间”同步。Ajax提供与服务器异步通信的能力,从而用户从请?响应的@环中解脱出来。借助于AjaxQ可以在用户单击按钮Ӟ使用JavaScript和DHTML立即更新UIQƈ向服务器发出异步hQ以执行更新或查询数据库。当hq回Ӟ可以用JavaScript和CSS来相应地更新UIQ而不是刷新整个页面。最重要的是Q用L至不知道览器正在与服务器通信QWeb站点看v来是x响应的?/p><p>  虽然Ajax所需的基架构已经出现了一D|_但直到最q异步请求的真正威力才得到利用。能够拥有一个响应极其灵敏的Web站点实Ȁ动h心,因ؓ它最l允许开发h员和设计人员使用标准的HTML/CSS/JavaScript堆栈创徏“桌面风格的Qdesktop-likeQ”可用性?/p><p>  通常Q在J2EE中,开发h员过于关注服务和持久性层的开发,以至于用L面的可用性已l落后。在一个典型的J2EE开发周期中Q常怼听到q样的话Q“我们没有可投入UI的时间”或“不能用HTML实现”。但是,以下Web站点证明Q这些理由再也站不住脚了Q?/p><ul><li><a target="_blank">BackPack</a></li><li><a target="_blank">Google Suggest</a></li><li><a target="_blank">Google Maps</a></li><li><a target="_blank">PalmSphere</a></li></ul><p>  所有这些Web站点都告诉我们,Web应用E序不必完全依赖于从服务器重新蝲入页面来向用户呈现更攏V一切似乎就在瞬间发生。简而言之,在涉及到用户界面的响应灵敏度Ӟ基准讑־更高了?/p><p><strong>定义Ajax</strong></p><p>  Adaptive Path公司的Jesse James Garrettq样<a target="_blank">定义Ajax</a>Q?/p><p>  Ajax不是一U技术。实际上Q它由几U蓬勃发展的技术以新的强大方式l合而成。Ajax包含Q?/p><ul><li>Z<a target="_blank">XHTML</a>?a target="_blank">CSS</a>标准的表C; </li><li>使用<a target="_blank">Document Object Model</a>q行动态显C和交互Q? </li><li>使用XMLHttpRequest与服务器q行异步通信Q? </li><li>使用JavaScriptl定一切?</li></ul><p>  q非常好Q但Z么要以Ajax命名呢?其实术语Ajax是由Jesse James Garrett创造的Q他说它是“Asynchronous JavaScript + XML的简写”?/p><p><strong>Ajax的工作原?/strong></p><p>  Ajax的核心是JavaScript对象XmlHttpRequest。该对象在Internet Explorer 5中首ơ引入,它是一U支持异步请求的技术。简而言之,XmlHttpRequest使您可以使用JavaScript向服务器提出hq处理响应,而不d用户?/p><p>  在创建Web站点Ӟ在客L执行屏幕更新为用h供了很大的灵zL。下面是使用Ajax可以完成的功能:</p><ul><li>动态更新购物R的物品LQ无需用户单击Updateq等待服务器重新发送整个页面? </li><li>提升站点的性能Q这是通过减少从服务器下蝲的数据量而实现的。例如,在Amazon的购物R面Q当更新子中的一物品的数量Ӟ会重新蝲入整个页面,q必M?2K的数据。如果用Ajax计算新的总量Q服务器只会q回新的总量|因此所需的带宽仅为原来的癑ֈ之一? </li><li>消除了每ơ用戯入时的页面刷新。例如,在Ajax中,如果用户在分列表上单击NextQ则服务器数据只h列表而不是整个页面? </li><li>直接~辑表格数据Q而不是要求用户导航到新的面来编辑数据。对于AjaxQ当用户单击EditӞ可以静态表格刷Cؓ内容可编辑的表格。用户单击Done之后Q就可以发出一个Ajaxh来更新服务器Qƈh表格Q其包含静态、只ȝ数据?</li></ul><p>  一切皆有可能!但愿它能够激发您开始开发自qZAjax的站炏V然而,在开始之前,让我们介l一个现有的Web站点Q它遵@传统的提?{待/重新昄的范例,我们q将讨论Ajax如何提升用户体验?/p><p><strong>Ajax可用于那些场景?——一个例子:MSN Money面</strong></p><p>  前几天,在浏览MSN Money面的时候,有一?a target="_blank">关于房地产投资的文章</a>引v了我的好奇心。我军_使用站点的“Rate this article”(评h本文Q功能,鼓励其他的用戯一Ҏ间来阅读q篇文章。在我单击vote按钮q等待了一会儿之后Q整个页面被hQ在原来投票问题所在的地方出现了一个漂亮的感谢画面?/p><p><img height="63" src="http://dev2dev.bea.com.cn/images/051101/0511010101.jpg" width="303" /></p><p>  而Ajax能够使用L体验更加愉快Q它可以提供响应更加灉|的UIQƈ消除面h所带来的闪烁。目前,׃要刷新整个页面,需要传送大量的数据Q因为必重新发送整个页面。如果用AjaxQ服务器可以q回一个包含了感谢信息?00字节的消息,而不是发?6,813字节的消息来h整个面。即使用的是高速InternetQ传?6K?/2K的差别也非常大。同样重要的是,只需要刷C投票相关的一节Q而不是刷新整个屏q?/p><p>  让我们利用Ajax实现自己的基本投系l?/p><p><strong>原始的AjaxQ直接用XmlHttpRequest</strong></p><p>  如上所qͼAjax的核心是JavaScript对象XmlHttpRequest。下面的CZ文章评hpȝ带您熟悉Ajax的底层基本知识:<a target="_blank">http://tearesolutions.com/ajax-demo/raw-ajax.html</a>。注Q如果您已经在本地WebLogic容器中安装了<a >ajax-demo.war</a>Q可以导航到<a href="http://localhost:7001/ajax-demo/raw-ajax.html" target="_blank">http://localhost:7001/ajax-demo/raw-ajax.html</a>Q?/p><p>  览应用E序Q参与投,q亲眼看它如何运转。熟悉了该应用程序之后,l箋阅读Q进一步了解其工作原理l节?/p>  首先Q您拥有一些简单的定位Ҏ讎ͼ它连接到一个JavaScriptcastVote(rank)函数?<pre class="code">function castVote(rank) { var url = "/ajax-demo/static-article-ranking.html"; var callback = processAjaxResponse; executeXhr(callback, url); } </pre><p>  该函Cؓ您想要与之通信的服务器资源创徏一个URLq调用内部函数executeXhrQ提供一个回调JavaScript函数Q一旦服务器响应可用Q该函数p执行。由于我希望它运行在一个简单的Apache环境中,“cast vote URL”只是一个简单的HTML面。在实际情况中,被调用的URL记录票数ƈ动态地呈现包含投票L的响应?/p>  下一步是发出一个XmlHttpRequesthQ?<pre class="code">function executeXhr(callback, url) { // branch for native XMLHttpRequest object if (window.XMLHttpRequest) { req = new XMLHttpRequest(); req.onreadystatechange = callback; req.open("GET", url, true); req.send(null); } // branch for IE/Windows ActiveX version else if (window.ActiveXObject) { req = new ActiveXObject("Microsoft.XMLHTTP"); if (req) { req.onreadystatechange = callback; req.open("GET", url, true); req.send(); } } } </pre><p>  如您所见,执行一个XmlHttpRequestq不单,但非常直观。和q_一P在JavaScript领域Q大部分的工作量都花在确保浏览器兼容斚w。在q种情况下,首先要确定XmlHttpRequest是否可用。如果不能用Q很可能要用Internet ExplorerQ这样就要用所提供的ActiveX实现?/p><p>executeXhr()Ҏ中最关键的部分是q两行: </p><pre class="code">req.onreadystatechange = callback; req.open("GET", url, true); </pre><p>  W一行定义了JavaScript回调函数Q您希望一旦响应就l它p动执行,而req.open()Ҏ中所指定的“true”标志说明您惌异步执行该请求?/p>  一旦服务器处理完XmlHttpRequestq返回给览器,使用req.onreadystatechange指派所讄的回调方法将被自动调用?<pre class="code">function processAjaxResponse() { // only if req shows "loaded" if (req.readyState == 4) { // only if "OK" if (req.status == 200) { 502 502'votes').innerHTML = req.responseText; } else { alert("There was a problem retrieving the XML data: " + req.statusText); } } } </pre><p>  该代码相当简z,q且使用了几个敎ͼq得难以一下子看出发生了什么。ؓ了弄清楚q一点,下面的表|引用?a target="_blank">http://developer.apple.com/internet/webcontent/xmlhttpreq.html</a>Q列举了常用的XmlHttpRequest对象属性?/p><table cellspacing="1" cellpadding="0" width="80%" bgcolor="#cccccc" border="0"><tbody><tr bgcolor="#ffffff"><td height="22"><p><strong>属?/strong></p></td><td><p><strong>描述</strong></p></td></tr><tr bgcolor="#ffffff"><td valign="top" height="22"><p>onreadystatechange</p></td><td valign="top"><p>每次状态改变所触发事g的事件处理程?/p></td></tr><tr bgcolor="#ffffff"><td valign="top" height="22"><p>readyState</p></td><td valign="top"><p>对象状态| </p><ul><li>0 = 未初始化QuninitializedQ? </li><li>1 = 正在加蝲QloadingQ? </li><li>2 = 加蝲完毕QloadedQ? </li><li>3 = 交互QinteractiveQ? </li><li>4 = 完成QcompleteQ?</li></ul></td></tr><tr bgcolor="#ffffff"><td valign="top" height="22"><p>responseText</p></td><td valign="top"><p>从服务器q程q回的数据的字符串Ş?/p></td></tr><tr bgcolor="#ffffff"><td valign="top" height="22"><p>responseXML</p></td><td valign="top"><p>从服务器q程q回的DOM兼容的文档数据对?/p></td></tr><tr bgcolor="#ffffff"><td valign="top" height="22"><p>status</p></td><td valign="top"><p>从服务器q回的数字代码,比如404Q未扑ֈQ或200Q就l)</p></td></tr><tr bgcolor="#ffffff"><td valign="top" height="22"><p>statusText</p></td><td valign="top"><p>伴随状态码的字W串信息</p></td></tr></tbody></table><p>  现在processVoteResponse()函数开始显C出其意义了。它首先查XmlHttpRequest的整体状态以保证它已l完成(readyStatus == 4Q,然后Ҏ服务器的讑֮询问h状态。如果一切正常(status == 200Q?׃用innerHTML属性重写DOM的“votes”节点的内容?/p><p>  既然您亲眼看CXmlHttpRequest对象是如何工作的Q就让我们利用一个旨在简化JavaScript与Java应用E序之间的异步通信的框架来对具体的l节q行抽象?/p><p><strong>Ajax: DWR方式</strong></p><p>  按照与文章评Ll相同的程Q我们将使用Direct Web RemotingQDWRQ框架实现同L功能?/p><p>  假定文章和投结果存储在一个数据库中,使用某种对象/关系映射技术来完成抽取工作。ؓ了部|v来尽可能地简单,我们不会使用数据库进行持久性存储。此外,Z应用E序可能通用Q也不用Web框架。相反,应用E序从一个静态HTML文g开始,可以认ؓ它由服务器动态地呈现。除了这些简化措施,应用E序q应该用Spring Framework兌一切,以便L看出如何在一个“真实的”应用程序中使用DWR?/p><p>  现在应该下蝲CZ应用E序q熟悉它。该应用E序被压~ؓ标准的WAR文gQ因此您可以把它攄CQ何一个Web容器中——无需q行配置。部|完毕之后,可以导航到<a href="http://localhost:7001/ajax-demo/dwr-ajax.html" target="_blank">http://localhost:7001/ajax_demo/dwr-ajax.html</a>来运行程序?/p><p>  可以查看<a target="_blank">HTML 源代?/a>Q了解它如何工作。给人印象最q是,代码如此单——所有与服务器的交互都隐藏在JavaScript对象ajaxSampleSvc的后面。更加o人惊讶的是,ajaxSampleSvc服务不是由手工编写而是完全自动生成的!让我们l,看看q是如何做到的?/p><p><strong>引入DWR</strong></p><p>  如同在“原始的Ajax”一节所演示的那P直接使用XmlHttpRequest创徏异步h非常ȝ。不仅JavaScript代码冗长Q而且必须考虑服务器端为定位Ajaxh到适当的服务所需做的工作Qƈ结果封送到览器?/p><p>  设计DWR的目的是要处理将Web面安装到后端服务上所需的所有信息管道。它是一个Java框架Q可以很L地将它插入到Web应用E序中,以便JavaScript代码可以调用服务器上的服务。它甚至直接与Spring Framework集成Q从而允许用L接向Web客户机公开bean?/p><p>  DWR真正的y妙之处是Q在用户配置了要向客h公开的服务之后,它用反来生成JavaScript对象Q以便Web面能够使用q些对象来访问该服务。然后Web面只需接合到生成的JavaScript对象Q就像它们是直接使用服务一PDWR无缝地处理所有有关Ajax和请求定位的琐碎l节?/p><p>  让我们仔l分析一下示例代码,弄清它是如何工作的?/p><p><strong>应用E序l节QDWR分析</strong></p><p>  关于应用E序Q首先要注意的是Q它是一个标准的Java应用E序Q用分层架构(Layered ArchitectureQ设计模式。用DWR通过JavaScript公开一些服务ƈ不媄响您的设计?</p><p><img height="344" src="http://dev2dev.bea.com.cn/images/051101/0511010102.jpg" width="209" /></p><p>  下面是一个简单的Java服务Q我们将使用DWR框架直接其向JavaScript代码公开Q?/p><pre class="code">package com.tearesolutions.service; public interface AjaxSampleSvc { Article castVote(int rank); } </pre><p>  q是一个被化到几乎不可能的E度的例子,其中只有一文章可以投。该服务由Spring理Q它使用的bean名是ajaxSampleSvcQ它的持久性需求则依赖于ArticleDao。详情请参见applicationContext.xml?/p><p>  Z把该服务公开为JavaScript对象Q需要配|DWRQ添加dwr.xml文g到WEB-INF目录下: </p><pre class="code"><?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 0.4//EN" "http://www.getahead.ltd.uk/dwr/dwr.dtd"> <dwr> <allow> <create creator="spring" javascript="ajaxSampleSvc"> <param name="beanName" value="ajaxSampleSvc" /> </create> <convert converter="bean" match="com.tearesolutions.model.Article"/> <exclude method="toString"/> <exclude method="setArticleDao"/> </allow> </dwr> </pre><p>  dwr.xml文g告诉DWR哪些服务是要直接向JavaScript代码公开的。注意,已经要求公开Spring bean ajaxSampleSvc。DWR自动找到由应用E序讄的SpringApplicationContext。ؓ此,必须使用标准的servletqo器ContextLoaderListener来初始化Spring ApplicationContext?/p>  DWR被设|ؓ一个servletQ所以把它的定义d到web.xmlQ?<pre class="code"><?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <display-name>Ajax Examples</display-name> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <servlet> <servlet-name>ajax_sample</servlet-name> <servlet-class>com.tearesolutions.web.AjaxSampleServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet> <servlet-name>dwr-invoker</servlet-name> <display-name>DWR Servlet</display-name> <description>Direct Web Remoter Servlet</description> <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>ajax_sample</servlet-name> <url-pattern>/ajax_sample</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>dwr-invoker</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping> </web-app> </pre><p>  做完q些之后Q可以加?a href="http://localhost:7001/ajax-demo/dwr" target="_blank">http://localhost:7001/ajax-demo/dwr</a>Q看看哪些服务可用。结果如下:</p><p><img height="102" src="http://dev2dev.bea.com.cn/images/051101/0511010103.jpg" width="305" /></p><p>?. 可用的服?/p>  单击ajaxSampleSvc链接Q查看有兛_何在HTML面内直接用服务的CZ实现。其中包含的两个JavaScript文g完成了大部分的功能: <pre class="code"><script type='text/javascript' src='/ajax-demo/dwr/interface/ajaxSampleSvc.js'></script> <script type='text/javascript' src='/ajax-demo/dwr/engine.js'></script> </pre><p>ajaxSampleSvc.js是动态生成的Q?/p><pre class="code">function ajaxSampleSvc() { } ajaxSampleSvc.castVote = function(callback, p0) { DWREngine._execute(callback, '/ajax-demo/dwr', 'ajaxSampleSvc', 'castVote', p0); } </pre><p>  现在可以使用JavaScript对象ajaxSampleSvc替换所有的XmlHttpRequest代码Q从而重构raw-ajax.html文g。可以在dwr-ajax.html文g中看到改动的l果Q下面是新的JavaScript函数Q?/p><pre class="code">function castVote(rank) { ajaxSampleSvc.castVote(processResponse, rank); } function processResponse(data) { var voteText = "<p><strong>Thanks for Voting!</strong></p>" + "<p>Current ranking: " + data.voteAverage + " out of 5</p>" + "<p>Number of votes placed: " + data.numberOfVotes + "</p>"; 502 502'votes').innerHTML = voteText; } </pre><p>  惊h地简单,不是吗?由ajaxSampleSvc对象q回的Article域对象序列化Z个JavaScript对象Q允许在它上面调用诸如numberOfVotes()和voteAverage()之类的方法。在动态生成ƈ插入到DIV元素“votes”中的HTML代码内用这些数据?/p><p><strong>下一步工?/strong></p><p>   在后l文章中Q我l有关Ajax的话题,涉及下面q些斚wQ?/p><ul><li>Ajax最佛_?</li></ul><p>  像许多技术一PAjax是一把双刃剑。对于一些用例,其应用程序其实没有必要用AjaxQ用了反而有损可用性。我介l一些不适合使用的模式,H出说明Ajax的一些消极方面,q展CZ些有助于~和q些消极斚w的机制。例如,?a >Netflix电媄览?/a>来说QAjax是合适的解决Ҏ吗?或者,如何提示用户实Z一些问题,而再ơ单L钮也无济于事Q?/p><ul><li>理跨请求的状?</li></ul><p>  在用AjaxӞ最初的文档DOM会发生一些变化,q且有大量的面状态信息存储在客户端变量中。当用户跟踪一个链接到应用E序中的另一个页面时Q状态就丢失了。当用户按照惯例单击Back按钮Ӟ呈现l他们的是缓存中的初始页面。这会用户感到非常qhQ?/p><ul><li>调试技?</li></ul><p>  使用JavaScript在客L执行更多的工作时Q如果事情不按预期方式进行,需要一些调试工h帮助弄清出现了什么问题?/p><p><strong>l束?/strong></p><p>  本文介绍了AjaxҎQƈ展示了如何用它来创Z个动态且响应灉|的Web应用E序。通过使用DWR框架Q可以轻村֜把Ajax融合到站点中Q而无需担心所有必L行的实际道工作?/p><p>  特别感谢Getahead IT咨询公司的Joe Walker和他的团队开发出DWRq样奇的工兗感谢你们与世界׃n它!</p><p><strong>下蝲</strong></p><p>  本文中演C的应用E序源代码可供下载:<a target="_blank">ajax-demo.war</a>Q?.52 MBQ?/p><p><strong>参考资?/strong></p><ul><li><a target="_blank">http://www.getahead.ltd.uk/dwr</a>——Getahead IT咨询公司? </li><li>Jesse James Garrett所撰写的?a target="_blank">Ajax: A New Approach to Web Applications</a>”(Adaptive PathQ?005q二月)? </li><li>?a target="_blank">Dynamic HTML and XML: The XMLHttpRequest Object</a>”(Apple Developer ConnectionQ?</li></ul><p><strong>原文出处</strong></p><p>An Introduction To Ajax</p><p><a target="_blank">http://dev2dev.bea.com/pub/a/2005/08/ajax_introduction.html</a></p><!--文章其他信息--><img src ="http://www.tkk7.com/hua/aggbug/60573.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/hua/" target="_blank">?/a> 2006-07-28 15:09 <a href="http://www.tkk7.com/hua/archive/2006/07/28/60573.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://dslygc.com" target="_blank">ҰĻƵ</a>| <a href="http://xzdlgp.com" target="_blank">պaëƬƵ</a>| <a href="http://www-6209.com" target="_blank">¶ۺƵ</a>| <a href="http://k4h3.com" target="_blank">һƷһaһ</a>| <a href="http://cjsyw123.com" target="_blank">йƷһëƬѲ</a>| <a href="http://bisilover.com" target="_blank">ɫͼɫС˵</a>| <a href="http://xxxxnii.com" target="_blank">һ߹ۿ</a>| <a href="http://bjycxy88.com" target="_blank">ӰԺMV߹ۿƵ</a>| <a href="http://4001120002.com" target="_blank">Ļ߹ۿ</a>| <a href="http://yidazn.com" target="_blank">ާѡþþþƷ</a>| <a href="http://woaianli.com" target="_blank">ĻӰȫѰ</a>| <a href="http://meixiudashi.com" target="_blank">ɫۺ㽶</a>| <a href="http://www65axax.com" target="_blank">AVۺɫС˵ </a>| <a href="http://ttooyuyu.com" target="_blank">ëƬ18ŮëƬƵδ</a>| <a href="http://hhgcnet.com" target="_blank">ѸԴվƵ</a>| <a href="http://dbyssw.com" target="_blank">ŮƵ</a>| <a href="http://138site.com" target="_blank">޹˾þһWWW</a>| <a href="http://trgod.com" target="_blank">߹ۿhƬ</a>| <a href="http://1y3c.com" target="_blank">þòþüӰԺwwwձ þWWW˳ɡƬ </a>| <a href="http://5656ys.com" target="_blank">þþƷ뾫Ʒר</a>| <a href="http://sds54.com" target="_blank">AVպAVվ</a>| <a href="http://aplus178.com" target="_blank">޹Ѽһ</a>| <a href="http://http99.com" target="_blank">һɫƬ</a>| <a href="http://55xxb.com" target="_blank">avһ</a>| <a href="http://fshomppa.com" target="_blank">ŮҰbbwbbw</a>| <a href="http://pjwys.com" target="_blank">aһ</a>| <a href="http://www91pao.com" target="_blank">ĻþþƷ2021</a>| <a href="http://1777000.com" target="_blank">˾þþƷӰԺ</a>| <a href="http://199044.com" target="_blank">Ůڵվ</a>| <a href="http://fenglibin.com" target="_blank">91ѽ</a>| <a href="http://qdhengjun.com" target="_blank">aëƬ߹ۿ</a>| <a href="http://cjsyw123.com" target="_blank">һĻר</a>| <a href="http://ur5r2kr.com" target="_blank"> ŷ У԰</a>| <a href="http://onisterwines.com" target="_blank">޳߹ۿ</a>| <a href="http://tiantangapp.com" target="_blank">޹Ʒ˰</a>| <a href="http://www77714.com" target="_blank">߹ۿվ</a>| <a href="http://simupiao.com" target="_blank">߹ۿhƬ</a>| <a href="http://326h.com" target="_blank">ѹۿ㶮</a>| <a href="http://564ka.com" target="_blank">պ߹ۿƵ</a>| <a href="http://www44wawa.com" target="_blank">Ļ</a>| <a href="http://ylptt.com" target="_blank">Ƶһѹۿ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>