﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Kelven Cheung-文章分类-Ajax</title><link>http://www.blogjava.net/zhangrenquan/category/6018.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 15 Nov 2012 05:44:18 GMT</lastBuildDate><pubDate>Thu, 15 Nov 2012 05:44:18 GMT</pubDate><ttl>60</ttl><item><title>DWR让AJAX如此简单</title><link>http://www.blogjava.net/zhangrenquan/articles/162106.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Wed, 21 Nov 2007 07:48:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/162106.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/162106.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/162106.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/162106.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/162106.html</trackback:ping><description><![CDATA[<a href="http://www.java-ren.com/article/2007/9/27/2007927111512398.html">http://www.java-ren.com/article/2007/9/27/2007927111512398.html</a><img src ="http://www.blogjava.net/zhangrenquan/aggbug/162106.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2007-11-21 15:48 <a href="http://www.blogjava.net/zhangrenquan/articles/162106.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XMLHttpRequest对象池</title><link>http://www.blogjava.net/zhangrenquan/articles/81915.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Sat, 18 Nov 2006 05:38:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/81915.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/81915.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/81915.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/81915.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/81915.html</trackback:ping><description><![CDATA[<p>在ajax应用中，通常一个页面要同时发送多个请求，如果只有一个XMLHttpRequest对象，前面的请求还未完成，后面的就会把前面的覆盖掉，如果每次都创建一个新的XMLHttpRequest对象，也会造成浪费。解决的办法就是创建一个XMLHttpRequset的对象池，如果池里有空闲的对象，则使用此对象，否则将创建一个新的对象。</p>
		<p>下面是我最近写的一个简单的类：<br /><a id="more-85"></a></p>
		<div class="php_code">
				<span class="php_000000">
						<span class="php_0000BB">
						</span>
						<span class="php_FF8000">/**<br /> * XMLHttpRequest Object Pool<br /> *<br /> * @author    legend &lt;legendsky@hotmail.com&gt;<br /> * @link      http://www.ugia.cn/?p=85<br /> * @Copyright www.ugia.cn<br /> */ <br /><br /></span>
						<span class="php_007700">var </span>
						<span class="php_0000BB">XMLHttp </span>
						<span class="php_007700">= {<br />    </span>
						<span class="php_0000BB">_objPool</span>
						<span class="php_007700">: [],<br /><br />    </span>
						<span class="php_0000BB">_getInstance</span>
						<span class="php_007700">: function ()<br />    {<br />        for (var </span>
						<span class="php_0000BB">i </span>
						<span class="php_007700">= </span>
						<span class="php_0000BB">0</span>
						<span class="php_007700">; </span>
						<span class="php_0000BB">i </span>
						<span class="php_007700">&lt; </span>
						<span class="php_0000BB">this</span>
						<span class="php_007700">.</span>
						<span class="php_0000BB">_objPool</span>
						<span class="php_007700">.</span>
						<span class="php_0000BB">length</span>
						<span class="php_007700">; </span>
						<span class="php_0000BB">i </span>
						<span class="php_007700">++)<br />        {<br />            if (</span>
						<span class="php_0000BB">this</span>
						<span class="php_007700">.</span>
						<span class="php_0000BB">_objPool</span>
						<span class="php_007700">[</span>
						<span class="php_0000BB">i</span>
						<span class="php_007700">].</span>
						<span class="php_0000BB">readyState </span>
						<span class="php_007700">== </span>
						<span class="php_0000BB">0 </span>
						<span class="php_007700">|| </span>
						<span class="php_0000BB">this</span>
						<span class="php_007700">.</span>
						<span class="php_0000BB">_objPool</span>
						<span class="php_007700">[</span>
						<span class="php_0000BB">i</span>
						<span class="php_007700">].</span>
						<span class="php_0000BB">readyState </span>
						<span class="php_007700">== </span>
						<span class="php_0000BB">4</span>
						<span class="php_007700">)<br />            {<br />                return </span>
						<span class="php_0000BB">this</span>
						<span class="php_007700">.</span>
						<span class="php_0000BB">_objPool</span>
						<span class="php_007700">[</span>
						<span class="php_0000BB">i</span>
						<span class="php_007700">];<br />            }<br />        }<br /><br />        </span>
						<span class="php_FF8000">// IE5中不支持push方法<br />        </span>
						<span class="php_0000BB">this</span>
						<span class="php_007700">.</span>
						<span class="php_0000BB">_objPool</span>
						<span class="php_007700">[</span>
						<span class="php_0000BB">this</span>
						<span class="php_007700">.</span>
						<span class="php_0000BB">_objPool</span>
						<span class="php_007700">.</span>
						<span class="php_0000BB">length</span>
						<span class="php_007700">] = </span>
						<span class="php_0000BB">this</span>
						<span class="php_007700">.</span>
						<span class="php_0000BB">_createObj</span>
						<span class="php_007700">();<br /><br />        return </span>
						<span class="php_0000BB">this</span>
						<span class="php_007700">.</span>
						<span class="php_0000BB">_objPool</span>
						<span class="php_007700">[</span>
						<span class="php_0000BB">this</span>
						<span class="php_007700">.</span>
						<span class="php_0000BB">_objPool</span>
						<span class="php_007700">.</span>
						<span class="php_0000BB">length </span>
						<span class="php_007700">- </span>
						<span class="php_0000BB">1</span>
						<span class="php_007700">];<br />    },<br /><br />    </span>
						<span class="php_0000BB">_createObj</span>
						<span class="php_007700">: function ()<br />    {<br />        if (</span>
						<span class="php_0000BB">window</span>
						<span class="php_007700">.</span>
						<span class="php_0000BB">XMLHttpRequest</span>
						<span class="php_007700">)<br />        {<br />            var </span>
						<span class="php_0000BB">objXMLHttp </span>
						<span class="php_007700">= new </span>
						<span class="php_0000BB">XMLHttpRequest</span>
						<span class="php_007700">();<br /><br />        }<br />        else<br />        {<br />            var </span>
						<span class="php_0000BB">MSXML </span>
						<span class="php_007700">= [</span>
						<span class="php_DD0000">'MSXML2.XMLHTTP.5.0'</span>
						<span class="php_007700">, </span>
						<span class="php_DD0000">'MSXML2.XMLHTTP.4.0'</span>
						<span class="php_007700">, </span>
						<span class="php_DD0000">'MSXML2.XMLHTTP.3.0'</span>
						<span class="php_007700">, </span>
						<span class="php_DD0000">'MSXML2.XMLHTTP'</span>
						<span class="php_007700">, </span>
						<span class="php_DD0000">'Microsoft.XMLHTTP'</span>
						<span class="php_007700">];<br />            for(var </span>
						<span class="php_0000BB">n </span>
						<span class="php_007700">= </span>
						<span class="php_0000BB">0</span>
						<span class="php_007700">; </span>
						<span class="php_0000BB">n </span>
						<span class="php_007700">&lt; </span>
						<span class="php_0000BB">MSXML</span>
						<span class="php_007700">.</span>
						<span class="php_0000BB">length</span>
						<span class="php_007700">; </span>
						<span class="php_0000BB">n </span>
						<span class="php_007700">++)<br />            {<br />                </span>
						<span class="php_0000BB">try<br />                </span>
						<span class="php_007700">{<br />                    var </span>
						<span class="php_0000BB">objXMLHttp </span>
						<span class="php_007700">= new </span>
						<span class="php_0000BB">ActiveXObject</span>
						<span class="php_007700">(</span>
						<span class="php_0000BB">MSXML</span>
						<span class="php_007700">[</span>
						<span class="php_0000BB">n</span>
						<span class="php_007700">]);<br />                    break;<br />                }<br />                </span>
						<span class="php_0000BB">catch</span>
						<span class="php_007700">(</span>
						<span class="php_0000BB">e</span>
						<span class="php_007700">)<br />                {<br />                }<br />            }<br />         }          <br /><br />        </span>
						<span class="php_FF8000">// mozilla某些版本没有readyState属性<br />        </span>
						<span class="php_007700">if (</span>
						<span class="php_0000BB">objXMLHttp</span>
						<span class="php_007700">.</span>
						<span class="php_0000BB">readyState </span>
						<span class="php_007700">== </span>
						<span class="php_0000BB">null</span>
						<span class="php_007700">)<br />        {<br />            </span>
						<span class="php_0000BB">objXMLHttp</span>
						<span class="php_007700">.</span>
						<span class="php_0000BB">readyState </span>
						<span class="php_007700">= </span>
						<span class="php_0000BB">0</span>
						<span class="php_007700">;<br /><br />            </span>
						<span class="php_0000BB">objXMLHttp</span>
						<span class="php_007700">.</span>
						<span class="php_0000BB">addEventListener</span>
						<span class="php_007700">(</span>
						<span class="php_DD0000">"load"</span>
						<span class="php_007700">, function ()<br />                {<br />                    </span>
						<span class="php_0000BB">objXMLHttp</span>
						<span class="php_007700">.</span>
						<span class="php_0000BB">readyState </span>
						<span class="php_007700">= </span>
						<span class="php_0000BB">4</span>
						<span class="php_007700">;<br /><br />                    if (</span>
						<span class="php_0000BB">typeof objXMLHttp</span>
						<span class="php_007700">.</span>
						<span class="php_0000BB">onreadystatechange </span>
						<span class="php_007700">== </span>
						<span class="php_DD0000">"function"</span>
						<span class="php_007700">)<br />                    {<br />                        </span>
						<span class="php_0000BB">objXMLHttp</span>
						<span class="php_007700">.</span>
						<span class="php_0000BB">onreadystatechange</span>
						<span class="php_007700">();<br />                    }<br />                },  </span>
						<span class="php_0000BB">false</span>
						<span class="php_007700">);<br />        }<br /><br />        return </span>
						<span class="php_0000BB">objXMLHttp</span>
						<span class="php_007700">;<br />    },<br /><br />    </span>
						<span class="php_FF8000">// 发送请求(方法[post,get], 地址, 数据, 回调函数)<br />    </span>
						<span class="php_0000BB">sendReq</span>
						<span class="php_007700">: function (</span>
						<span class="php_0000BB">method</span>
						<span class="php_007700">, </span>
						<span class="php_0000BB">url</span>
						<span class="php_007700">, </span>
						<span class="php_0000BB">data</span>
						<span class="php_007700">, </span>
						<span class="php_0000BB">callback</span>
						<span class="php_007700">)<br />    {<br />        var </span>
						<span class="php_0000BB">objXMLHttp </span>
						<span class="php_007700">= </span>
						<span class="php_0000BB">this</span>
						<span class="php_007700">.</span>
						<span class="php_0000BB">_getInstance</span>
						<span class="php_007700">();<br /><br />        </span>
						<span class="php_0000BB">with</span>
						<span class="php_007700">(</span>
						<span class="php_0000BB">objXMLHttp</span>
						<span class="php_007700">)<br />        {<br />            </span>
						<span class="php_0000BB">try<br />            </span>
						<span class="php_007700">{<br />                </span>
						<span class="php_FF8000">// 加随机数防止缓存<br />                </span>
						<span class="php_007700">if (</span>
						<span class="php_0000BB">url</span>
						<span class="php_007700">.</span>
						<span class="php_0000BB">indexOf</span>
						<span class="php_007700">(</span>
						<span class="php_DD0000">"?"</span>
						<span class="php_007700">) &gt; </span>
						<span class="php_0000BB">0</span>
						<span class="php_007700">)<br />                {<br />                    </span>
						<span class="php_0000BB">url </span>
						<span class="php_007700">+= </span>
						<span class="php_DD0000">"&amp;randnum=" </span>
						<span class="php_007700">+ </span>
						<span class="php_0000BB">Math</span>
						<span class="php_007700">.</span>
						<span class="php_0000BB">random</span>
						<span class="php_007700">();<br />                }<br />                else<br />                {<br />                    </span>
						<span class="php_0000BB">url </span>
						<span class="php_007700">+= </span>
						<span class="php_DD0000">"?randnum=" </span>
						<span class="php_007700">+ </span>
						<span class="php_0000BB">Math</span>
						<span class="php_007700">.</span>
						<span class="php_0000BB">random</span>
						<span class="php_007700">();<br />                }<br /><br />                </span>
						<span class="php_0000BB">open</span>
						<span class="php_007700">(</span>
						<span class="php_0000BB">method</span>
						<span class="php_007700">, </span>
						<span class="php_0000BB">url</span>
						<span class="php_007700">, </span>
						<span class="php_0000BB">true</span>
						<span class="php_007700">);<br /><br />                </span>
						<span class="php_FF8000">// 设定请求编码方式<br />                </span>
						<span class="php_0000BB">setRequestHeader</span>
						<span class="php_007700">(</span>
						<span class="php_DD0000">'Content-Type'</span>
						<span class="php_007700">, </span>
						<span class="php_DD0000">'application/x-www-form-urlencoded; charset=UTF-8'</span>
						<span class="php_007700">);<br />                </span>
						<span class="php_0000BB">send</span>
						<span class="php_007700">(</span>
						<span class="php_0000BB">data</span>
						<span class="php_007700">);<br />                </span>
						<span class="php_0000BB">onreadystatechange </span>
						<span class="php_007700">= function ()<br />                {<br />                    if (</span>
						<span class="php_0000BB">objXMLHttp</span>
						<span class="php_007700">.</span>
						<span class="php_0000BB">readyState </span>
						<span class="php_007700">== </span>
						<span class="php_0000BB">4 </span>
						<span class="php_007700">&amp;&amp; (</span>
						<span class="php_0000BB">objXMLHttp</span>
						<span class="php_007700">.</span>
						<span class="php_0000BB">status </span>
						<span class="php_007700">== </span>
						<span class="php_0000BB">200 </span>
						<span class="php_007700">|| </span>
						<span class="php_0000BB">objXMLHttp</span>
						<span class="php_007700">.</span>
						<span class="php_0000BB">status </span>
						<span class="php_007700">== </span>
						<span class="php_0000BB">304</span>
						<span class="php_007700">))<br />                    {<br />                        </span>
						<span class="php_0000BB">callback</span>
						<span class="php_007700">(</span>
						<span class="php_0000BB">objXMLHttp</span>
						<span class="php_007700">);<br />                    }<br />                }<br />            }<br />            </span>
						<span class="php_0000BB">catch</span>
						<span class="php_007700">(</span>
						<span class="php_0000BB">e</span>
						<span class="php_007700">)<br />            {<br />                </span>
						<span class="php_0000BB">alert</span>
						<span class="php_007700">(</span>
						<span class="php_0000BB">e</span>
						<span class="php_007700">);<br />            }<br />        }<br />    }<br />};  <br /><p><span class="php_0000BB"></span></p></span>
						<span class="php_0000BB">
								<p>示例： </p>
								<div class="php_code">
										<span class="php_000000">
												<span class="php_0000BB">
												</span>
												<span class="php_007700">
														<font color="#007700">&lt;</font>
												</span>
												<span class="php_0000BB">
														<font color="#0000bb">script type</font>
												</span>
												<span class="php_007700">
														<font color="#007700">=</font>
												</span>
												<span class="php_DD0000">
														<font color="#dd0000">"text/javascript" </font>
												</span>
												<span class="php_0000BB">
														<font color="#0000bb">src</font>
												</span>
												<span class="php_007700">
														<font color="#007700">=</font>
												</span>
												<span class="php_DD0000">
														<font color="#dd0000">"xmlhttp.js"</font>
												</span>
												<span class="php_007700">
														<font color="#007700">&gt;</font>
												</span>
												<span class="php_0000BB">
														<font color="#0000bb">&lt;/script&gt;<br /></font>
												</span>&lt;script type="text/javascript"&gt;<br />function test(obj)<br />{<br />    alert(obj.statusText);<br />}<br /><br />XMLHttp.sendReq('GET', 'http://www.ugia.cn/wp-data/test.htm', '', test);<br />XMLHttp.sendReq('GET', 'http://www.ugia.cn/wp-data/test.htm', '', test);<br />XMLHttp.sendReq('GET', 'http://www.ugia.cn/wp-data/test.htm', '', test);<br />XMLHttp.sendReq('GET', 'http://www.ugia.cn/wp-data/test.htm', '', test);<br /><br />alert('Pool length:' + XMLHttp._objPool.length);<br />&lt;/script&gt;  <br /></span>
								</div>
						</span>
						<p>
								<span class="php_0000BB">
								</span>
						</p>
						<p>
								<span class="php_0000BB">源代码里有中文的注释，是ansi的，如果你的网站或ie下选择编码为UTF-8,可能会导致错误，你把你ie的编码改成gb2312看看，或者去掉文件里的中文注释 </span>
						</p>
				</span>
		</div><img src ="http://www.blogjava.net/zhangrenquan/aggbug/81915.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-11-18 13:38 <a href="http://www.blogjava.net/zhangrenquan/articles/81915.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>xmlhttp与防盗链</title><link>http://www.blogjava.net/zhangrenquan/articles/57846.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Wed, 12 Jul 2006 10:14:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/57846.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/57846.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/57846.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/57846.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/57846.html</trackback:ping><description><![CDATA[我们可以用xmlhttp来读取文件信息，然后转移到客户端，这样可以隐藏文件的真实地址。从而起到一点点的防止盗链的作用。<br /><br />在这个文件中，我们可以用很多方法来判断用户身份，包括来源的url，cookie数据，甚至是ip标志等。<br /><br />&lt;%@ codepage=65001%&gt; <br /><br />&lt;% <br /><br />Response.Buffer=False <br /><br />re_url = Lcase(Request.ServerVariables("HTTP_REFERER")) <br /><br />'获得来源页面的url <br /><br />mydomain = Lcase(Request.ServerVariables("SERVER_NAME")) <br /><br />'获得本页面域名 也可以直接指定 <br /><br />if mid(re_url,8,len(mydoain)) &lt;&gt; mydomian then <br /><br />response.write "URL wrong" <br /><br />'or redirect <br /><br />response.end() <br /><br />end if <br /><br />%&gt;<br /><br />//niceidea 签名留念<br /><br />这个是用的最多的防止盗链的方法，检查链入的页面是否是外地人,如果是外部链入，拒绝下载。 <br /><br />这里更保险的办法是利用cookie验证，就象通常的点击广告后才可以看到地址的方法一样。 <br /><br />最好的办法是装一个防盗链软件，asp脚本比较是基于iis的。&lt;% <br /><br />dim file_url,objXMLHTTP <br /><br />file_url="<a href="http://localhost/11.rar" target="_blank"><font color="#002c99">http://localhost/11.rar</font></a>" <br /><br />'我们可以从数据库中读取软件 <br /><br />Set objXMLHTTP = Server.CreateObject("Msxml2.ServerXMLHTTP") <br /><br />objXmlHttp.open "GET",file_url,false <br /><br />objXmlHttp.send()If objXMLHTTP.Status&lt;&gt;"200" Then <br /><br />response.write("file missing。") <br /><br />else <br /><br />Response.ContentType = "application/octet-stream" <br /><br />Response.AddHeader "content-disposition", "attachment; filename=" &amp; "11.rar" <br /><br />Response.BinaryWrite objXMLHTTP.responseBody <br /><br />End IfSet obiXMLHTTP=nothing <br /><br />response.end() <br /><br />%&gt;这个办法有明显的弊端，它需要在服务器内部交换一次数据，从而加重了服务器的负担,类似于开了一个暂时的代理；这里最好设置response的缓冲属性为false,iis6.0的asp缓存大小为4m，大的文件或者多个文件的缓冲很容易让服务器当机。 <br /><br />不过它的好处是防止盗链，因为这里没有发送任何关于真实地址的信息到最终的客户端。 <br /><br />更有效的使用途径是解决某些站点的图片防盗链功能.<br /><br />例如网易相册，就有防止跨域盗链的功能。 <br /><br />下面的文件： <br /><br />&lt;html&gt; <br /><br />&lt;body&gt; <br /><br />&lt;img src="<a href="http://img301.photo.163.com/luomin_dvd/35412650/__scale__1_954873822.jpg" target="_blank"><font color="#002c99">http://img301.photo.163.com/luomin_dvd/35412650/__scale__1_954873822.jpg</font></a>"/&gt; <br /><br />&lt;img src="getimg.asp?imgsrc=http://img301.photo.163.com/luomin_dvd/35412650/__scale__1_954873822.jpg"/&gt; <br /><br />&lt;/body&gt; <br /><br />&lt;/html&gt; <br /><br />然后另写一个getimg.asp<br /><br />&lt;% <br /><br />response.buffer=True <br /><br />dim file_url <br /><br />file_url=request.querystring("imgsrc") <br /><br />Set objXMLHTTP = Server.CreateObject("Msxml2.ServerXMLHTTP") <br /><br />objXmlHttp.open "GET",file_url,false <br /><br />objXmlHttp.send() <br /><br />Response.ContentType = "image/jepg" <br /><br />Response.BinaryWrite objXMLHTTP.responseBody <br /><br />set objXMLHTTP=nothing <br /><br />%&gt; <br /><br />你会发现，第一张图片是个×，第二张则正常。 <br /><br />在使用getimg.asp的时候，注意你的iis是否安装了防盗链软件，最好不要让别人盗链了。<img src ="http://www.blogjava.net/zhangrenquan/aggbug/57846.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-07-12 18:14 <a href="http://www.blogjava.net/zhangrenquan/articles/57846.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XMLHttp常用属性，方法，成员</title><link>http://www.blogjava.net/zhangrenquan/articles/57845.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Wed, 12 Jul 2006 10:13:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/57845.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/57845.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/57845.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/57845.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/57845.html</trackback:ping><description><![CDATA[<p>
				<a href="http://www.yaosansi.com/blog/article.asp?id=702#XMLHttpRequest对象">XMLHttpRequest对象</a>
		</p>
		<p>
				<a href="http://www.yaosansi.com/blog/article.asp?id=702#onreadystatechange">onreadystatechange属性</a>
		</p>
		<p>
				<a href="http://www.yaosansi.com/blog/article.asp?id=702#xmlhttpreadyState属性">readyState属性</a>
		</p>
		<p>
				<a href="http://www.yaosansi.com/blog/article.asp?id=702#xmlhttpresponsebody属性">responsebody属性</a>
		</p>
		<p>
				<a href="http://www.yaosansi.com/blog/article.asp?id=702#xmlhttpresponsestream属性">responsestream属性</a>
		</p>
		<p>
				<a href="http://www.yaosansi.com/blog/article.asp?id=702#xmlhttpresponsetext属性">responsetext属性</a>
		</p>
		<p>
				<a href="http://www.yaosansi.com/blog/article.asp?id=702#xmlhttprequestresponsexml成员">responsexml成员</a>
		</p>
		<p>
				<a href="http://www.yaosansi.com/blog/article.asp?id=702#xmlhttprequest对象status成员">status成员</a>
		</p>
		<p>
				<a href="http://www.yaosansi.com/blog/article.asp?id=702#xmlhttprequeststatusText成员">statusText成员</a>
				<br />
		</p>
		<p>
				<a href="http://www.yaosansi.com/blog/article.asp?id=702#xmlhttpabort方法">abort方法</a>
		</p>
		<p>
				<a href="http://www.yaosansi.com/blog/article.asp?id=702#xmlhttpgetallresponseheaders方法">getallresponseheaders方法</a>
		</p>
		<p>
				<a href="http://www.yaosansi.com/blog/article.asp?id=702#xmlhttpgetResponseHeader方法">getResponseHeader方法</a>
		</p>
		<p>
				<a href="http://www.yaosansi.com/blog/article.asp?id=702#xmlhttpopen方法">open方法</a>
		</p>
		<p>
				<a href="http://www.yaosansi.com/blog/article.asp?id=702#xmlhttpsend方法">send方法</a>
		</p>
		<p>
				<a href="http://www.yaosansi.com/blog/article.asp?id=702#xmlhttpsetrequestheader方法">setrequestheader方法</a>
				<br />
		</p>
		<hr />
		<p>xmlhttp:onreadystatechange属性<a name="onreadystatechange"></a><br />onreadystatechange</p>
		<p>指定当readyState属性改变时的事件处理句柄<br />语法</p>
		<p>oXMLHttpRequest.onreadystatechange = funcMyHandler;</p>
		<p>Example</p>
		<p>如下的例子演示当XMLHTTPRequest对象的readyState属性改变时调用HandleStateChange函数，当数据接收完毕后（readystate == 4）此页面上的一个按钮将被激活</p>
		<p>var xmlhttp=null;<br />function PostOrder(xmldoc)<br />{<br />var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.5.0");<br />xmlhttp.Open("POST", "http://myserver/orders/processorder.asp", false); <br />xmlhttp.onreadystatechange= HandleStateChange;<br />xmlhttp.Send(xmldoc);<br />myButton.disabled = true;<br />}<br />function HandleStateChange()<br />{<br />if (xmlhttp.readyState == 4)<br />{<br />myButton.disabled = false;<br />alert("Result = " + xmlhttp.responseXML.xml);<br />}<br />}</p>
		<hr />
		<p> </p>
		<p>XMLHttpRequest对象<a name="XMLHttpRequest对象"></a><br />XMLHttpRequest</p>
		<p>提供客户端同http服务器通讯的协议<br />Example</p>
		<p>下面的代码是在JScript中创建一个XMLHTTP对象并从服务器请求一个XML文档。服务器返回XML文档并显示。</p>
		<p>var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");<br />xmlHttpReq.open("GET", "http://localhost/books.xml", false);<br />xmlHttpReq.send();<br />alert(xmlHttpReq.responseText);</p>
		<p>在非IE的浏览器中，需要用new XMLHttpRequest()来创建对象，如下：</p>
		<p>var xmlHttpReq = new XMLHttpRequest();<br />xmlHttpReq.open("GET", "http://localhost/books.xml", false);<br />xmlHttpReq.send();<br />alert(xmlHttpReq.responseText);</p>
		<p>vbscript：</p>
		<p>Dim HttpReq As New MSXML2.XMLHTTP30<br />HttpReq.open "GET", "http://localhost/books.xml", False<br />HttpReq.send<br />MsgBox HttpReq.responseText</p>
		<p>备注</p>
		<p>客户端可以通过XmlHttp对象(MSXML2.XMLHTTP.3.0)向http服务器发送请求并使用微软XML文档对象模型Microsoft? XML Document Object Model (DOM)处理回应。<br /></p>
		<hr />
		<p>xmlhttp：readyState属性<a name="xmlhttpreadyState属性"></a><br />readyState</p>
		<p>返回XMLHTTP请求的当前状态<br />语法</p>
		<p>lValue = oXMLHttpRequest.readyState;</p>
		<p>Example</p>
		<p>var XmlHttp;<br />XmlHttp = new ActiveXObject("Msxml2.XMLHTTP.3.0");</p>
		<p>function send() {<br />XmlHttp.onreadystatechange = doHttpReadyStateChange;<br />XmlHttp.open("GET", "http://localhost/sample.xml", true);<br />XmlHttp.send();<br />}</p>
		<p>function doHttpReadyStateChange() {<br />if (XmlHttp.readyState == 4) {<br />alert("Done");<br />}<br />}</p>
		<p>备注</p>
		<p>变量，此属性只读，状态用长度为4的整型表示.定义如下：<br />0 (未初始化) 对象已建立，但是尚未初始化（尚未调用open方法）<br />1 (初始化) 对象已建立，尚未调用send方法<br />2 (发送数据) send方法已调用，但是当前的状态及http头未知<br />3 (数据传送中) 已接收部分数据，因为响应及http头不全，这时通过responseBody和responseText获取部分数据会出现错误，<br />4 (完成) 数据接收完毕,此时可以通过通过responseBody和responseText获取完整的回应数据<br /></p>
		<hr />
		<p> </p>
		<p>xmlhttp:responsebody属性<a name="xmlhttpresponsebody属性"></a><br />responseBody</p>
		<p>返回某一格式的服务器响应数据<br />语法</p>
		<p>strValue = oXMLHttpRequest.responseBody;</p>
		<p>Example</p>
		<p>var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.3.0");<br />xmlhttp.open("GET", "http://localhost/books.xml", false);<br />xmlhttp.send();<br />alert(xmlhttp.responseBody);</p>
		<p>备注</p>
		<p>变量，此属性只读，以unsigned array格式表示直接从服务器返回的未经解码的二进制数据。<br />参考</p>
		<p>responseStream 属性<br />responseText 属性<br /></p>
		<hr />
		<p> </p>
		<p>xmlhttp:responsestream属性<a name="xmlhttpresponsestream属性"></a><br />responseStream</p>
		<p>以Ado Stream对象的形式返回响应信息<br />语法</p>
		<p>strValue = oXMLHttpRequest.responseStream;</p>
		<p>备注</p>
		<p>变量，此属性只读，以Ado Stream对象的形式返回响应信息。</p>
		<hr />
		<p> </p>
		<p>xmlhttp:responsetext属性<a name="xmlhttpresponsetext属性"></a><br />responseText</p>
		<p>将响应信息作为字符串返回<br />语法</p>
		<p>strValue = oXMLHttpRequest.responseText;</p>
		<p>Example</p>
		<p>var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.3.0");<br />xmlhttp.open("GET", "http://localhost/books.xml", false);<br />xmlhttp.send();<br />alert(xmlhttp.responseText);</p>
		<p>备注</p>
		<p>变量，此属性只读，将响应信息作为字符串返回。<br />XMLHTTP尝试将响应信息解码为Unicode字符串，XMLHTTP默认将响应数据的编码定为UTF-8，如果服务器返回的数据带BOM(byte -order mark)，XMLHTTP可以解码任何UCS-2 (big or little endian)或者UCS-4 数据。注意，如果服务器返回的是xml文档，此属性并不处理xml文档中的编码声明。你需要使用responseXML来处理。</p>
		<hr />
		<p> </p>
		<p>xmlhttprequest:responsexml成员<a name="xmlhttprequestresponsexml成员"></a><br />responseXML</p>
		<p>将响应信息格式化为Xml Document对象并返回<br />语法</p>
		<p>var objDispatch = oXMLHttpRequest.responseXML;</p>
		<p>Example</p>
		<p>var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.3.0");<br />xmlhttp.open("GET", "http://localhost/books.xml", false);<br />xmlhttp.send();<br />alert(xmlhttp.responseXML.xml);</p>
		<p>备注</p>
		<p>变量，此属性只读，将响应信息格式化为Xml Document对象并返回。如果响应数据不是有效的XML文档，此属性本身不返回XMLDOMParseError，可以通过处理过的DOMDocument对象获取错误信息。</p>
		<hr />
		<p> </p>
		<p>xmlhttprequest对象：status成员<a name="xmlhttprequest对象status成员"></a><br />status</p>
		<p>返回当前请求的http状态码<br />语法</p>
		<p>lValue = oXMLHttpRequest.status;</p>
		<p>Example</p>
		<p>var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.3.0");<br />xmlhttp.open("GET", "http://localhost/books.xml", false);<br />xmlhttp.send();<br />alert(xmlhttp.status);</p>
		<p>返回值<br />长整形标准http状态码，定义如下：<br />Number Description</p>
		<p>100<br /></p>
		<p>Continue</p>
		<p>101<br /></p>
		<p>Switching protocols</p>
		<p>200<br /></p>
		<p>OK</p>
		<p>201<br /></p>
		<p>Created</p>
		<p>202<br /></p>
		<p>Accepted</p>
		<p>203<br /></p>
		<p>Non-Authoritative Information</p>
		<p>204<br /></p>
		<p>No Content</p>
		<p>205<br /></p>
		<p>Reset Content</p>
		<p>206<br /></p>
		<p>Partial Content</p>
		<p>300<br /></p>
		<p>Multiple Choices</p>
		<p>301<br /></p>
		<p>Moved Permanently</p>
		<p>302<br /></p>
		<p>Found</p>
		<p>303<br /></p>
		<p>See Other</p>
		<p>304<br /></p>
		<p>Not Modified</p>
		<p>305<br /></p>
		<p>Use Proxy</p>
		<p>307<br /></p>
		<p>Temporary Redirect</p>
		<p>400<br /></p>
		<p>Bad Request</p>
		<p>401<br /></p>
		<p>Unauthorized</p>
		<p>402<br /></p>
		<p>Payment Required</p>
		<p>403<br /></p>
		<p>Forbidden</p>
		<p>404<br /></p>
		<p>Not Found</p>
		<p>405<br /></p>
		<p>Method Not Allowed</p>
		<p>406<br /></p>
		<p>Not Acceptable</p>
		<p>407<br /></p>
		<p>Proxy Authentication Required</p>
		<p>408<br /></p>
		<p>Request Timeout</p>
		<p>409<br /></p>
		<p>Conflict</p>
		<p>410<br /></p>
		<p>Gone</p>
		<p>411<br /></p>
		<p>Length Required</p>
		<p>412<br /></p>
		<p>Precondition Failed</p>
		<p>413<br /></p>
		<p>Request Entity Too Large</p>
		<p>414<br /></p>
		<p>Request-URI Too Long</p>
		<p>415<br /></p>
		<p>Unsupported Media Type</p>
		<p>416<br /></p>
		<p>Requested Range Not Suitable</p>
		<p>417<br /></p>
		<p>Expectation Failed</p>
		<p>500<br /></p>
		<p>Internal Server Error</p>
		<p>501<br /></p>
		<p>Not Implemented</p>
		<p>502<br /></p>
		<p>Bad Gateway</p>
		<p>503<br /></p>
		<p>Service Unavailable</p>
		<p>504<br /></p>
		<p>Gateway Timeout</p>
		<p>505<br /></p>
		<p>HTTP Version Not Supported<br />备注</p>
		<p>长整形，此属性只读，返回当前请求的http状态码,此属性仅当数据发送并接收完毕后才可获取。</p>
		<hr />
		<p> </p>
		<p>xmlhttprequest:statusText成员<a name="xmlhttprequeststatusText成员"></a><br />statusText</p>
		<p>返回当前请求的响应行状态<br />语法</p>
		<p>strValue = oXMLHttpRequest.statusText;</p>
		<p>Example</p>
		<p>var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.3.0");<br />xmlhttp.open("GET", "http://localhost/books.xml", false);<br />xmlhttp.send();<br />alert(xmlhttp.statusText);</p>
		<p>备注</p>
		<p>字符串，此属性只读，以BSTR返回当前请求的响应行状态,此属性仅当数据发送并接收完毕后才可获取。</p>
		<hr />
		<p> </p>
		<p>xmlhttp:abort方法<a name="xmlhttpabort方法"></a><br />abort</p>
		<p>取消当前请求<br />语法</p>
		<p>oXMLHttpRequest.abort();</p>
		<p>备注</p>
		<p>调用此方法后，当前请求返回UNINITIALIZED 状态。<br /></p>
		<hr />
		<p> </p>
		<p>xmlhttp:getallresponseheaders方法<a name="xmlhttpgetallresponseheaders方法"></a><br />getallresponseheaders</p>
		<p>获取响应的所有http头<br />语法</p>
		<p>strValue = oXMLHttpRequest.getAllResponseHeaders();</p>
		<p>Example</p>
		<p>var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.3.0");<br />xmlhttp.open("GET", "http://localhost/sample.xml", false);<br />xmlhttp.send();<br />alert(xmlhttp.getAllResponseHeaders());</p>
		<p>输出由web服务器返回的http头信息，example:</p>
		<p>Server:Microsoft-IIS/5.1<br />X-Powered-By:ASP.NET<br />Date:Sat, 07 Jun 2003 23:23:06 GMT<br />Content-Type:text/xml<br />Accept-Ranges:bytes<br />Last Modified:Sat, 06 Jun 2003 17:19:04 GMT<br />ETag:"a0e2eeba4f2cc31:97f"<br />Content-Length:9</p>
		<p>备注</p>
		<p>每个http头名称和值用冒号分割，并以\r\n结束。当send方法完成后才可调用该方法。</p>
		<hr />
		<p> </p>
		<p>xmlhttp：getResponseHeader方法<a name="xmlhttpgetResponseHeader方法"></a><br />getResponseHeader</p>
		<p>从响应信息中获取指定的http头<br />语法</p>
		<p>strValue = oXMLHttpRequest.getResponseHeader(bstrHeader);</p>
		<p>Example</p>
		<p>var xmlhttp = new ActiveXObject("MSXML2.XMLHTTP.3.0");<br />xmlhttp.open("GET", "http://localhost/sample.xml", false);<br />xmlhttp.send();<br />alert(xmlhttp.getResponseHeader("Server"));</p>
		<p>输出http头中的server列：当前web服务器的版本及名称。<br />备注</p>
		<p>当send方法成功后才可调用该方法。如果服务器返回的文档类型为"text/xml", 则这句话xmlhttp.getResponseHeader("Content-Type");将返回字符串"text/xml"。可以使用 getAllResponseHeaders方法获取完整的http头信息。</p>
		<hr />
		<p> </p>
		<p>xmlhttp:open方法<a name="xmlhttpopen方法"></a><br />open</p>
		<p>创建一个新的http请求，并指定此请求的方法、URL以及验证信息<br />语法</p>
		<p>oXMLHttpRequest.open(bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword);</p>
		<p>参数</p>
		<p>bstrMethod<br />http方法，例如：POST、GET、PUT及PROPFIND。大小写不敏感。</p>
		<p>bstrUrl<br />请求的URL地址，可以为绝对地址也可以为相对地址。</p>
		<p>varAsync[可选]<br />布尔型，指定此请求是否为异步方式，默认为true。如果为真，当状态改变时会调用onreadystatechange属性指定的回调函数。</p>
		<p>bstrUser[可选]<br />如果服务器需要验证，此处指定用户名，如果未指定，当服务器需要验证时，会弹出验证窗口。</p>
		<p>bstrPassword[可选]<br />验证信息中的密码部分，如果用户名为空，则此值将被忽略。<br />Example<br />下面的例子演示从服务器请求book.xml,并显示其中的book字段。</p>
		<p>var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.3.0");<br />xmlhttp.open("GET","http://localhost/books.xml", false);<br />xmlhttp.send();<br />var book = xmlhttp.responseXML.selectSingleNode("//book[@id=''bk101'']");<br />alert(book.xml);</p>
		<p>备注</p>
		<p>调用此方法后，可以调用send方法向服务器发送数据。</p>
		<hr />
		<p> </p>
		<p>xmlhttp:send方法<a name="xmlhttpsend方法"></a><br />send</p>
		<p>发送请求到http服务器并接收回应<br />语法</p>
		<p>oXMLHttpRequest.send(varBody);</p>
		<p>参数</p>
		<p>varBody<br />欲通过此请求发送的数据。<br />Example</p>
		<p>xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.3.0");<br />xmlhttp.open("GET", "http://localhost/sample.xml", false);<br />xmlhttp.send();<br />alert(xmlhttp.responseXML.xml);</p>
		<p>备注</p>
		<p>此方法的同步或异步方式取决于open方法中的bAsync参数，如果bAsync == False，此方法将会等待请求完成或者超时时才会返回，如果bAsync == True，此方法将立即返回。</p>
		<p>This method takes one optional parameter, which is the requestBody to use. The acceptable VARIANT input types are BSTR, SAFEARRAY of UI1 (unsigned bytes), IDispatch to an XML Document Object Model (DOM) object, and IStream *. You can use only chunked encoding (for sending) when sending IStream * input types. The component automatically sets the Content-Length header for all but IStream * input types.</p>
		<p>如果发送的数据为BSTR，则回应被编码为utf-8, 必须在适当位置设置一个包含charset的文档类型头。</p>
		<p>If the input type is a SAFEARRAY of UI1, the response is sent as is without additional encoding. The caller must set a Content-Type header with the appropriate content type.</p>
		<p>如果发送的数据为XML DOM object，则回应将被编码为在xml文档中声明的编码，如果在xml文档中没有声明编码，则使用默认的UTF-8。</p>
		<p>If the input type is an IStream *, the response is sent as is without additional encoding. The caller must set a Content-Type header with the appropriate content type.<br /></p>
		<hr />
		<p> </p>
		<p>xmlhttp:setrequestheader方法<a name="xmlhttpsetrequestheader方法"></a><br />setRequestHeader</p>
		<p>单独指定请求的某个http头<br />语法</p>
		<p>oXMLHttpRequest.setRequestHeader(bstrHeader, bstrValue);</p>
		<p>参数</p>
		<p>bstrHeader<br />字符串，头名称。<br />bstrValue<br />字符串，值。<br />备注</p>
		<p>如果已经存在已此名称命名的http头，则覆盖之。此方法必须在open方法后调用。</p>
		<p> </p>
		<p>xmlhttp的请求同步和异步、方法的get和post<br />http://www.niceidea.org/post/xmlhttp_true_false_post_get.html</p>
		<p>看看open方法的另外几个参数。</p>
		<p>.open http-method, url, async, userID, password （后面是帐号和密码，在禁止匿名访问的http页面中，需要用户名和口令）</p>
		<p>首先看看异步处理方式。</p>
		<p>其中async是一个布尔值。如果是异步通信方式(true)，客户机就不等待服务器的响应；如果是同步方式(false)，客户机就要等到服务器返回消息后才去执行其他操作。我们需要根据实际需要来指定同步方式，在某些页面中，可能会发出多个请求，甚至是有组织有计划有队形大规模的高强度的request，而后一个是会覆盖前一个的，这个时候当然要指定同步方式：Flase。</p>
		<p>//niceidea 签名留念</p>
		<p>首先看看method，方法。</p>
		<p>一个标准的http请求头：</p>
		<p>7/8/99 10:27:16 Sent GET /Store/Download.asp HTTP/1.1</p>
		<p>Accept: application/msword, application/vnd.ms-execl, application/vnd.ms-</p>
		<p>powerpoint, image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-</p>
		<p>comet, */*</p>
		<p>Accept-Language: en-us</p>
		<p>Encoding: gzip, deflate</p>
		<p>Referer: http://ww.wrox.com/main_menu.asp</p>
		<p>Cookie: VisitCount=2&amp;LASTDATE=6%2F4%2F99+10%3A10%3A13+AM</p>
		<p>User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98)</p>
		<p>Host: 212.250.238.67</p>
		<p>Connection: Keep-Alive</p>
		<p>很容易看懂，其中的method包括post/get/put等。对应的主要是对于form即表单元素的处理方法。</p>
		<p>当mothod值为get时，表单将附加在action页面的url中；如果页面是asp的，将会request.querystring中获得；</p>
		<p>如果是post，将会在request.form中获得，</p>
		<p>对应与put方法的表单写法是：form method="POST" enctype='multipart/form-data'</p>
		<p>主要用于上传文件。</p>
		<p>使用那种方法取决于服务端。</p><img src ="http://www.blogjava.net/zhangrenquan/aggbug/57845.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-07-12 18:13 <a href="http://www.blogjava.net/zhangrenquan/articles/57845.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AJAX开发简略</title><link>http://www.blogjava.net/zhangrenquan/articles/55178.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Mon, 26 Jun 2006 08:56:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/55178.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/55178.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/55178.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/55178.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/55178.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: [摘录]：http://www.blogjava.net/eamoi/archive/2005/10/31/17489.htmlAJAX																		开发简略																										... 																1																																				...&nbsp;&nbsp;<a href='http://www.blogjava.net/zhangrenquan/articles/55178.html'>阅读全文</a><img src ="http://www.blogjava.net/zhangrenquan/aggbug/55178.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-06-26 16:56 <a href="http://www.blogjava.net/zhangrenquan/articles/55178.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AJAX轻松上路</title><link>http://www.blogjava.net/zhangrenquan/articles/47574.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Tue, 23 May 2006 01:23:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/47574.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/47574.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/47574.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/47574.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/47574.html</trackback:ping><description><![CDATA[
		<strong>
				<font face="Verdana">什么是 AJAX? </font>
		</strong>
		<p>
				<font face="Verdana">　　AJAX (异步 JavaScript 和 XML) 是个新产生的术语,专为描述JavaScript的两项强大性能.这两项性能在多年来一直被网络开发者所忽略,直到最近Gmail, Google suggest和google Maps的横空出世才使人们开始意识到其重要性. </font>
		</p>
		<p>
				<font face="Verdana">　　这两项被忽视的性能是: </font>
		</p>
		<p>
				<font face="Verdana">• 无需重新装载整个页面便能向服务器发送请求. <br />• 对XML文档的解析和处理．</font>
		</p>
		<p>
				<font face="Verdana">　　<strong>步骤 1 – "请!" --- 如何发送一个HTTP请求</strong></font>
		</p>
		<p>
				<font face="Verdana">　　为了用JavaScript向服务器发送一个HTTP请求, 需要一个具备这种功能的类实例. 这样的类首先由Internet Explorer以<a class="bluekey" href="http://www.yesky.com/key/681/10681.html" target="_blank">ActiveX</a><font color="#4d4d4d">对象引入, 被称为XMLHTTP. 后来Mozilla, Safari 和其他浏览器纷纷仿效, 提供了XMLHttpRequest类,它支持微软的ActiveX对象所提供的方法和属性. </font></font>
		</p>
		<p>
				<font face="Verdana">　　因此, 为了创建一个跨浏览器的这样的类实例(对象), 可以应用如下代码: </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #dddddd" face="Verdana">if (window.XMLHttpRequest) { // Mozilla, Safari, ...<br />    http_<a class="bluekey" href="http://www.yesky.com/key/4313/19313.html" target="_blank"><font color="#005880">request</font></a> = new XMLHttpRequest();<br />} else if (window.ActiveXObject) { // IE<br />    http_request = new ActiveXObject("Microsoft.XMLHTTP");<br />}</font>
		</p>
		<p>
				<font face="Verdana">　　(上例对代码做了一定简化,这是为了解释如何创建XMLHTTP类实例. 实际的代码实例可参阅本篇步骤3.) </font>
		</p>
		<p>
				<font face="Verdana">　　如果服务器的响应没有XML mime-type header,某些Mozilla浏览器可能无法正常工作. 为了解决这个问题, 如果服务器响应的header不是text/xml,可以调用其它方法修改该header. </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #dddddd" face="Verdana">http_request = new XMLHttpRequest();<br />http_request.overrideMimeType('text/xml');</font>
		</p>
		<p>
				<font face="Verdana">　　接下来要决定当收到服务器的响应后,需要做什么.这需要告诉HTTP请求对象用哪一个JavaScript<a class="bluekey" href="http://www.yesky.com/key/1456/6456.html" target="_blank"><font color="#005880">函数</font></a>处理这个响应.可以将对象的onreadystatechange属性设置为要使用的JavaScript的函数名,如下所示: </font>
		</p>
		<p>
				<font face="Verdana">
						<font style="BACKGROUND-COLOR: #dddddd">http_request.onreadystatechange = nameOfTheFunction;</font>
				</font>
		</p>
		<p>
				<font face="Verdana">　　注意:在函数名后没有括号,也无需传递参数.另外还有一种方法,可以在扉页(fly)中定义函数及其对响应要采取的行为,如下所示: </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #dddddd" face="Verdana">http_request.onreadystatechange = function(){<br />    // do <a class="bluekey" href="http://www.yesky.com/key/3226/13226.html" target="_blank"><font color="#005880">the</font></a> thing<br />};</font>
		</p>
		<p>
				<font face="Verdana">　　在定义了如何处理响应后,就要发送请求了.可以调用HTTP请求类的<a class="bluekey" href="http://www.yesky.com/key/1093/36093.html" target="_blank"><font color="#005880">open</font></a>()和send()方法, 如下所示: </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #dddddd" face="Verdana">http_request.open('GET', 'http://www.example.org/some.file', true);<br />http_request.send(null);</font>
		</p>
		<p>
				<font face="Verdana">• open()的第一个参数是HTTP请求方式 – GET, POST, HEAD 或任何服务器所支持的您想调用的方式. 按照HTTP规范,该参数要大写;否则,某些浏览器(如Firefox)可能无法处理请求.有关HTTP请求方法的详细信息可参考http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html W3C specs <br />• 第二个参数是请求页面的URL.由于自身安全特性的限制,该页面不能为第三方域名的页面.同时一定要保证在所有的页面中都使用准确的域名,否则调用open()会得到"permission denied"的错误提示.一个常见的错误是访问站点时使用domain.tld,而当请求页面时,却使用www.domain.tld. <br />• 第三个参数设置请求是否为异步模式.如果是TRUE, JavaScript函数将继续执行,而不等待服务器响应.这就是"AJAX"中的"A". <br /><br /></font>
		</p>
		<p>
				<font face="Verdana">　　如果第一个参数是"POST",send()方法的参数可以是任何想送给服务器的数据. 这时数据要以字符串的形式送给服务器,如下所示: </font>
		</p>
		<p>
				<font face="Verdana">
						<font style="BACKGROUND-COLOR: #dddddd">name=value&amp;anothername=othervalue&amp;so=on</font>
				</font>
		</p>
		<p>
				<font face="Verdana">　　<strong>步骤 2 – "收到!" --- 处理服务器的响应</strong></font>
		</p>
		<p>
				<font face="Verdana">　　当发送请求时,要提供指定处理响应的JavaScript函数名. </font>
		</p>
		<p>
				<font face="Verdana">
						<font style="BACKGROUND-COLOR: #dddddd">http_request.onreadystatechange = nameOfTheFunction;</font>
				</font>
		</p>
		<p>
				<font face="Verdana">　　我们来看看这个函数的功能是什么.首先函数会检查请求的状态.如果状态值是4,就意味着一个完整的服务器响应已经收到了,您将可以处理该响应. </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #dddddd" face="Verdana">if (http_request.readyState == 4) {<br />    // everything is good, the response is received<br />} else {<br />    // still not ready<br />}</font>
		</p>
		<p>
				<font face="Verdana">　　readyState的取值如下: </font>
		</p>
		<p>
				<font face="Verdana">• 0 (未初始化) <br />• 1 (正在装载) <br />• 2 (装载完毕) <br />• 3 (交互中) <br />• 4 (完成) <br />(Source) </font>
		</p>
		<p>
				<font face="Verdana">　　接着,函数会检查HTTP服务器响应的状态值. 完整的状态取值可参见 W3C site. 我们着重看值为200 OK的响应. </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #dddddd" face="Verdana">i</font>
				<font style="BACKGROUND-COLOR: #dddddd" face="Verdana">f (http_request.status == 200) {<br />    // perfect!<br />} else {<br />    // there was a problem with the request,<br />    // for example the response may be a 404 (Not Found)<br />    // or 500 (Internal Server Error) response codes<br />}</font>
		</p>
		<p>
				<font face="Verdana">　　在检查完请求的状态值和响应的HTTP状态值后, 您就可以处理从服务器得到的数据了.有两种方式可以得到这些数据: </font>
		</p>
		<p>
				<font face="Verdana">• http_request.responseText – 以文本字符串的方式返回服务器的响应 <br />• http_request.responseXML – 以XMLDocument对象方式返回响应.处理XMLDocument对象可以用JavaScript DOM函数 <br /><br /></font>
		</p>
		<p>
				<font face="Verdana">　　<strong>步骤 3 – "万事俱备!" - 简单实例</strong></font>
		</p>
		<p>
				<font face="Verdana">　　我们现在将整个过程完整地做一次,发送一个简单的HTTP请求. 我们用JavaScript请求一个HTML文件, test.html, 文件的文本内容为"I'm a test.".然后我们"alert()"test.html文件的内容. </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #dddddd" face="Verdana">&lt;script type="text/javascript" language="javascript"&gt;</font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #dddddd" face="Verdana">    var http_request = false;</font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #dddddd" face="Verdana">    function makeRequest(url) {</font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #dddddd" face="Verdana">        http_request = false;</font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #dddddd" face="Verdana">        if (window.XMLHttpRequest) { // Mozilla, Safari,...<br />            http_request = new XMLHttpRequest();<br />            if (http_request.overrideMimeType) {<br />                http_request.overrideMimeType('text/xml');<br />            }<br />        } else if (window.ActiveXObject) { // IE<br />            try {<br />                http_request = new ActiveXObject("Msxml2.XMLHTTP");<br />            } catch (e) {<br />                try {<br />                    http_request = new ActiveXObject("Microsoft.XMLHTTP");<br />                } catch (e) {}<br />            }<br />        }</font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #dddddd" face="Verdana">        if (!http_request) {<br />            alert('Giving up :( Cannot create an XMLHTTP instance');<br />            return false;<br />        }<br />        http_request.onreadystatechange = alertContents;<br />        http_request.open('GET', url, true);<br />        http_request.send(null);</font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #dddddd" face="Verdana">    }</font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #dddddd" face="Verdana">    function alertContents() {</font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #dddddd" face="Verdana">        if (http_request.readyState == 4) {<br />            if (http_request.status == 200) {<br />                alert(http_request.responseText);<br />            } else {<br />                alert('There was a problem with the request.');<br />            }<br />        }</font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #dddddd" face="Verdana">    }<br />&lt;/script&gt;<br />&lt;span<br />    style="cursor: pointer; text-decoration: underline"<br />    onclick="makeRequest('test.html')"&gt;<br />        Make a request<br />&lt;/span&gt;</font>
		</p>
		<p>
				<font face="Verdana">　　本例中: </font>
		</p>
		<p>
				<font face="Verdana">• 用户点击浏览器上的"请求"链接; <br />• 接着函数makeRequest()将被调用.其参数 – HTML文件test.html在同一目录下; <br />• 这样就发起了一个请求.onreadystatechange的执行结果会被传送给alertContents(); <br />• alertContents()将检查服务器的响应是否成功地收到,如果是,就会"alert()"test.html文件的内容. <br /><br /><a class="f1"></a></font>
		</p>
		<div class="guanggao">
				<span id="contentAdv">
						<p>
								<font face="Verdana">　　步骤 4 – "X-文档" --- 处理XML响应</font>
						</p>
						<p>
								<font face="Verdana">　　在前面的例子中,当服务器对HTTP请求的响应被收到后,我们会调用请求对象的reponseText属性.该属性包含了test.html文件的内容.现在我们来试试responseXML属性. </font>
						</p>
						<p>
								<font face="Verdana">　　首先,我们新建一个有效的XML文件,后面我们将使用这个文件.该文件(test.xml)源代码如下所示: </font>
						</p>
						<p>
								<font style="BACKGROUND-COLOR: #dddddd" face="Verdana">&lt;?xml version="1.0" ?&gt;<br />&lt;root&gt;<br />    I'm a test.<br />&lt;/root&gt;</font>
						</p>
						<p>
								<font face="Verdana">　　在该脚本中,我们只需修改请求部分: <br /><font style="BACKGROUND-COLOR: #dddddd">...<br />onclick="makeRequest('test.xml')"&gt;<br />...</font></font>
						</p>
						<p>
								<font face="Verdana">　　接着,在alertContents()中,我们将alert()的代码alert(http_request.responseText);换成: </font>
						</p>
						<p>
								<font style="BACKGROUND-COLOR: #dddddd" face="Verdana">var xmldoc = http_request.responseXML;<br />var root_node = xmldoc.getElementsByTagName('root').item(0);<br />alert(root_node.firstChild.data);</font>
						</p>
						<p>
								<font face="Verdana">　　这里,我们使用了responseXML提供的XMLDocument对象并用DOM方法获取存于XML文件中的内容. </font>
						</p>
				</span>
		</div>
<img src ="http://www.blogjava.net/zhangrenquan/aggbug/47574.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-05-23 09:23 <a href="http://www.blogjava.net/zhangrenquan/articles/47574.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用AJAX开发智能Web应用程序之基础篇</title><link>http://www.blogjava.net/zhangrenquan/articles/39203.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Tue, 04 Apr 2006 09:04:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/39203.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/39203.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/39203.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/39203.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/39203.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<strong>一. 什么是AJAX?</strong>
		</div>
		<p class="postText">
				<font color="#000000">　　这个名字代表了异步JavaScript+XMLHTTPRequest，并且意味着你可以在基于浏览器的JavaScript和服务器之间建立套接字通讯。其实AJAX并不是一种新技术，而是已经成功地用于现代浏览器中的若干成功技术的可能性组合。所有的AJAX应用程序实现了一种“丰富的”UI——这是通过JavaScript操作HTML文档对象模型并且经由XMLHttpRequest实现的精确定位的数据检索来实现的。典型的示例AJAX应用程序是Google Labs(http://labs.google.com)的Google Maps和Google Suggest。这些应用程序现场监视用户输入并且提供实时的页面更新。最重要的是，在用户通过地图导航或输入一个查找字符串的同时，这些事件不需要刷新页面。</font>
		</p>
		<p class="postText">
				<font color="#000000">　　事实上，支持这些令人感到惊讶的应用的技术已经出现一段时间了，尽管它们要求复杂的技能以及使用浏览器的技巧。一些专利产品就提供了相似的能力——如Macromedia Flash插件，Java Applets或.NET运行时——在达到实用上已经有一段时间了。把一种可与服务器通话的脚本组件引入到浏览器中的思想早在IE 5.0中就已经存在。Firefox和其它流行的浏览器也加入到浏览器大军中并以一种内置对象形式支持XMLHTTPRequest。随着跨平台浏览器的出现，这些技术得到了认可并在2004年3月一家称为Adaptive Path的公司中正式提出了AJAX。</font>
		</p>
		<p class="postText">
				<font color="#000000">　　简而言之，由于来自于Google的支持和安装了一点可用的浏览器技术，加上为了一种"更好的用户体验"，每个人都在把客户端技术添加到Web应用程序上。</font>
		</p>
		<p class="postText">
				<font color="#000000">　　<strong>二. AJAX与传统应用程序的区别</strong></font>
		</p>
		<p class="postText">
				<font color="#000000">　　一个传统Web应用程序模型实际上是一种基本的事件——用户被迫提交表单以实现页面交换。也就是说，表单提交和页面传送无法得到保证:还有更坏的情形——用户需要再次点击。这与AJAX截然不同-——数据跨过线路而不是完整的HTML页面传输。这种数据交换是经由特定的浏览器对象:XMLHttpRequest实现的;再由适当的逻辑来处理每个数据请求的结果，页面的特定区域而不是完整的页面被更新。结果是更快的速度，更少的拥挤和更好的信息传送控制。</font>
		</p>
		<p class="postText">
				<font color="#000000">　　传统型"click-refresh"Web应用程序强迫用户中断工作过程而等待页面的重装。通过引入AJAX技术，一个客户端脚本能够异步地与服务器通话，而用户仍能保持输入数据。除了对用户透明之外，这样的异步意味着服务器可以有更多时间来处理请求。</font>
		</p>
		<p class="postText">
				<font color="#000000">　　传统Web应用程序把所有的处理代理到服务器并且强迫服务器进行状态管理。AJAX允许灵活划分应用程序逻辑以及客户和服务器之间的状态管理。这就消除了一种"click-refresh"依赖性并且提供更好的服务器可伸缩性。当该状态存储在客户端，你就不必跨越服务器来维持会话或保存/结束状态-其使用期限是由客户端来定义的。</font>
		</p>
		<p class="postText">
				<font color="#000000">　　<strong>三. AJAX——分布式的MVC</strong></font>
		</p>
		<p class="postText">
				<font color="#000000">　　尽管AJAX应用程序依靠JavaScript来实现描述层，然而处理能力和知识库仍然存在于服务器上。此时，AJAX应用程序大量的与J2EE服务器通讯——把数据输入/输出Web服务和servlets。具有基于AJAX的描述层的J2EE应用程序和标准J2EE应用程序之间的区别首先在于，MVC是通过线路分布的。通过使用AJAX，视图是本地的，而模型和控制器是分布式的——这使得开发者能够灵活地决定哪些部件会是基于客户端的。具体地说，本地视图通过巧妙地操作HTML DOM而生成图形;控制器局部地处理用户输入并且根据开发者的判断扩展到服务器的处理——经由HTTP请求(Web服务，XML/RPC或其它)实现;模型的远程部分是根据客户端需要而下载的以达到实时更新客户端页面;并且状态是在客户端收集的。</font>
		</p>
		<p class="postText">
				<font color="#000000">　　在以后的AJAX文章中，我们将比较深入地讨论这里的每一种组件并提供有关它们联合在一起进行应用的示例。现在，先不多说，让我们详细地分析一个简单的AJAX示例。</font>
		</p>
		<p class="postText">
				<font color="#000000">　　<strong>四. 邮政区号校验和查询</strong></font>
		</p>
		<p class="postText">
				<font color="#000000">　　我们将创建一个包含三个INPUT字段(Zip，City和State)的HTML页面。我们将保证，只要用户输入邮政区号的前三个数字，该页面上的字段就会用第一个匹配的状态值填充。一旦用户输入了所有五位邮政区号数，我们将立即决定和填充相应的城市。如果邮政区号无效(在服务器的数据库没有找到)，那么我们将把邮政区号的边界设置为红色。这样的可视化线索有助于用户并且在现代浏览器中已经成为一种标准(作为一实例，当Firefox找到一个HTML页面中的匹配关键字时，它会高亮与你在浏览器查找域输入的内容一致的部分)。</font>
		</p>
		<p class="postText">
				<font color="#000000">　　让我们首先创建一个简单的包含三个INPUT字段的HTML:zip，city和state。请注意，一旦一个字符输入进邮政区号字段域中，即调用方法zipChanged()。JavaScript函数zipChanged()(见下)在当zip长度为3时调用函数updateState()，而在当zip长度为5时调用函数up-dateCity()。而updateCity()和updateState()把大部分的工作代理到另一个函数ask()。</font>
		</p>
		<p class="postText">
				<font face="Verdana">
						<font style="BACKGROUND-COLOR: #dddddd">
								<font color="#000000">Zip:＜input id="zipcode" type="text" maxlength="5" onKeyUp="zipChanged()"<br />style="width:60"/＞<br />City: ＜input id="city" disabled maxlength="32" style="width:160"/＞<br />State:＜input id="state" disabled maxlength="2" style="width:30"/＞<br />＜script src="xmlhttp.js"＞＜/script＞<br />＜script＞<br />var zipField = null;<br />function zipChanged(){<br />zipField = document.getElementById("zipcode")<br />var zip = zipField.value;<br />zip.length == 3?updateState(zip):zip.length == 5?updateCity(zip):"";<br />}<br />function updateState(zip) {<br />　var stateField = document.getElementById("state");<br />　ask("resolveZip.jsp?lookupType=state&amp;zip="+zip， stateField， zipField);<br />}<br />function updateCity(zip) {<br />　var cityField = document.getElementById("city");<br />　ask("resolveZip.jsp? lookupType=city&amp;zip="+zip， cityField， zipField);<br />}<br />＜/script＞<br /><br /><br /><font style="BACKGROUND-COLOR: #ffffff">    函数ask()与服务器进行通讯并分配一个回调函数来处理服务器的响应(见下列代码)。后面，我们将分析具有双重特点的resolveZip.jsp的内容-它根据zip字段中的字符数查找city或state信息。重要的是，ask()使用了具有异步特点的XmlHttpRequest，这样填充state和city字段或着色zip字段边界就可以不必减慢数据入口而得以实现。首先，我们调用request.open()-它用服务器打开套接字频道，使用一个HTTP动词(GET或POST)作为第一个参数并且以数据提供者的URL作为第二个参数。request.open()的最后一个参数被设置为true-它指示该请求的异步特性。注意，该请求还没有被提交。随着对request.send()的调用，开始提交-这可以为POST提供任何必要的有效载荷。在使用异步请求时，我们必须使用request.onreadystatechanged属性来分配请求的回调函数。(如果请求是同步的话，我们应该能够在调用request.send之后立即处理结果，但是我们也有可能阻断用户，直到该请求完成为止。)</font></font>
						</font>
				</font>
		</p>
		<p class="postText">
				<font style="BACKGROUND-COLOR: #dddddd" face="Verdana" color="#000000">HTTPRequest = function () {<br />　var xmlhttp=null;<br />　try {<br />　　xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");<br />　} catch (_e) {<br />　　try {<br />　　　xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");<br />　　} catch (_E) { }<br />　}<br />　if (!xmlhttp &amp;&amp; typeof XMLHttpRequest != 'undefined') {<br />　　try {<br />　　　xmlhttp = new XMLHttpRequest();<br />　　} catch (e) {<br />　　　xmlhttp = false;<br />　　}<br />　}<br />　return xmlhttp;<br />}</font>
		</p>
		<p class="postText">
				<font style="BACKGROUND-COLOR: #dddddd" face="Verdana" color="#000000">function ask(url， fieldToFill， lookupField) {<br />　var http = new HTTPRequest();<br />　http.open("GET"， url， true);<br />　http.onreadystatechange = function (){ handleHttpResponse(http， fieldToFill，lookupField)};<br />　http.send(null);<br />}</font>
		</p>
		<p class="postText">
				<font style="BACKGROUND-COLOR: #dddddd" face="Verdana" color="#000000">function handleHttpResponse(http， fieldToFill， lookupField) {<br />　if (http.readyState == 4) {<br />　　result = http.responseText;<br />　　if ( -1 != result.search("null") ) {<br />　　　lookupField.style.borderColor = "red";<br />　　　fieldToFill.value = "";<br />　　} else {<br />　　　lookupField.style.borderColor = "";<br />　　　fieldToFill.value = result;<br />　　}<br />　}<br />}</font>
		</p>
		<p class="postText">
				<font style="BACKGROUND-COLOR: #ffffff" color="#000000">　　为ask()所使用的HttpRequest()函数(见上)是一跨浏览器的XMLHTTPRequest的一个实例的构造器;稍后我们将分析它。到目前为止，请注意对于handleResponse()的调用是如何用一匿名函数包装的-这个函数是function(){handleHttpResponse(http，fieldToFill， lookupField)}。</font>
		</p>
		<p class="postText">
				<font style="BACKGROUND-COLOR: #ffffff" color="#000000">　　该函数的代码是动态创建的并且在每次我们给http.onreadstatechange属性赋值时被编译。结果，JavaScript创建一个指向上下文(所有的变量都可以存取正在结束的方法-ask())的指针。这样以来，匿名函数和handleResponse()就能够被保证充分存取所有的上下文宿主的变量，直至到匿名函数的参考被垃圾回收站收集为止。换句话说，无论何时我们的匿名函数被调用，它都能无缝地参考request，fieldToFill和lookupField变量，就象它们是全局的一样。而且，每次ask()调用都将创建环境的一个独立拷贝，并且此时这些变量中保存有该函数将结束时的值。</font>
		</p>
		<p class="postText">
				<font color="#000000">
						<font style="BACKGROUND-COLOR: #ffffff">　　现在，让我们分析一下函数handleResponse()。既然它能够在请求处理的不同状态下激活，那么该函数将忽略所有的情形-除了该请求处理完成之外-这相应于request.readyState属性等于4("Completed")。此时，该函数读取服务器的响应文本。与它的名字所暗示的相反，XmlHttpRequest的输入和输出都不必限于XML格式。特别地，我们的resolveZip.jsp(见源码中的列表1)返回普通文本。如果返回值为"unknown"，那么该函数将假定邮政区号是无效的并且把查找字段(zip)边界颜色置为红色。否则，返回值被用于填充字段state或city，并且zip的边界被赋予一种缺省颜色。<br /></font>
						<br />
						<strong>
								<font style="BACKGROUND-COLOR: #ffffff">XMLHttpRequest-传输对象</font>
						</strong>
				</font>
		</p>
		<p class="postText">
				<font style="BACKGROUND-COLOR: #ffffff" color="#000000">　　让我们返回到我们的XMLHTTPRequest的跨浏览器实现。最后一个列表包含一个HttpRequest()函数-它向上兼容于IE5.0和Mozilla 1.8/FireFox。为简化起见，我们只创建一个微软XMLHTTPRequest对象，而且如果创建失败，我们假定它是Firefox/Mozilla。</font>
		</p>
		<p class="postText">
				<font style="BACKGROUND-COLOR: #ffffff" color="#000000">　　该函数的核心是XMLHTTPRequest-这是一个本机浏览器对象，它为包括HTTP协议的任何东西与服务器之间的通讯提供方便。它允许指定任何HTTP动词，头部和有效载荷，并且能够以异步或同步方式工作。不需要下载也不需要安装任何插件-尽管在IE的情形下，XMLHTTPRequest是一个集成到浏览器内部的ActiveX。因而，"Run ActiveX Control and Plugins"默认IE权限应该正好适合使用它。</font>
		</p>
		<p class="postText">
				<font style="BACKGROUND-COLOR: #ffffff" color="#000000">　　最重要的是，XMLHTTPRequest允许一个到服务器的RPC风格的编程查询而不需要任何页面刷新。它以一种可预测的，可控制的方式来实现此-提供了到HTTP协议的所有细节的完整存取-包括头部和数据的任何定制格式。在以后的文章中，我们将向你展示其它一些业界协议-你可以在这些传输协议(如Web服务和XML-RPC)之上运行-它们极大地简化大规模应用程序的开发和维护。</font>
		</p>
		<p class="postText">
				<font style="BACKGROUND-COLOR: #ffffff">
						<font color="#000000">　　<strong>五.服务器端逻辑</strong></font>
				</font>
		</p>
		<p class="postText">
				<font style="BACKGROUND-COLOR: #ffffff" color="#000000">　　最后，服务器端的resolveZip.jsp被从函数ask()中调用(见所附源码中的列表1)。这个resolveZip.jsp在两种由当前的邮政区号长度所区分的独立的场所下被调用(见zipChanged()函数)。请求参数lookupType的值或者是state或者是city。为简化起见，我们将假定，两个文件state.properties和city.properties都位于服务器中C驱动器的根目录下。resolveZip.jsp逻辑负责用适当的预装载的文件返回查找值。</font>
		</p>
		<p class="postText">
				<font style="BACKGROUND-COLOR: #ffffff" color="#000000">　　我们的支持AJAX的页面现在已经准备好了。</font>
		</p>
		<p class="postText">
				<font style="BACKGROUND-COLOR: #ffffff">
						<font color="#000000">　　<strong>六.远程脚本技术-一种可选方法</strong></font>
				</font>
		</p>
		<p class="postText">
				<font style="BACKGROUND-COLOR: #ffffff" color="#000000">　　一些更旧的AJAX实现是基于所谓的远程脚本技术。这种思想是，用户的行为导致经由IFRAME对服务器进行查询，而服务器用JavaScript作出响应，该脚本一旦到达客户端立即被执行。这与XMLHttpRequest方法相比存在较大的区别，在后者情况下，服务器响应数据而客户端解释数据。其好处是这种解决方案支持更旧的浏览器。</font>
		</p>
		<p class="postText">
				<font style="BACKGROUND-COLOR: #ffffff" color="#000000">　　基于IFRAME示例的HTML部分(见所附源码中的列表2)与我们在XMLHTTPRequest场合下所用的极相似，但是这次我们将引入另外一个IFRAME元素-controller:</font>
		</p>
		<p class="postText">
				<font face="Verdana">
						<font color="#000000">
								<font style="BACKGROUND-COLOR: #dddddd">Zip:＜input id="zipcode" type="text" maxlength="5" onKeyUp="zipChanged()"<br />style="width:60" size="20"/＞<br />City: ＜input id="city" disabled maxlength="32" style="width:160" size="20"/＞<br />State:＜input id="state" disabled maxlength="2" style="width:30" size="20"/＞<br />＜iframe id="controller" style="visibility:hidden;width:0;height:0"＞＜/iframe＞</font>
						</font>
				</font>
		</p>
		<p class="postText">
				<font style="BACKGROUND-COLOR: #ffffff" color="#000000">　　我们保持每次击键都调用zipChanged()一次，但是这一次，从zipChanged()中被调用的函数ask()(见所附源码中的列表3)负责设置IFRAME的src属性，而不是调用一个XMLHTTPRequest:</font>
		</p>
		<p class="postText">
				<font face="Verdana">
						<font color="#000000">
								<font style="BACKGROUND-COLOR: #dddddd">function ask(url， fieldToFill， lookupField){<br />　var controller = document.getElementById("controller");<br />　controller.src= url+"&amp;field="+fieldToFill.id+"&amp;zip="+lookupField.id;<br />}</font>
						</font>
				</font>
		</p>
		<p class="postText">
				<font style="BACKGROUND-COLOR: #ffffff" color="#000000">　　服务器端逻辑由一个粗略的resolveZip.jsp(见所附源码中的列表4)所描述。它与它的XMLHTTPRequest对应物相区别-它返回JavaScript语句，这些语句设置变量字段lookup和city的全局值，而且一旦它到达浏览器即从全局窗口的执行上下文中调用函数response()。</font>
		</p>
		<p class="postText">
				<font style="BACKGROUND-COLOR: #ffffff" color="#000000">　　函数response()是一修改版本的handleResponse()-这一函数可以免于处理未完成的请求(详见本文所附源码中的列表2)。</font>
		</p>
		<p class="postText">
				<font style="BACKGROUND-COLOR: #ffffff">
						<font color="#000000">　　<strong>七. 难题</strong></font>
				</font>
		</p>
		<p class="postText">
				<font style="BACKGROUND-COLOR: #ffffff" color="#000000">　　为简化起见，让我们"俯看"一下在我们的示例代码中的一些重要的问题:</font>
		</p>
		<p class="postText">
				<font style="BACKGROUND-COLOR: #ffffff" color="#000000">　　1.事实-XMLHTTPRequest对象实例和回调函数调用在被使用以后并没被破坏-在每次调用后这有可能导致内存泄漏。适当编写的代码应该破坏或重用对象池中的这些实例。而且，客户端必须使用与服务器软件相同的对象管理技术。</font>
		</p>
		<p class="postText">
				<font style="BACKGROUND-COLOR: #ffffff" color="#000000">　　2.在大多数情况下，错误往往得不到有效处理。例如，在方法ask()中对request.open()的调用可能引发一个异常，这是必须要捕获和处理的，即使在浏览器中没有设置JavaScript异常自动捕获功能。而handleResponse()函数又是另外一个例子。它必须要为可能的服务器端和通讯错误而检查headers和responseText值。在发生错误的情况下，它必须尽力恢复并/或者报告错误。正确开发的AJAX应用程序要尽可能避免"提交"松散的数据，因为往往存在线路断开和其它低级通讯的问题-所以这些程序必须建立一个强壮的和自恢复的框架为此提供支持。</font>
		</p>
		<p class="postText">
				<font style="BACKGROUND-COLOR: #ffffff" color="#000000">　　3.当前服务器端框架提供相当多的功能-它们可以与一种自由刷新方法和谐相处。例如，让我们考虑一个定制的在指定时间内的服务器端认证的问题。在这种情况下，我们必须拦截到XMLHTTPRequest调用的安全系统响应，显示登录屏幕，然后在用户被认证后重新发出请求。</font>
		</p>
		<p class="postText">
				<font style="BACKGROUND-COLOR: #ffffff" color="#000000">　　所有的这些问题只是一些典型的用低级API工作的任何应用程序代码，而且所有这些问题都能被解决。好消息是，解决这些问题所需要的技术十分相似于大多数Java开发技术，如Web服务，定制标签和XML/XSLT。唯一的区别在于，现在这些技术以下列形式用于客户端:</font>
		</p>
		<p class="postText">
				<font style="BACKGROUND-COLOR: #ffffff" color="#000000">　　·Web服务-使用SOAP/REST/RPC等简单通讯标准</font>
		</p>
		<p class="postText">
				<font style="BACKGROUND-COLOR: #ffffff" color="#000000">　　·客户端定制标签-打包丰富的客户端控件并集成AJAX功能</font>
		</p>
		<p class="postText">
				<font style="BACKGROUND-COLOR: #ffffff" color="#000000">　　·数据操作-基于XML和基于XSLT技术</font>
		</p>
		<p class="postText">
				<font style="BACKGROUND-COLOR: #ffffff">
						<font color="#000000">　　<strong>八. 小结</strong></font>
				</font>
		</p>
		<p class="postText">
				<font style="BACKGROUND-COLOR: #ffffff" color="#000000">　　AJAX方法能够向人们提供一种与桌面应用程序相同的丰富的互联网体验。但是，我们必须有选择地使用AJAX技术，如当你仍在线购物时，你绝对不想让你的信用卡通过后台处理就悄悄地开始付款。AJAX会成为一种持续的动力吗?我们当然希望这样。在过去的五年时间内我们一直在努力开发AJAX应用程序并且能证明它是健全并且很有效的。然而，它要求一个开发者必须精通大量技术而不是在传统的"click-refresh"Web应用程序中所使用的那些。</font>
		</p>
<img src ="http://www.blogjava.net/zhangrenquan/aggbug/39203.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-04-04 17:04 <a href="http://www.blogjava.net/zhangrenquan/articles/39203.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>举例学习ajax</title><link>http://www.blogjava.net/zhangrenquan/articles/39202.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Tue, 04 Apr 2006 09:02:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/39202.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/39202.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/39202.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/39202.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/39202.html</trackback:ping><description><![CDATA[
		<p>示例一:该示例返回每个Node 的value.</p>
		<p>&lt;html&gt;<br />&lt;body&gt;<br />&lt;script type="text/vbscript"&gt;</p>
		<p>set xmlDoc=CreateObject("Microsoft.XMLDOM")<br />xmlDoc.async="false"<br />xmlDoc.load("note.xml")</p>
		<p>for each x in xmlDoc.documentElement.childNodes<br /> document.write(x.childnodes(0).nodeValue &amp; "&lt;br /&gt;")<br />next<br />&lt;/script&gt;<br />&lt;/body&gt;<br />&lt;/html</p>
		<p>准备一个note.xml文件,很简单几行:</p>
		<p>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br />&lt;!-- Edited with XML Spy v4.2 --&gt;<br />&lt;note time="12:03:46"&gt;<br />  &lt;to&gt;Tove&lt;/to&gt;<br />  &lt;from&gt;Jani&lt;/from&gt;<br />  &lt;heading&gt;Reminder&lt;/heading&gt;<br />  &lt;body&gt;Don't forget me this weekend!&lt;/body&gt;<br />&lt;/note&gt;</p>
		<p>示例二:创建一个XMLHttpRequest.</p>
		<p>&lt;html&gt;<br />&lt;head&gt;<br />&lt;script type="text/javascript"&gt;<br />var xmlhttp</p>
		<p>function loadXMLDoc(url)<br />{<br />// code for Mozilla, etc.<br />if (window.XMLHttpRequest)<br />  {<br />  xmlhttp=new XMLHttpRequest()<br />  xmlhttp.onreadystatechange=state_Change<br />  xmlhttp.open("GET",url,true)<br />  xmlhttp.send(null)<br />  }<br />// code for IE<br />else if (window.ActiveXObject)<br />  {<br />  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")<br />    if (xmlhttp)<br />    {<br />    xmlhttp.onreadystatechange=state_Change<br />    xmlhttp.open("GET",url,true)<br />    xmlhttp.send()<br />    }<br />  }<br />}</p>
		<p>function state_Change()<br />{<br />// if xmlhttp shows "loaded"<br />if (xmlhttp.readyState==4)<br />  {<br />  // if "OK"<br />  if (xmlhttp.status==200)<br />  {<br />  alert("XML data OK")<br />  document.getElementById('A1').innerHTML=xmlhttp.status<br />  document.getElementById('A2').innerHTML=xmlhttp.statusText<br />  document.getElementById('A3').innerHTML=xmlhttp.responseText<br />  }<br />  else<br />  {<br />  alert("Problem retrieving XML data:" + xmlhttp.statusText)<br />  }<br />  }<br />}</p>
		<p>&lt;/script&gt;<br />&lt;/head&gt;</p>
		<p>&lt;body script_onload="loadXMLDoc('note.xml')"&gt;<br />&lt;h2&gt;Using the HttpRequest Object&lt;/h2&gt;</p>
		<p>&lt;p&gt;&lt;b&gt;status:&lt;/b&gt;<br />&lt;span id="A1"&gt;&lt;/span&gt;<br />&lt;/p&gt;</p>
		<p>&lt;p&gt;&lt;b&gt;status text:&lt;/b&gt;<br />&lt;span id="A2"&gt;&lt;/span&gt;<br />&lt;/p&gt;</p>
		<p>&lt;p&gt;&lt;b&gt;response:&lt;/b&gt;<br />&lt;br&gt;&lt;span id="A3"&gt;&lt;/span&gt;<br />&lt;/p&gt;</p>
		<p>&lt;/body&gt;<br />&lt;/html&gt;<br />对着代码 和运行结果看,很容易熟悉XMLHttpRequest对象.</p>
		<p>function loadXMLDoc(url)中根据不同的客户端创建XMLHttpRequest对象,然后对传入的url向Server发送GET请求,true参数是为了表明要异步请求.完了之后 ,state_Change()被调用,该方法就是得到Server返回的状态.并传给网页显示出来.</p>
<img src ="http://www.blogjava.net/zhangrenquan/aggbug/39202.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-04-04 17:02 <a href="http://www.blogjava.net/zhangrenquan/articles/39202.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>掌握 ajax，第 1 部分: ajax 简介 (转载)</title><link>http://www.blogjava.net/zhangrenquan/articles/39198.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Tue, 04 Apr 2006 08:46:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/39198.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/39198.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/39198.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/39198.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/39198.html</trackback:ping><description><![CDATA[
		<p>         五年前，如果不知道 xml，您就是一只无人重视的丑小鸭。十八个月前，ruby 成了关注的中心，不知道 ruby 的程序员只能坐冷板凳了。今天，如果想跟上最新的技术时尚，那您的目标就是 ajax。</p>
		<p>　　但是，ajax 不仅仅是一种时尚，它是一种构建网站的强大方法，而且不像学习一种全新的语言那样困难。</p>
		<p>　　但在详细探讨 ajax 是什么之前，先让我们花几分钟了解 ajax 做什么。目前，编写应用程序时有两种基本的选择：</p>
		<p>　　桌面应用程序，web 应用程序。两者是类似的，桌面应用程序通常以 cd 为介质（有时候可从网站下载）并完全安装到您的计算机上。桌面应用程序可能使用互联网下载更新，但运行这些应用程序的代码在桌面计算机上。web 应用程序运行在某处的 web 服务器上 —— 毫不奇怪，要通过 web 浏览器访问这种应用程序。</p>
		<p>　　不过，比这些应用程序的运行代码放在何处更重要的是，应用程序如何运转以及如何与其进行交互。桌面应用程序一般很快（就在您的计算机上运行，不用等待互联网连接），具有漂亮的用户界面（通常和操作系统有关）和非凡的动态性。可以单击、选择、输入、打开菜单和子菜单、到处巡游，基本上不需要等待。</p>
		<p>　　另一方面，web 应用程序是最新的潮流，它们提供了在桌面上不能实现的服务（比如 amazon.com 和 ebay）。但是，伴随着 web 的强大而出现的是等待，等待服务器响应，等待屏幕刷新，等待请求返回和生成新的页面。</p>
		<p>　　显然这样说过于简略了，但基本的概念就是如此。您可能已经猜到，ajax 尝试建立桌面应用程序的功能和交互性，与不断更新的 web 应用程序之间的桥梁。可以使用像桌面应用程序中常见的动态用户界面和漂亮的控件，不过是在 web 应用程序中。</p>
		<p>　　还等什么呢？我们来看看 ajax 如何将笨拙的 web 界面转化成能迅速响应的 ajax 应用程序吧。</p>
		<p>　　老技术，新技巧</p>
		<p>　　在谈到 ajax 时，实际上涉及到多种技术，要灵活地运用它必须深入了解这些不同的技术（本系列的头几篇文章将分别讨论这些技术）。好消息是您可能已经非常熟悉其中的大部分技术，更好的是这些技术都很容易学习，并不像完整的编程语言（如 java 或 ruby）那样困难。</p>
		<p>　　ajax 的定义</p>
		<p>　　顺便说一下，ajax 是 asynchronous javascript and xml（以及 dhtml 等）的缩写。这个短语是 adaptive path 的 jesse james garrett 发明的，按照 jesse 的解释，这不是个首字母缩写词。 </p>
		<p>　　下面是 ajax 应用程序所用到的基本技术：</p>
		<p>html 用于建立 web 表单并确定应用程序其他部分使用的字段。 <br />javascript 代码是运行 ajax 应用程序的核心代码，帮助改进与服务器应用程序的通信。 <br />dhtml 或 dynamic html，用于动态更新表单。我们将使用div、span和其他动态 html 元素来标记 html。 <br />文档对象模型 dom 用于（通过 javascript 代码）处理 html 结构和（某些情况下）服务器返回的 xml。 </p>
		<p>　　我们来进一步分析这些技术的职责。以后的文章中我将深入讨论这些技术，目前只要熟悉这些组件和技术就可以了。对这些代码越熟悉，就越容易从对这些技术的零散了解转变到真正把握这些技术（同时也真正打开了 web 应用程序开发的大门）。</p>
		<p>　　xmlhttprequest 对象</p>
		<p>　　要了解的一个对象可能对您来说也是最陌生的，即xmlhttprequest。这是一个 javascript 对象，创建该对象很简单，如清单 1 所示。</p>
		<p>　　清单 1. 创建新的 xmlhttprequest 对象</p>
		<p class="code">&lt;script language="javascript" type="text/javascript"&gt;<br />var xmlhttp = new xmlhttprequest();<br />&lt;/script&gt;</p>
		<p>　　下一期文章中将进一步讨论这个对象，现在要知道这是处理所有服务器通信的对象。继续阅读之前，先停下来想一想：通过xmlhttprequest对象与服务器进行对话的是 javascript 技术。这不是一般的应用程序流，这恰恰是 ajax 的强大功能的来源。</p>
		<p>　　在一般的 web 应用程序中，用户填写表单字段并单击 submit 按钮。然后整个表单发送到服务器，服务器将它转发给处理表单的脚本（通常是 php 或 java，也可能是 cgi 进程或者类似的东西），脚本执行完成后再发送回全新的页面。该页面可能是带有已经填充某些数据的新表单的 html，也可能是确认页面，或者是具有根据原来表单中输入数据选择的某些选项的页面。当然，在服务器上的脚本或程序处理和返回新表单时用户必须等待。屏幕变成一片空白，等到服务器返回数据后再重新绘制。这就是交互性差的原因，用户得不到立即反馈，因此感觉不同于桌面应用程序。</p>
		<p>　　ajax 基本上就是把 javascript 技术和xmlhttprequest对象放在 web 表单和服务器之间。当用户填写表单时，数据发送给一些 javascript 代码而不是直接发送给服务器。相反，javascript 代码捕获表单数据并向服务器发送请求。同时用户屏幕上的表单也不会闪烁、消失或延迟。换句话说，javascript 代码在幕后发送请求，用户甚至不知道请求的发出。更好的是，请求是异步发送的，就是说 javascript 代码（和用户）不用等待服务器的响应。因此用户可以继续输入数据、滚动屏幕和使用应用程序。</p>
		<p>　　然后，服务器将数据返回 javascript 代码（仍然在 web 表单中），后者决定如何处理这些数据。它可以迅速更新表单数据，让人感觉应用程序是立即完成的，表单没有提交或刷新而用户得到了新数据。javascript 代码甚至可以对收到的数据执行某种计算，再发送另一个请求，完全不需要用户干预！这就是xmlhttprequest的强大之处。它可以根据需要自行与服务器进行交互，用户甚至可以完全不知道幕后发生的一切。结果就是类似于桌面应用程序的动态、快速响应、高交互性的体验，但是背后又拥有互联网的全部强大力量。</p>
		<p>　　加入一些 javascript</p>
		<p>　　得到xmlhttprequest的句柄后，其他的 javascript 代码就非常简单了。事实上，我们将使用 javascript 代码完成非常基本的任务：</p>
		<p>获取表单数据：javascript 代码很容易从 html 表单中抽取数据并发送到服务器。 <br />修改表单上的数据：更新表单也很简单，从设置字段值到迅速替换图像。 <br />解析 html 和 xml：使用 javascript 代码操纵 dom（请参阅 下一节），处理 html 表单服务器返回的 xml 数据的结构。 </p>
		<p>　　对于前两点，需要非常熟悉getelementbyid()方法，如清单 2 所示。</p>
		<p>　　清单 2. 用 javascript 代码捕获和设置字段值</p>
		<p class="code">/ get the value of the "phone" field and stuff it in a variable called phone<br />var phone = document.getelementbyid("phone").value;<br />/ set some values on a form using an array called response<br />document.getelementbyid("order").value = response[0];<br />document.getelementbyid("address").value = response[1];</p>
		<p>　　这里没有特别需要注意的地方，真是好极了！您应该认识到这里并没有非常复杂的东西。只要掌握了xmlhttprequest，ajax 应用程序的其他部分就是如清单 2 所示的简单 javascript 代码了，混合有少量的 html。同时，还要用一点儿 dom，我们就来看看吧。</p>
		<p>　　以 dom 结束</p>
		<p>　　最后还有 dom，即文档对象模型。可能对有些读者来说 dom 有点儿令人生畏，html 设计者很少使用它，即使 javascript 程序员也不大用到它，除非要完成某项高端编程任务。大量使用 dom 的是复杂的 java 和 c/c++ 程序，这可能就是 dom 被认为难以学习的原因。</p>
		<p>　　幸运的是，在 javascript 技术中使用 dom 很容易，也非常直观。现在，按照常规也许应该说明如何使用 dom，或者至少要给出一些示例代码，但这样做也可能误导您。即使不理会 dom，仍然能深入地探讨 ajax，这也是我准备采用的方法。以后的文章将再次讨论 dom，现在只要知道可能需要 dom 就可以了。当需要在 javascript 代码和服务器之间传递 xml 和改变 html 表单的时候，我们再深入研究 dom。没有它也能做一些有趣的工作，因此现在就把 dom 放到一边吧。</p>
		<p>　　获取 request 对象</p>
		<p>　　有了上面的基础知识后，我们来看看一些具体的例子。xmlhttprequest是 ajax 应用程序的核心，而且对很多读者来说可能还比较陌生，我们就从这里开始吧。从清单 1 可以看出，创建和使用这个对象非常简单，不是吗？等一等。</p>
		<p>　　还记得几年前的那些讨厌的浏览器战争吗？没有一样东西在不同的浏览器上得到同样的结果。不管您是否相信，这些战争仍然在继续，虽然规模较小。但令人奇怪的是，xmlhttprequest成了这场战争的牺牲品之一。因此获得xmlhttprequest对象可能需要采用不同的方法。下面我将详细地进行解释。</p>
		<p>　　使用 microsoft 浏览器</p>
		<p>　　microsoft 浏览器 internet explorer 使用 msxml 解析器处理 xml（可以通过参考资料进一步了解 msxml）。因此如果编写的 ajax 应用程序要和 internet explorer 打交道，那么必须用一种特殊的方式创建对象。</p>
		<p>　　但并不是这么简单。根据 internet explorer 中安装的 javascript 技术版本不同，msxml 实际上有两种不同的版本，因此必须对这两种情况分别编写代码。请参阅清单 3，其中的代码在 microsoft 浏览器上创建了一个xmlhttprequest。</p>
		<p>　　清单 3. 在 microsoft 浏览器上创建 xmlhttprequest 对象</p>
		<p class="code">var xmlhttp = false;<br />try {<br /> xmlhttp = new activexobject("msxml2.xmlhttp");<br />} catch (e) {<br /> try {<br />    xmlhttp = new activexobject("microsoft.xmlhttp");<br /> } catch (e2) {<br />    xmlhttp = false;<br /> }<br />}</p>
		<p>　　您对这些代码可能还不完全理解，但没有关系。当本系列文章结束的时候，您将对 javascript 编程、错误处理、条件编译等有更深的了解。现在只要牢牢记住其中的两行代码：</p>
		<p class="code">xmlhttp = new activexobject("msxml2.xmlhttp");</p>
		<p>　和</p>
		<p class="code">xmlhttp = new activexobject("microsoft.xmlhttp");。</p>
		<p>　　这两行代码基本上就是尝试使用一个版本的 msxml 创建对象，如果失败则使用另一个版本创建该对象。不错吧？如果都不成功，则将xmlhttp变量设为 false，告诉您的代码出现了问题。如果出现这种情况，可能是因为安装了非 microsoft 浏览器，需要使用不同的代码。</p>
		<p>　　处理 mozilla 和非 microsoft 浏览器</p>
		<p>　　如果选择的浏览器不是 internet explorer，或者为非 microsoft 浏览器编写代码，就需要使用不同的代码。事实上就是清单 1 所示的一行简单代码：</p>
		<p class="code">var xmlhttp = new xmlhttprequest object;。</p>
		<p>　　这行简单得多的代码在 mozilla、firefox、safari、opera 以及基本上所有以任何形式或方式支持 ajax 的非 microsoft 浏览器中，创建了xmlhttprequest对象。</p>
		<p>　　结合起来</p>
		<p>　　关键是要支持所有浏览器。谁愿意编写一个只能用于 internet explorer 或者非 microsoft 浏览器的应用程序呢？或者更糟，要编写一个应用程序两次？当然不！因此代码要同时支持 internet explorer 和非 microsoft 浏览器。清单 4 显示了这样的代码。</p>
		<p>　　清单 4. 以支持多种浏览器的方式创建 xmlhttprequest 对象</p>
		<p class="code">/* create a new xmlhttprequest object to talk to the web server */<br />var xmlhttp = false;<br />/*@cc_on @*/<br />/*@if (@_jscript_version &gt;= 5)<br />try {<br /> xmlhttp = new activexobject("msxml2.xmlhttp");<br />} catch (e) {<br /> try {<br />    xmlhttp = new activexobject("microsoft.xmlhttp");<br /> } catch (e2) {<br />    xmlhttp = false;<br /> }<br />}<br />@end @*/<br /> <br />if (!xmlhttp &amp;&amp; typeof xmlhttprequest != 'undefined') {<br /> xmlhttp = new xmlhttprequest();<br />}</p>
		<p>　　现在先不管那些注释掉的奇怪符号，如@cc_on，这是特殊的 javascript 编译器命令，将在下一期针对xmlhttprequest的文章中详细讨论。这段代码的核心分为三步：</p>
		<p>　　1.       建立一个变量xmlhttp来引用即将创建的xmlhttprequest对象。<br />　　2.       尝试在 microsoft 浏览器中创建该对象：<br />　　o        尝试使用msxml2.xmlhttp对象创建它。<br />　　o        如果失败，再尝试microsoft.xmlhttp对象。<br />　　3.       如果仍然没有建立xmlhttp，则以非 microsoft 的方式创建该对象。</p>
		<p>　　最后，xmlhttp应该引用一个有效的xmlhttprequest对象，无论运行什么样的浏览器。</p>
		<p>　　关于安全性的一点说明</p>
		<p>　　安全性如何呢？现在浏览器允许用户提高他们的安全等级，关闭 javascript 技术，禁用浏览器中的任何选项。在这种情况下，代码无论如何都不会工作。此时必须适当地处理问题，这需要单独的一篇文章来讨论，要放到以后了（这个系列够长了吧？不用担心，读完之前也许您就掌握了）。现在要编写一段健壮但不够完美的代码，对于掌握 ajax 来说就很好了。以后我们还将讨论更多的细节。</p>
		<p>　　ajax 世界中的请求/响应</p>
		<p>　　现在我们介绍了 ajax，对xmlhttprequest对象以及如何创建它也有了基本的了解。如果阅读得很仔细，您可能已经知道与服务器上的 web 应用程序打交道的是 javascript 技术，而不是直接提交给那个应用程序的 html 表单。</p>
		<p>　　还缺少什么呢？到底如何使用xmlhttprequest。因为这段代码非常重要，您编写的每个 ajax 应用程序都要以某种形式使用它，先看看 ajax 的基本请求/响应模型是什么样吧。</p>
		<p>　　发出请求</p>
		<p>　　您已经有了一个崭新的xmlhttprequest对象，现在让它干点活儿吧。首先需要一个 web 页面能够调用的 javascript 方法（比如当用户输入文本或者从菜单中选择一项时）。接下来就是在所有 ajax 应用程序中基本都雷同的流程：</p>
		<p>1.       从 web 表单中获取需要的数据。<br />2.       建立要连接的 url。<br />3.       打开到服务器的连接。<br />4.       设置服务器在完成后要运行的函数。<br />5.       发送请求。</p>
		<p>　　清单 5 中的示例 ajax 方法就是按照这个顺序组织的：</p>
		<p>　　清单 5. 发出 ajax 请求</p>
		<p class="code">function callserver() {<br /> / get the city and state from the web form<br /> var city = document.getelementbyid("city").value;<br /> var state = document.getelementbyid("state").value;<br /> / only go on if there are values for both fields<br /> if ((city == null) || (city == "")) return;<br /> if ((state == null) || (state == "")) return;<br /> <br /> / build the url to connect to<br /> var url = "/scripts/getzipcode.php?city=" + escape(city) + "&amp;state=" + escape(state);<br /> <br /> / open a connection to the server<br /> xmlhttp.open("get", url, true);<br /> <br /> / setup a function for the server to run when it's done<br /> xmlhttp.onreadystatechange = updatepage;<br /> <br /> / send the request<br /> xmlhttp.send(null);<br />}</p>
		<p>　　其中大部分代码意义都很明确。开始的代码使用基本 javascript 代码获取几个表单字段的值。然后设置一个 php 脚本作为链接的目标。要注意脚本 url 的指定方式，city 和 state（来自表单）使用简单的 get 参数附加在 url 之后。</p>
		<p>　　然后打开一个连接，这是您第一次看到使用xmlhttprequest。其中指定了连接方法（get）和要连接的 url。最后一个参数如果设为true，那么将请求一个异步连接（这就是 ajax 的由来）。如果使用false，那么代码发出请求后将等待服务器返回的响应。如果设为true，当服务器在后台处理请求的时候用户仍然可以使用表单（甚至调用其他 javascript 方法）。</p>
		<p>　　xmlhttp（要记住，这是xmlhttprequest对象实例）的onreadystatechange属性可以告诉服务器在运行完成后（可能要用五分钟或者五个小时）做什么。因为代码没有等待服务器，必须让服务器知道怎么做以便您能作出响应。在这个示例中，如果服务器处理完了请求，一个特殊的名为updatepage()的方法将被触发。</p>
		<p>　　最后，使用值null调用send()。因为已经在请求 url 中添加了要发送给服务器的数据（city 和 state），所以请求中不需要发送任何数据。这样就发出了请求，服务器按照您的要求工作。</p>
		<p>　　如果没有发现任何新鲜的东西，您应该体会到这是多么简单明了！除了牢牢记住 ajax 的异步特性外，这些内容都相当简单。应该感激 ajax 使您能够专心编写漂亮的应用程序和界面，而不用担心复杂的 http 请求/响应代码。</p>
		<p>　　清单 5 中的代码说明了 ajax 的易用性。数据是简单的文本，可以作为请求 url 的一部分。用 get 而不是更复杂的 post 发送请求。没有 xml 和要添加的内容头部，请求体中没有要发送的数据；换句话说，这就是 ajax 的乌托邦。</p>
		<p>　　不用担心，随着本系列文章的展开，事情会变得越来越复杂。您将看到如何发送 post 请求、如何设置请求头部和内容类型、如何在消息中编码 xml、如何增加请求的安全性，可以做的工作还有很多！暂时先不用管那些难点，掌握好基本的东西就行了，很快我们就会建立一整套的 ajax 工具库。</p>
		<p>　　处理响应</p>
		<p>　　现在要面对服务器的响应了。现在只要知道两点：</p>
		<p>　　什么也不要做，直到xmlhttp.readystate属性的值等于 4。 服务器将把响应填充到xmlhttp.responsetext属性中。 </p>
		<p>　　其中的第一点，即就绪状态，将在下一篇文章中详细讨论，您将进一步了解 http 请求的阶段，可能比您设想的还多。现在只要检查一个特定的值（4）就可以了（下一期文章中还有更多的值要介绍）。第二点，使用xmlhttp.responsetext属性获得服务器的响应，这很简单。清单 6 中的示例方法可供服务器根据清单 5 中发送的数据调用。</p>
		<p>　　清单 6. 处理服务器响应</p>
		<p class="code">function updatepage() {<br /> if (xmlhttp.readystate == 4) {<br />    var response = xmlhttp.responsetext;<br />    document.getelementbyid("zipcode").value = response;<br /> }<br />}</p>
		<p>　　这些代码同样既不难也不复杂。它等待服务器调用，如果是就绪状态，则使用服务器返回的值（这里是用户输入的城市和州的 zip 编码）设置另一个表单字段的值。于是包含 zip 编码的zipcode字段突然出现了，而用户没有按任何按钮！这就是前面所说的桌面应用程序的感觉。快速响应、动态感受等等，这些都只因为有了小小的一段 ajax 代码。</p>
		<p>　　细心的读者可能注意到zipcode是一个普通的文本字段。一旦服务器返回 zip 编码，updatepage()方法就用城市/州的 zip 编码设置那个字段的值，用户就可以改写该值。这样做有两个原因：保持例子简单，说明有时候可能希望用户能够修改服务器返回的数据。要记住这两点，它们对于好的用户界面设计来说很重要。</p>
		<p>　　连接 web 表单</p>
		<p>　　还有什么呢？实际上没有多少了。一个 javascript 方法捕捉用户输入表单的信息并将其发送到服务器，另一个 javascript 方法监听和处理响应，并在响应返回时设置字段的值。所有这些实际上都依赖于调用第一个 javascript 方法，它启动了整个过程。最明显的办法是在 html 表单中增加一个按钮，但这是 2001 年的办法，您不这样认为吗？还是像清单 7 这样利用 javascript 技术吧。</p>
		<p>　　清单 7. 启动一个 ajax 过程</p>
		<p class="code">&lt;form&gt;<br /> &lt;p&gt;city: &lt;input type="text" name="city" id="city" size="25" <br />       onchange="callserver();" /&gt;&lt;/p&gt;<br /> &lt;p&gt;state: &lt;input type="text" name="state" id="state" size="25" <br />       onchange="callserver();" /&gt;&lt;/p&gt;<br /> &lt;p&gt;zip code: &lt;input type="text" name="zipcode" id="city" size="5" /&gt;&lt;/p&gt;<br />&lt;/form&gt;</p>
		<p>　　如果感觉这像是一段相当普通的代码，那就对了，正是如此！当用户在 city 或 state 字段中输入新的值时，callserver()方法就被触发，于是 ajax 开始运行了。有点儿明白怎么回事了吧？好，就是如此！</p>
<img src ="http://www.blogjava.net/zhangrenquan/aggbug/39198.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-04-04 16:46 <a href="http://www.blogjava.net/zhangrenquan/articles/39198.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AJAX学习资料</title><link>http://www.blogjava.net/zhangrenquan/articles/39182.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Tue, 04 Apr 2006 08:06:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/39182.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/39182.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/39182.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/39182.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/39182.html</trackback:ping><description><![CDATA[
		<p>
				<strong>Thinking in AJAX（一）</strong>
		</p>
		<p>AJAX - X众所周知，<font color="#0000ff"><strong>异步交互</strong>、<strong>JavaScript脚本</strong>和<strong>XML封装数据</strong>是AJAX的三大特征</font>。其实，在实际应用中，不需要牢牢套死这三条大律，在我看来，AJAX - X，即去掉用XML封装数据，也不失为一种好的设计思路，如果应用恰当，更显轻盈步伐和巧妙思路。</p>
		<p>一般读取AJAX返回的XML结构的数据时<strong>使用XMLHttp的responseXML对象属性</strong>，同时，XMLHttp也提供了另外一个属性，即ResponseText，通过这个属性，XMLHttp可以接受来自服务器的文本结构的字符串信息。去掉XML的AJAX可以使用ResponseText这个对象属性，很灵活的操控返回数据的格式，可以自定义格式，比如我通常喜欢用c语言的那种文件流方式定义返回的字符串结构，有文件头和具体的文件信息实体，文件头分为状态信息以及文件字符长度，我摒弃了文件字符长度的定义，规定死接受的ResponseTex字符串中的第一位为状态码，比如设定常量值0表示一起正常，非0的数字表示不正常，甚至有错误等。如果有非0值，程序自动取第二位起到257位(长度为256)的字符串组成为状态信息，从258位开始到末尾的字符串就是服务器返回的正常结果信息。<br />substring(0,1)取状态码<br />substring(1,256)取服务器错误信息(错误信息不够256位用空格补齐，取到数据后进行Trim处理)<br />substring(256,末尾)取服务器返回的数据信息<br />三次substring即完成了一个简单但完整的交互工作。比起XML解析组件来说要快的多。</p>
		<p>用ResponseText比封装为XML处理数据快和简单是一个原因，另一个原因是可操控性更大更灵活，打开Google Suggest，在搜索框输入字符可以给你给出拼写提示，Suggest就是应用了AJAX技术，不过它在从服务器返回数据时并没有使用XML封装，也没有自定义ResponseText格式，而是直接将返回代码组织成js脚本，通过浏览器返回后直接执行，如eval(XMLHttp.ResponseText)这样的方式进行执行，<a href="http://www.google.com/complete/search?hl=en&amp;js=true&amp;qu=ajax" target="_blank"><font color="#0033ff"><a href="http://www.google.com/complete/search?hl=en&amp;js=true&amp;qu=ajax" target="_blank">http://www.google.com/complete/search?hl=en&amp;js=true&amp;qu=ajax</a></font></a> 通过这个链接你可以看到Suggest利用AJAX得到的返回数据，此页面是在Google Suggest的搜索框中输入"AJAX"后得系统动态返回的数据。</p>
		<div class="quote">sendRPCDone(frameElement, "ajax", new Array("ajax", "ajax amsterdam", "ajax fc", "ajax ontario", "ajax grips", "ajax football club", "ajax public library", "ajax football", "ajax soccer", "ajax pickering transit"), new Array("3,840,000 results", "502,000 results", "710,000 results", "275,000 results", "8,860 results", "573,000 results", "40,500 results", "454,000 results", "437,000 results", "10,700 results"), new Array("")); <br /></div>
		<p>浏览器段拿到这段代码后直接eval就可以了，至于sendRPCDone这个函数，那当然得实现定义后并装载到页面中啦。XMLHttp这个名字以XML开头，让很多人禁锢了思想和创意，完全抛弃X，你也可以做出纯AJAX的实例来。</p>
		<p>当然，对于大型系统来讲，为了保持数据接口的一致和整齐，还是用XML来传递更严谨更统一点，听说微软已经发起了重写XML Parse组件的号召，估计下一个版本的XMLHttp还是DOMParser还是MSXML2.DOMDocument都会大大提高效率，减少资源占用的。</p>
		<p>
				<strong>Thinking in AJAX(二) —— 基于AJAX的WEB设计</strong>
		</p>
		<p>
				<strong>一、AJAX最值得称赞的是异步交互，而不是无刷新</strong>
		</p>
		<p>很多人都看好AJAX无刷新的技术，以至于认同AJAX就是用来做无刷新的。这个认识是错误的，什么是无刷新？无刷新就是页面无需重载，那什么又是异步交互？异步交互就是一个简单的多线程，当你在一个blog里看文章时，同时也可以利用AJAX进行无刷新的回复提交，看起来虽然也是无刷新，但这里最重要的是异步，即你能一边看文章，一边又能向服务器提交你的回复信息，利用好这个异步，才能算是掌握了AJAX的精髓。很多场合，无刷新是呈现给用户的视觉体验，而异步交互却是默默无闻的工作在台后，这种情况导致大多数人的错误理解了AJAX的权重之分。</p>
		<h3>
				<font size="2">二、推荐在WEB上轻量级的应用AJAX</font>
		</h3>
		<br />
		<div>
				<img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://photos22.flickr.com/33335029_bb2b7d5a18_o.png" onload="return imgzoom(this,550)" />
				<br />
				<img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://photos22.flickr.com/33335000_e87bb720cc_o.png" onload="return imgzoom(this,550)" />
				<br />
				<img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://photos23.flickr.com/33335001_99b5084c07_o.png" onload="return imgzoom(this,550)" />
		</div>著名的图片存储网站<a href="http://www.duduwolf.com/post/数据交互" target="_blank"><font color="#0000ff">Flickr</font></a>利用AJAX可谓出神入化。我之所以这么说，是因为我认为Flickr深知AJAX的利与弊，并且牢牢抓住自己的网站的功能特点，并没有因AJAX而AJAX，而是架驱于技术至上，让AJAX融于网站之中，为网站提供了更好的功能服务。如Flickr中无论是在多图列表页面还是单图详细页面，修改图片的标题和描述都应用了AJAX技术，让用户无需跳转到单独的编辑页面中，编辑后单击保存，亦使用了异步交互的方式进行数据提交，这时，页面上显示一个Loading字符外，其他部分不受任何影响，可谓太贴心的服务。 <br /><p></p><p></p><div><img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://photos23.flickr.com/33335047_3deafb867f_o.png" onload="return imgzoom(this,550)" /></div>再如基于Tag的专业Blog搜索服务商<a href="http://www.technorati.com/" target="_blank"><font color="#0000ff">Technorati</font></a>也使用了AJAX，在搜索某个Tag时，页面主导部分会即刻显示所有Technorati数据库中查询到的数据条目，在左边的侧边栏上会显示两个Loading图标，过一会儿，这两个Loading就会显示具体的内容了，显示的是此Tag相关的Flickr的图片和书签服务网站(Furl&amp;del.icio.us)的链接，因为这两部分内容是取自其他网站，如果由服务器统一先取得数据在一同显示到页面时，会受到网速影响而变慢，通过AJAX的异步交互方式首先立即显示本地数据，然后由客户端去和Flickr、Furl、del.icio.us打交道分别取得它们的数据，即节约了流量带宽又不影响用户访问速度，可谓高明。 <br /><p></p><p>通过以上两个国外成功应用AJAX的网站，我们发现他们都使用的是轻量级的AJAX，就是那种交互简单，数据较少的操作。这也符合AJAX的本意，虽然像<a href="http://www.backbase.com/" target="_blank"><font color="#0000ff"><a href="http://www.backbase.com/" target="_blank">www.backbase.com</a></font></a>和<a href="http://www.bindows.net/" target="_blank"><font color="#0033ff">bindows</font></a>都在RIA上有惊人的表现能力，但是速度慢、<a href="http://www.google.com/search?q=site:backbase.com&amp;num=50&amp;hl=zh-CN&amp;lr=&amp;newwindow=1&amp;start=50&amp;sa=N" target="_blank"><font color="#0033ff">搜索引擎支持不好</font></a>、开发难度大等毛病还是无法让用户满意的，请记住：AJAX的最终目的是为了提高用户体验，为了方便用户交互，而不是因技术而技术的。</p><h3><font size="2">三、AJAX的MVC架构设计</font></h3><p>很多人认为在成熟的框架中应用AJAX会破坏框架的完整性，比较常见的说法有三层架构的WEB应用中破坏MVC模式，其实不然。MVC的理论我就不多说了，经典的那三个层、五条线大家都很熟悉，在WEB应用中，因为浏览器/服务器固有的这种请求/响应的断开式网络通讯模式，决定了在Model层无法实现主动向View层发出数据更新事件，所以一般常见的成熟MVC框架中都将经典MVC理论稍作修改：由Model层处理完业务后通知Control层，然后由Control层承担向View发送数据更新的义务。但是AJAX天生具有监听功能，<font color="#0033ff">AJAX实现异步响应的那个<strong>OnReadyStateChange</strong>事件就具有在客户端程序中才会有的事件监听功能</font>。现在想来，利用AJAX实现的MVC模型有如下图这样：</p><p><a title="新窗口打开" onfocus="this.blur()" href="http://www.zhihere.com/bbs/UploadFile/2005-9/20059523133169166.jpg" target="_blank"><img src="http://www.zhihere.com/bbs/UploadFile/2005-9/20059523133169166.jpg" onload="return imgzoom(this,550)" border="0" /></a><br /><br />理想化的设计如下所示：<br /></p><ul><li>三层对应的文件对象：view.jsp(视图)、action.do(控制器)、model.java(模型) <br /></li><li>view.jsp是用户看到的界面，并通过内置的AJAX对象异步方式给action.do发送请求，AJAX.OnReadyStateChange开始监听 <br /></li><li>action.do接收到view.jsp发过来的请求(GET或者POST方式)，通过Request判断后发送给相应的业务/数据模型model.java <br /></li><li>model.java开始执行业务操作，执行完毕直接给view.jsp页面发送数据更新的通知，这个通知的消息有可能是XML封装的数据，也有可能是一段文本，甚至是一段HTML代码，当然，既然用MVC，不推荐有Model发送HTML，推荐还是用XML封装业务数据即可。 <br /></li><li>view.jsp页面中AJAX对象的OnReadyStateChange接收到了数据更新通知，根据实际情况用DOM进行页面呈现更新。 </li></ul>通过以上几步一气呵成，一个典型的基于MVC的三层交互就完成了。当然，熟悉WEB下的MVC框架的用户，如熟悉Struts的Java开发人员可能不习惯由Model层给View直接发送数据更新通知，那咱们也可以转变一下，Model层业务处理完毕将更新通知先发送给Control，由Control去通知View亦可。 <br /><img src ="http://www.blogjava.net/zhangrenquan/aggbug/39182.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-04-04 16:06 <a href="http://www.blogjava.net/zhangrenquan/articles/39182.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>