﻿<?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-Terry.Li-彬-文章分类-Ajax</title><link>http://www.blogjava.net/libin2722/category/27087.html</link><description>虚其心，可解天下之问；专其心，可治天下之学；静其心，可悟天下之理；恒其心，可成天下之业。</description><language>zh-cn</language><lastBuildDate>Fri, 06 Dec 2013 02:41:38 GMT</lastBuildDate><pubDate>Fri, 06 Dec 2013 02:41:38 GMT</pubDate><ttl>60</ttl><item><title>Ajax Session Timeout 超时 处理</title><link>http://www.blogjava.net/libin2722/articles/407255.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Thu, 05 Dec 2013 08:11:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/407255.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/407255.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/407255.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/407255.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/407255.html</trackback:ping><description><![CDATA[/**<br /> * Author : Larry Li<br /> * Date : 2013-12-5<br /> * Email : larry.li@aicent.com<br /> */<br />var Session = function() {<br />    var defaults = {<br />            title        : 'Session Notification',<br />            message      : 'Your session is about to expire.',<br />            keepAliveUrl : '/admin/session/keep-alive',<br />            redirUrl     : '/account/timed-out',<br />            logoutUrl    : '/account/logout',<br />            warnAfter    : 900000, // 15 minutes<br />            redirAfter   : 1200000 // 20 minutes<br />    };<br />    <br />    var o = defaults, dialogTimer, redirTimer;<br />    <br />    var controlRedirTimer = function(action) {<br />        switch(action) {<br />            case 'start':<br />                // Dialog has been shown, if no action taken during redir period, redirect<br />                redirTimer = setTimeout(function(){<br />                    window.location = o.redirUrl;<br />                }, o.redirAfter - o.warnAfter);<br />                break;<br />    <br />            case 'stop':<br />                clearTimeout(redirTimer);<br />                break;<br />            case 'restart':<br />                clearTimeout(redirTimer);<br />                redirTimer = setTimeout(function(){<br />                    window.location = o.redirUrl;<br />                }, o.redirAfter - o.warnAfter);<br />                break;<br />        }<br />    };<br />    <br />    var controlDialogTimer = function(action) {<br />        switch(action) {<br />            case 'start':<br />                dialogTimer = setTimeout(function(){<br />                    $('#sessionTimeout-dialog').modal('show');<br />                    controlRedirTimer('start');<br />                }, o.warnAfter);<br />                break;<br />            case 'stop':<br />                clearTimeout(dialogTimer);<br />                break;<br />            case 'restart':<br />                clearTimeout(dialogTimer);<br />                dialogTimer = setTimeout(function(){<br />                    $('#sessionTimeout-dialog').modal('show');<br />                    controlRedirTimer('restart');<br />                }, o.warnAfter);<br />                break;<br />        }<br />    };<br />    <br />    var doKeepAlive = function() {<br />        $.ajax({<br />            type: 'POST',<br />            url: o.keepAliveUrl,<br />            success: function() {<br />                // Stop redirect timer and restart warning timer<br />                controlRedirTimer('restart');<br />                controlDialogTimer('restart');<br />            }<br />        });<br />    };<br />    <br />    return {<br />        sessionTimeout: function(options) {<br />            if ( options ) { o = $.extend( defaults, options ); }<br />            <br />            var warning_dialog = '&lt;div class="modal fade" id="sessionTimeout-dialog"&gt;'<br />                                +'    &lt;div class="modal-dialog modal-small"&gt;'<br />                                +'        &lt;div class="modal-content"&gt;'<br />                                +'            &lt;div class="modal-header"&gt;'<br />                                +'                &lt;button id="_close" type="button" class="close" data-dismiss="modal" aria-hidden="true"&gt;&amp;times;&lt;/button&gt;'<br />                                +'                &lt;h4 class="modal-title"&gt;'+ o.title +'&lt;/h4&gt;'<br />                                +'            &lt;/div&gt;'<br />                                +'            &lt;div class="modal-body"&gt;'+ o.message +'&lt;/div&gt;'<br />                                +'            &lt;div class="modal-footer"&gt;'<br />                                +'                &lt;button id="sessionTimeout-dialog-logout" type="button" class="btn btn-default"&gt;Logout&lt;/button&gt;'<br />                                +'                &lt;button id="sessionTimeout-dialog-keepalive" type="button" class="btn btn-primary" data-dismiss="modal"&gt;Stay Connected&lt;/button&gt;'<br />                                +'            &lt;/div&gt;'<br />                                +'        &lt;/div&gt;'<br />                                +'    &lt;/div&gt;'<br />                                +'&lt;/div&gt;';<br />            <br />            $('body').append(warning_dialog);<br />            <br />            $('#sessionTimeout-dialog-logout').on('click', function () { window.location = o.logoutUrl; });<br />            <br />            $('#_close,#sessionTimeout-dialog-keepalive').click(function() {<br />                doKeepAlive();<br />            });<br />            // Begin warning period<br />            controlDialogTimer('start');<br />        },<br />        <br />        sessionTimeoutKeepAlive: function() {<br />            controlRedirTimer('restart');<br />            controlDialogTimer('restart');<br />        }<br />    };<br />}();<br /><br />$(function() {<br />    Session.sessionTimeout({<br />        title: 'Session Timeout Notification',<br />        message: 'Your session is about to expire.',<br />        keepAliveUrl: contextPath + '/admin/session/keep-alive',<br />        redirUrl: contextPath + '/account/login',<br />        logoutUrl: contextPath + '/account/logout',<br />        warnAfter: 1500000, <br />        redirAfter: 1780000<br />    });<br />    <br />    $(document).ajaxComplete(function() {<br />        Session.sessionTimeoutKeepAlive();<br />    });<br />});<img src ="http://www.blogjava.net/libin2722/aggbug/407255.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2013-12-05 16:11 <a href="http://www.blogjava.net/libin2722/articles/407255.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ajax 特效应用30处</title><link>http://www.blogjava.net/libin2722/articles/286834.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Wed, 15 Jul 2009 03:53:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/286834.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/286834.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/286834.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/286834.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/286834.html</trackback:ping><description><![CDATA[1) noobSlide-
<br />八种ajax实现的slide图片文字轮换缓冲滚动效果
<br />演示http://efectorelativo.net/laboratory/noobSlide/sample.html
<br /><img src="http://www.51flash.cn/wp-content/uploads/2008/06/a10.jpg" /><br /><a href="http://efectorelativo.net/laboratory/noobSlide/sample.html" target="_blank">Checkout the Demo here.</a>下载 
<br />2) Growl 2.0 with Mootools-
<br />图层渐隐渐显效果
<br /><img src="http://www.51flash.cn/wp-content/uploads/2008/06/a9.jpg" /><br />演示: 打开演示页，点击左侧Show Growl Smoke. Show Growl 即可看到效果
<br />下载:
<br /><br /><br /><br /><br />--------------------------------------------------------------------------------
<br />3) Easiest Tooltip and Image Preview Using jQuery-鼠标移到连接对象上，滑出提示层效果
<br /><img src="http://www.51flash.cn/wp-content/uploads/2008/06/a1.jpg" /><br /><br />Live Demo演示 
<br /><br /><br />--------------------------------------------------------------------------------
<br />4) Sliding top panel using mootools-仿flash的菜单移动效果
<br /><img src="http://www.51flash.cn/wp-content/uploads/2008/06/a3.jpg" /><br /><br />Live Demo演示 
<br /><br /><br />--------------------------------------------------------------------------------
<br />5) Create a Slick Tabbed Content Area using CSS &amp; jQuery-tab标签切换内容根据高度自动缓冲移动变化
<br /><img src="http://www.51flash.cn/wp-content/uploads/2008/06/a4.jpg" /><br /><br />Live Demo演示 
<br /><br />--------------------------------------------------------------------------------
<br />6) Custom JavaScript Dialog Boxes-ajax对话框效果，周围页面变灰白色
<br /><img src="http://www.51flash.cn/wp-content/uploads/2008/06/a5.jpg" /><br /><br />Live Demo演示 
<br />Download tutorial from Here下载 
<br /><br />--------------------------------------------------------------------------------
<br />7) Facebook Sliders With Mootools and CSS -
<br />按钮拖动 控制图片透明度高宽度
<br /><img src="http://www.51flash.cn/wp-content/uploads/2008/06/a6.jpg" /><br /><br />Checkout the Live Demo演示 
<br /><br />--------------------------------------------------------------------------------
<br />8 ) Making a Javascript Video Player-
<br /><img src="http://www.51flash.cn/wp-content/uploads/2008/06/a21.gif" /><br /><br />Checkout the Demos here. 
<br /><br />--------------------------------------------------------------------------------
<br />9) Ajax mosaic builder-
<br />无数张图片组合排列拼贴成一张图的效果
<br /><img src="http://www.51flash.cn/wp-content/uploads/2008/06/a22.jpg" /><br />Checkout the Demo here.演示 
<br /><br />--------------------------------------------------------------------------------
<br />10) jQuery flipv()-
<br />文字纵向排效果
<br /><img src="http://www.51flash.cn/wp-content/uploads/2008/06/a27.gif" /><br /><br />Checkout the Demo here.演示 
<br />Download it from here.下载 
<br /><br />--------------------------------------------------------------------------------
<br />11) Drag. Drop. Lock.-
<br />可拖动的层
<br /><img src="http://www.51flash.cn/wp-content/uploads/2008/06/a7.jpg" /><br /><br />Checkout the Live Demo演示 
<br /><br />--------------------------------------------------------------------------------
<br />12) WebAppers Simple Javascript Progress Bar with CSS-进度条 点中间+ -按钮可以直接预览效果，
<br /><img src="http://www.51flash.cn/wp-content/uploads/2008/06/a8.jpg" /><br /><br />Checkout the Live Demo演示 
<br />Download it from here.下载 
<br /><br />--------------------------------------------------------------------------------
<br />13) moowheel-数据图标的动画显示效果
<br />object.
<br /><img src="http://www.51flash.cn/wp-content/uploads/2008/06/a25.gif" /><br />Checkout the Live Demo演示 
<br /><br />--------------------------------------------------------------------------------
<br /><br />--------------------------------------------------------------------------------
<br />14) Sliding top panel using mootools-
<br /><br /><img src="http://www.51flash.cn/wp-content/uploads/2008/06/a2.jpg" /><br />Download tutorial from Here 
<br /><br />--------------------------------------------------------------------------------
<br />15) Mocha UI-ajax js仿windows桌面操作的效果，
<br /><img src="http://www.51flash.cn/wp-content/uploads/2008/06/a26.gif" /><br />Checkout the Demo here.演示 
<br /><br />--------------------------------------------------------------------------------
<br />16) ddMenu-
<br />ajax实现右键菜单效果
<br /><br /><img src="http://www.51flash.cn/wp-content/uploads/2008/06/a11.jpg" /><br />Checkout the Demo here.演示 
<br />Download it from here.下载 
<br /><br />--------------------------------------------------------------------------------
<br />17) googleDrive-google地图小工具，实现小汽车在地图上行驶，用方向键 控制车头必须朝向马路前方，往边上开就会开不下去。
<br /><br /><img src="http://www.51flash.cn/wp-content/uploads/2008/06/a12.jpg" /><br />--------------------------------------------------------------------------------
<br />18) GlassBox-ajax实现类似vista系统 窗口半透明的玻璃效果
<br /><br /><img src="http://www.51flash.cn/wp-content/uploads/2008/06/a23.jpg" /><br />Checkout the Demo here.演示 
<br />Download it from here.下载 
<br /><br />--------------------------------------------------------------------------------
<br />19) ProtoFlow-ajax相片展示效果，左右滚动并有倒影效果
<br /><br /><img src="http://www.51flash.cn/wp-content/uploads/2008/06/a13.jpg" /><br />Checkout the Demo here.演示 
<br />Download it from here.下载 
<br /><br />--------------------------------------------------------------------------------
<br />20) ASP.NET AJAX AutoComplete Control (Facebook look)-类似google搜索输入框,下拉显示相关关键字的效果，
<br /><br /><img src="http://www.51flash.cn/wp-content/uploads/2008/06/a14.jpg" /><br />Checkout the Demo here.演示 
<br />Download it from here.下载 
<br /><br />--------------------------------------------------------------------------------
<br />21) ADamnIT - JS error notification- A free reporting service that
emails you when a JS error occurs in your webpages.页面js错误提示，点击按钮
下方显示对话窗口
<br /><img src="http://www.51flash.cn/wp-content/uploads/2008/06/a15.jpg" /><br /><br />Checkout the Demo here.演示 
<br />Download it from here.下载 
<br /><br />--------------------------------------------------------------------------------
<br />22) Flexigrid-数据表格table 纵向的“列” 可以仿excel一样 拖动
<br /><br /><img src="http://www.51flash.cn/wp-content/uploads/2008/06/a16.jpg" /><br />Checkout the Demo here.演示 
<br />Download it from here.下载 
<br /><br />--------------------------------------------------------------------------------
<br />23) prettyPhoto a jQuery lightbox clone-与现在流行的ligtbox 效果类似，点小图，大图弹出，周围页面变灰色半透明。
<br /><img src="http://www.51flash.cn/wp-content/uploads/2008/06/a17.jpg" /><br /><br />Checkout the Demo here.演示 
<br />Download it from here.下载 
<br /><br />--------------------------------------------------------------------------------
<br />24) JavaScript Color Fading Script-js实现颜色渐变动画效果，鼠标移到表格/文字上，颜色缓慢渐变，而不是一般css实现的颜色直接切换。
<br /><img src="http://i.ixnp.com/images/v3.34.2/size_305/loading.gif" /><br />Checkout the Demo here.演示 
<br />Download it from here.下载 
<br /><br />--------------------------------------------------------------------------------
<br />25) Rotator-
<br /><br /><img src="http://www.51flash.cn/wp-content/uploads/2008/06/a28.gif" /><br />Checkout the Demo here. 
<br />Download it from here. 
<br /><br />--------------------------------------------------------------------------------
<br />26) Kotatsu - a simple html table generator- 
<br /><br /><img src="http://www.51flash.cn/wp-content/uploads/2008/06/a30.gif" /><br />--------------------------------------------------------------------------------
<br />27) jQuery virtual tour-js虚拟全景，360度环绕图片浏览，鼠标移到图片下方，显示左右及x停止按钮，
<br /><img src="http://www.51flash.cn/wp-content/uploads/2008/06/a18.jpg" /><br /><br />Checkout the Demo here.演示 
<br />Download it from here.下载 
<br /><br />--------------------------------------------------------------------------------
<br />28) Usable directory listings with a little Dojo- 
<br /><br /><img src="http://www.51flash.cn/wp-content/uploads/2008/06/a19.jpg" /><br />Checkout the Demo here. 
<br />Download a zip of the header and .htaccess files here. 
<br /><br />--------------------------------------------------------------------------------
<br />29) Cuzillion’-简单的网页版dreamweaver，点击左侧列出的html元素,实时在中间的html代码部分显示，可以拖动改变元素所在位置跟属性,右侧点creat预览页面效果
<br /><img src="http://www.51flash.cn/wp-content/uploads/2008/06/a20.gif" /><br /><br />--------------------------------------------------------------------------------
<br />30) The Sliding date-picker-时间表，可以拖动选择特定时间段
<br /><img src="http://www.51flash.cn/wp-content/uploads/2008/06/a24.gif" /><br /><br />Checkout the Demo here.演示 
<br />Download it from here.下载 
<img src ="http://www.blogjava.net/libin2722/aggbug/286834.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2009-07-15 11:53 <a href="http://www.blogjava.net/libin2722/articles/286834.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DWR 入門與應用（三）</title><link>http://www.blogjava.net/libin2722/articles/190766.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Fri, 04 Apr 2008 03:37:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/190766.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/190766.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/190766.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/190766.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/190766.html</trackback:ping><description><![CDATA[<span class="javascript" id="text167679">來寫個AJAX版的聊天室吧！先看看直接使用AJAX要如何做到，首先需要一個簡單的聊天室Servlet&#8230; <br />
<table class="java" cellspacing="1" cellpadding="3" bgcolor="#999999" border="0">
    <tbody>
        <tr>
            <td valign="top" align="left" width="1" bgcolor="#dddddd">
            <pre><font color="#555555">1<br />
            2<br />
            3<br />
            4<br />
            5<br />
            6<br />
            7<br />
            8<br />
            9<br />
            10<br />
            11<br />
            12<br />
            13<br />
            14<br />
            15<br />
            16<br />
            17<br />
            18<br />
            19<br />
            20<br />
            21<br />
            22<br />
            23<br />
            24<br />
            25<br />
            26<br />
            27<br />
            28<br />
            29<br />
            30<br />
            31<br />
            32<br />
            33<br />
            34<br />
            35<br />
            36<br />
            37<br />
            38<br />
            39<br />
            40<br />
            41<br />
            42<br />
            43<br />
            44<br />
            45<br />
            46<br />
            47<br />
            48<br />
            49<br />
            50<br />
            51<br />
            52<br />
            53<br />
            54<br />
            55<br />
            </font></pre>
            </td>
            <td valign="top" align="left" bgcolor="#ffffff">
            <pre><font class="java-reserved_word"><strong>package</strong></font> onlyfun.caterpillar;<br />
            &nbsp;<br />
            <font class="java-reserved_word"><strong>import</strong></font> java.io.IOException;<br />
            <font class="java-reserved_word"><strong>import</strong></font> java.io.PrintWriter;<br />
            <font class="java-reserved_word"><strong>import</strong></font> java.util.LinkedList;<br />
            <font class="java-reserved_word"><strong>import</strong></font> java.util.List;<br />
            &nbsp;<br />
            <font class="java-reserved_word"><strong>import</strong></font> javax.servlet.ServletException;<br />
            <font class="java-reserved_word"><strong>import</strong></font> javax.servlet.http.HttpServletRequest;<br />
            <font class="java-reserved_word"><strong>import</strong></font> javax.servlet.http.HttpServletResponse;<br />
            &nbsp;<br />
            <font class="java-reserved_word"><strong>public</strong></font> <font class="java-reserved_word"><strong>class</strong></font> ChatRoomServlet <font class="java-reserved_word"><strong>extends</strong></font> javax.servlet.http.HttpServlet <font class="java-reserved_word"><strong>implements</strong></font> javax.servlet.Servlet <font class="java-bracket">{</font><br />
            <font class="java-reserved_word"><strong>private</strong></font> <font class="java-reserved_word"><strong>static</strong></font> LinkedList&lt;Message&gt; messages = <font class="java-reserved_word"><strong>new</strong></font> LinkedList&lt;Message&gt;();<br />
            <br />
            <font class="java-reserved_word"><strong>public</strong></font> ChatRoomServlet() <font class="java-bracket">{</font><br />
            <font class="java-reserved_word"><strong>super</strong></font>(); <br />
            <font class="java-bracket">}</font><br />
            <br />
            <font class="java-reserved_word"><strong>private</strong></font> List&lt;Message&gt; addMessage(String text) <font class="java-bracket">{</font><br />
            <font class="java-reserved_word"><strong>if</strong></font> (text != <font class="java-reserved_word"><strong>null</strong></font> &amp;&amp; text.trim().length() &gt; 0) <font class="java-bracket">{</font><br />
            messages.addFirst(<font class="java-reserved_word"><strong>new</strong></font> Message(text));<br />
            <font class="java-reserved_word"><strong>while</strong></font> (messages.size() &gt; 10) <font class="java-bracket">{</font><br />
            messages.removeLast();<br />
            <font class="java-bracket">}</font><br />
            <font class="java-bracket">}</font><br />
            &nbsp;<br />
            <font class="java-reserved_word"><strong>return</strong></font> messages;<br />
            <font class="java-bracket">}</font><br />
            &nbsp;<br />
            <font class="java-reserved_word"><strong>private</strong></font> List&lt;Message&gt; getMessages() <font class="java-bracket">{</font><br />
            <font class="java-reserved_word"><strong>return</strong></font> messages;<br />
            <font class="java-bracket">}</font><br />
            <br />
            <font class="java-reserved_word"><strong>protected</strong></font> <font class="java-reserved_word"><strong>void</strong></font> doPost(HttpServletRequest request, HttpServletResponse response) <font class="java-reserved_word"><strong>throws</strong></font> ServletException, IOException <font class="java-bracket">{</font><br />
            List&lt;Message&gt; list = <font class="java-reserved_word"><strong>null</strong></font>;<br />
            <br />
            <font class="java-reserved_word"><strong>if</strong></font>(<font class="java-string">"send"</font>.equals(request.getParameter(<font class="java-string">"task"</font>))) <font class="java-bracket">{</font><br />
            list = addMessage(request.getParameter(<font class="java-string">"msg"</font>));<br />
            <font class="java-bracket">}</font><br />
            <font class="java-reserved_word"><strong>else</strong></font> <font class="java-reserved_word"><strong>if</strong></font>(<font class="java-string">"query"</font>.equals(request.getParameter(<font class="java-string">"task"</font>)))<font class="java-bracket">{</font><br />
            list = getMessages();<br />
            <font class="java-bracket">}</font><br />
            &nbsp;<br />
            PrintWriter out = response.getWriter();<br />
            response.setContentType(<font class="java-string">"text/xml"</font>);<br />
            response.setHeader(<font class="java-string">"Cache-Control"</font>, <font class="java-string">"no-cache"</font>);<br />
            &nbsp;<br />
            out.println(<font class="java-string">"&lt;response&gt;"</font>);<br />
            <font class="java-reserved_word"><strong>for</strong></font>(<font class="java-reserved_word"><strong>int</strong></font> i = 0; i &lt; list.size(); i++) <font class="java-bracket">{</font><br />
            String msg = list.get(i).getText();<br />
            out.println(<font class="java-string">"&lt;message&gt;"</font> + msg + <font class="java-string">"&lt;/message&gt;"</font>);<br />
            <font class="java-bracket">}</font><br />
            out.println(<font class="java-string">"&lt;/response&gt;"</font>);<br />
            <font class="java-bracket">}</font>             <br />
            <font class="java-bracket">}</font> </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
Message物件如下&#8230; <br />
<table class="java" cellspacing="1" cellpadding="3" bgcolor="#999999" border="0">
    <tbody>
        <tr>
            <td valign="top" align="left" width="1" bgcolor="#dddddd">
            <pre><font color="#555555">1<br />
            2<br />
            3<br />
            4<br />
            5<br />
            6<br />
            7<br />
            8<br />
            9<br />
            10<br />
            11<br />
            12<br />
            13<br />
            14<br />
            15<br />
            16<br />
            17<br />
            18<br />
            19<br />
            20<br />
            21<br />
            22<br />
            23<br />
            </font></pre>
            </td>
            <td valign="top" align="left" bgcolor="#ffffff">
            <pre><font class="java-reserved_word"><strong>package</strong></font> onlyfun.caterpillar;<br />
            &nbsp;<br />
            <font class="java-reserved_word"><strong>public</strong></font> <font class="java-reserved_word"><strong>class</strong></font> Message <font class="java-bracket">{</font><br />
            <font class="java-reserved_word"><strong>private</strong></font> <font class="java-reserved_word"><strong>long</strong></font> id = System.currentTimeMillis();<br />
            <font class="java-reserved_word"><strong>private</strong></font> String text;<br />
            <br />
            <font class="java-reserved_word"><strong>public</strong></font> Message(String newtext) <font class="java-bracket">{</font><br />
            text = newtext;<br />
            <font class="java-reserved_word"><strong>if</strong></font> (text.length() &gt; 256) <font class="java-bracket">{</font><br />
            text = text.substring(0, 256);<br />
            <font class="java-bracket">}</font><br />
            text = text.replace(<font class="java-string">'&lt;'</font>, <font class="java-string">'['</font>);<br />
            text = text.replace(<font class="java-string">'&amp;'</font>, <font class="java-string">'_'</font>);<br />
            <font class="java-bracket">}</font><br />
            &nbsp;<br />
            <font class="java-reserved_word"><strong>public</strong></font> <font class="java-reserved_word"><strong>long</strong></font> getId() <font class="java-bracket">{</font><br />
            <font class="java-reserved_word"><strong>return</strong></font> id;<br />
            <font class="java-bracket">}</font><br />
            &nbsp;<br />
            <font class="java-reserved_word"><strong>public</strong></font> String getText() <font class="java-bracket">{</font><br />
            <font class="java-reserved_word"><strong>return</strong></font> text;<br />
            <font class="java-bracket">}</font><br />
            <font class="java-bracket">}</font> </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
Servlet接受訊息新增與查詢，判斷的方式是檢查請求參數task是send或query。 <br />
<br />
Servlet會以XML傳回目前List當中的訊息，客戶端可以查詢或插入新訊息時，取得目前List中的訊息，接著在web.xml中設定一下&#8230; <br />
<table class="java" cellspacing="1" cellpadding="3" bgcolor="#999999" border="0">
    <tbody>
        <tr>
            <td valign="top" align="left" width="1" bgcolor="#dddddd">
            <pre><font color="#555555">1<br />
            2<br />
            3<br />
            4<br />
            5<br />
            6<br />
            7<br />
            8<br />
            9<br />
            10<br />
            11<br />
            12<br />
            13<br />
            14<br />
            15<br />
            16<br />
            17<br />
            18<br />
            19<br />
            20<br />
            21<br />
            22<br />
            </font></pre>
            </td>
            <td valign="top" align="left" bgcolor="#ffffff">
            <pre>&lt;?xml version=<font class="java-string">"1.0"</font> encoding=<font class="java-string">"UTF-8"</font>?&gt;<br />
            &lt;web-app id=<font class="java-string">"WebApp_ID"</font> version=<font class="java-string">"2.4"</font> xmlns=<font class="java-string">"http://java.sun.com/xml/ns/j2ee"</font> xmlns:xsi=<font class="java-string">"http://www.w3.org/2001/XMLSchema-instance"</font> xsi:schemaLocation=<font class="java-string">"http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</font>&gt;<br />
            &lt;servlet&gt;<br />
            &lt;description&gt;<br />
            &lt;/description&gt;<br />
            &lt;display-name&gt;<br />
            ChatRoomServlet&lt;/display-name&gt;<br />
            &lt;servlet-name&gt;ChatRoomServlet&lt;/servlet-name&gt;<br />
            &lt;servlet-class&gt;<br />
            onlyfun.caterpillar.ChatRoomServlet&lt;/servlet-class&gt;<br />
            &lt;/servlet&gt;<br />
            &nbsp;<br />
            &lt;servlet-mapping&gt;<br />
            &lt;servlet-name&gt;ChatRoomServlet&lt;/servlet-name&gt;<br />
            &lt;url-pattern&gt;/ChatRoomServlet&lt;/url-pattern&gt;<br />
            &lt;/servlet-mapping&gt;<br />
            &lt;session-config&gt;<br />
            &lt;session-timeout&gt;<br />
            30<br />
            &lt;/session-timeout&gt;<br />
            &lt;/session-config&gt;  <br />
            &lt;/web-app&gt;<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
在網頁中，使用者可以在輸入訊息後按下按鈕送出資訊，並在XML回應取得時，將訊息以一列一列的表格方式顯示出來，另外還設定了週期性的輪詢，即使不輸入新訊息，也可以週期性的取得新的聊天訊息&#8230; <br />
<table class="java" cellspacing="1" cellpadding="3" bgcolor="#999999" border="0">
    <tbody>
        <tr>
            <td valign="top" align="left" width="1" bgcolor="#dddddd">
            <pre><font color="#555555">1<br />
            2<br />
            3<br />
            4<br />
            5<br />
            6<br />
            7<br />
            8<br />
            9<br />
            10<br />
            11<br />
            12<br />
            13<br />
            14<br />
            15<br />
            16<br />
            17<br />
            18<br />
            19<br />
            20<br />
            21<br />
            22<br />
            23<br />
            24<br />
            25<br />
            26<br />
            27<br />
            28<br />
            29<br />
            30<br />
            31<br />
            32<br />
            33<br />
            34<br />
            35<br />
            36<br />
            37<br />
            38<br />
            39<br />
            40<br />
            41<br />
            42<br />
            43<br />
            44<br />
            45<br />
            46<br />
            47<br />
            48<br />
            49<br />
            50<br />
            51<br />
            52<br />
            53<br />
            54<br />
            55<br />
            56<br />
            57<br />
            58<br />
            59<br />
            60<br />
            61<br />
            62<br />
            63<br />
            64<br />
            65<br />
            66<br />
            67<br />
            68<br />
            69<br />
            70<br />
            71<br />
            72<br />
            73<br />
            74<br />
            75<br />
            76<br />
            77<br />
            78<br />
            79<br />
            80<br />
            81<br />
            82<br />
            83<br />
            84<br />
            85<br />
            86<br />
            87<br />
            88<br />
            89<br />
            90<br />
            91<br />
            92<br />
            93<br />
            94<br />
            95<br />
            96<br />
            97<br />
            </font></pre>
            </td>
            <td valign="top" align="left" bgcolor="#ffffff">
            <pre>&lt;!DOCTYPE HTML PUBLIC <font class="java-string">"-//W3C//DTD HTML 4.01 Transitional//EN"</font>&gt;<br />
            &lt;html&gt;<br />
            &lt;head&gt;<br />
            &lt;meta http-equiv=<font class="java-string">"Content-Type"</font> content=<font class="java-string">"text/html; charset=BIG5"</font>&gt;<br />
            &lt;title&gt;Chat Room&lt;/title&gt;<br />
            &nbsp;<br />
            &lt;script type=<font class="java-string">"text/javascript"</font>&gt;<br />
            var xmlHttp;<br />
            &nbsp;<br />
            function createXMLHttpRequest() <font class="java-bracket">{</font><br />
            <font class="java-reserved_word"><strong>if</strong></font> (window.ActiveXObject) <font class="java-bracket">{</font><br />
            xmlHttp = <font class="java-reserved_word"><strong>new</strong></font> ActiveXObject(<font class="java-string">"Microsoft.XMLHTTP"</font>);<br />
            <font class="java-bracket">}</font> <br />
            <font class="java-reserved_word"><strong>else</strong></font> <font class="java-reserved_word"><strong>if</strong></font> (window.XMLHttpRequest) <font class="java-bracket">{</font><br />
            xmlHttp = <font class="java-reserved_word"><strong>new</strong></font> XMLHttpRequest();<br />
            <font class="java-bracket">}</font><br />
            <font class="java-bracket">}</font><br />
            &nbsp;<br />
            function sendMessage() <font class="java-bracket">{</font><br />
            var msg = document.getElementById(<font class="java-string">"text"</font>).value;<br />
            <br />
            <font class="java-reserved_word"><strong>if</strong></font>(msg == <font class="java-string">""</font>) <font class="java-bracket">{</font><br />
            refreshMessage();<br />
            <font class="java-reserved_word"><strong>return</strong></font>;<br />
            <font class="java-bracket">}</font><br />
            <br />
            var param = <font class="java-string">"task=send&amp;msg="</font> + msg;<br />
            ajaxRequest(param);<br />
            document.getElementById(<font class="java-string">"text"</font>).value = <font class="java-string">""</font>;<br />
            <font class="java-bracket">}</font><br />
            &nbsp;<br />
            function queryMessage() <font class="java-bracket">{</font><br />
            var param = <font class="java-string">"task=query"</font>;<br />
            ajaxRequest(param);<br />
            <font class="java-bracket">}</font><br />
            &nbsp;<br />
            function ajaxRequest(param) <font class="java-bracket">{</font><br />
            var url = <font class="java-string">"ChatRoomServlet?timestamp"</font> + <font class="java-reserved_word"><strong>new</strong></font> Date().getTime();<br />
            createXMLHttpRequest();<br />
            xmlHttp.onreadystatechange = refreshMessage;<br />
            xmlHttp.open(<font class="java-string">"POST"</font>, url, <font class="java-reserved_word"><strong>true</strong></font>);<br />
            xmlHttp.setRequestHeader(<font class="java-string">"Content-Type"</font>,<br />
            <font class="java-string">"application/x-www-form-urlencoded;"</font>);<br />
            xmlHttp.send(param);<br />
            <font class="java-bracket">}</font><br />
            <br />
            function refreshMessage() <font class="java-bracket">{</font><br />
            <font class="java-reserved_word"><strong>if</strong></font>(xmlHttp.readyState == 4) <font class="java-bracket">{</font><br />
            <font class="java-reserved_word"><strong>if</strong></font>(xmlHttp.status == 200) <font class="java-bracket">{</font><br />
            var messages = xmlHttp.responseXML.getElementsByTagName(<font class="java-string">"message"</font>);<br />
            <br />
            var table_body = document.getElementById(<font class="java-string">"dynamicUpdateArea"</font>);<br />
            var length = table_body.childNodes.length;<br />
            <font class="java-reserved_word"><strong>for</strong></font> (var i = 0; i &lt; length; i++) <font class="java-bracket">{</font><br />
            table_body.removeChild(table_body.childNodes[0]);<br />
            <font class="java-bracket">}</font><br />
            <br />
            var length = messages.length;<br />
            <font class="java-reserved_word"><strong>for</strong></font>(var i = length - 1; i &gt;= 0 ; i--) <font class="java-bracket">{</font><br />
            var message = messages[i].firstChild.data;<br />
            var row = createRow(message);<br />
            <br />
            table_body.appendChild(row);                        <br />
            <font class="java-bracket">}</font><br />
            setTimeout(<font class="java-string">"queryMessage()"</font>, 2000);<br />
            <font class="java-bracket">}</font><br />
            <font class="java-bracket">}</font><br />
            <font class="java-bracket">}</font><br />
            &nbsp;<br />
            function createRow(message) <font class="java-bracket">{</font><br />
            var row = document.createElement(<font class="java-string">"tr"</font>);<br />
            var cell = document.createElement(<font class="java-string">"td"</font>);<br />
            var cell_data = document.createTextNode(message);<br />
            cell.appendChild(cell_data);<br />
            row.appendChild(cell);<br />
            <font class="java-reserved_word"><strong>return</strong></font> row;<br />
            <font class="java-bracket">}</font><br />
            &nbsp;<br />
            &lt;/script&gt;<br />
            &nbsp;<br />
            &lt;/head&gt;<br />
            &lt;body&gt;<br />
            &nbsp;<br />
            &lt;p&gt;<br />
            Your Message:<br />
            &lt;input id=<font class="java-string">"text"</font>/&gt;<br />
            &lt;input type=<font class="java-string">"button"</font> value=<font class="java-string">"Send"</font><br />
            onclick=<font class="java-string">"sendMessage()"</font>/&gt;<br />
            &lt;/p&gt;<br />
            &nbsp;<br />
            &lt;p&gt;Messages:&lt;/p&gt;<br />
            &lt;table align=<font class="java-string">"left"</font>&gt;<br />
            &lt;tbody id=<font class="java-string">"dynamicUpdateArea"</font>&gt;&lt;/tbody&gt;<br />
            &lt;/table&gt;<br />
            &nbsp;<br />
            &lt;/body&gt;<br />
            &lt;/html&gt;<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
簡單抓個畫面&#8230;&nbsp; </span><br />
<img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/caterpillar_here/1.jpg" /><br />
<br />
<span class="javascript" id="text167681">直接用AJAX，後端用JSP/Servlet，您要對請求參數做些判斷，看看是新增訊息或查詢，並要自行輸出XML，有的沒的&#8230; <br />
<br />
改成DWR的話，就很簡單了，寫個簡單的Java物件&#8230; <br />
<table class="java" cellspacing="1" cellpadding="3" bgcolor="#999999" border="0">
    <tbody>
        <tr>
            <td valign="top" align="left" width="1" bgcolor="#dddddd">
            <pre><font color="#555555">1<br />
            2<br />
            3<br />
            4<br />
            5<br />
            6<br />
            7<br />
            8<br />
            9<br />
            10<br />
            11<br />
            12<br />
            13<br />
            14<br />
            15<br />
            16<br />
            17<br />
            18<br />
            19<br />
            20<br />
            21<br />
            22<br />
            23<br />
            </font></pre>
            </td>
            <td valign="top" align="left" bgcolor="#ffffff">
            <pre><font class="java-reserved_word"><strong>package</strong></font> onlyfun.caterpillar;<br />
            &nbsp;<br />
            <font class="java-reserved_word"><strong>import</strong></font> java.util.LinkedList;<br />
            <font class="java-reserved_word"><strong>import</strong></font> java.util.List;<br />
            &nbsp;<br />
            <font class="java-reserved_word"><strong>public</strong></font> <font class="java-reserved_word"><strong>class</strong></font> Chat <font class="java-bracket">{</font><br />
            <font class="java-reserved_word"><strong>private</strong></font> <font class="java-reserved_word"><strong>static</strong></font> LinkedList&lt;Message&gt; messages = <font class="java-reserved_word"><strong>new</strong></font> LinkedList&lt;Message&gt;();<br />
            &nbsp;<br />
            <font class="java-reserved_word"><strong>public</strong></font> List addMessage(String text) <font class="java-bracket">{</font><br />
            <font class="java-reserved_word"><strong>if</strong></font> (text != <font class="java-reserved_word"><strong>null</strong></font> &amp;&amp; text.trim().length() &gt; 0) <font class="java-bracket">{</font><br />
            messages.addFirst(<font class="java-reserved_word"><strong>new</strong></font> Message(text));<br />
            <font class="java-reserved_word"><strong>while</strong></font> (messages.size() &gt; 10) <font class="java-bracket">{</font><br />
            messages.removeLast();<br />
            <font class="java-bracket">}</font><br />
            <font class="java-bracket">}</font><br />
            <br />
            <font class="java-reserved_word"><strong>return</strong></font> messages;<br />
            <font class="java-bracket">}</font><br />
            &nbsp;<br />
            <font class="java-reserved_word"><strong>public</strong></font> List getMessages() <font class="java-bracket">{</font><br />
            <font class="java-reserved_word"><strong>return</strong></font> messages;<br />
            <font class="java-bracket">}</font><br />
            <font class="java-bracket">}</font> </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
接著&#8230;在dwr.xml中開放一下&#8230; <br />
<table class="java" cellspacing="1" cellpadding="3" bgcolor="#999999" border="0">
    <tbody>
        <tr>
            <td valign="top" align="left" width="1" bgcolor="#dddddd">
            <pre><font color="#555555">1<br />
            2<br />
            3<br />
            4<br />
            5<br />
            6<br />
            7<br />
            8<br />
            9<br />
            10<br />
            11<br />
            12<br />
            13<br />
            </font></pre>
            </td>
            <td valign="top" align="left" bgcolor="#ffffff">
            <pre>&lt;?xml version=<font class="java-string">"1.0"</font> encoding=<font class="java-string">"UTF-8"</font>?&gt;<br />
            &lt;!DOCTYPE dwr PUBLIC <font class="java-string">"-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"</font> <font class="java-string">"http://www.getahead.ltd.uk/dwr/dwr10.dtd"</font>&gt;<br />
            <br />
            &lt;dwr&gt;<br />
            &lt;allow&gt;<br />
            &nbsp;<br />
            &lt;create creator=<font class="java-string">"new"</font> javascript=<font class="java-string">"Chat"</font>&gt;<br />
            &lt;param name=<font class="java-string">"class"</font> value=<font class="java-string">"onlyfun.caterpillar.Chat"</font>/&gt;<br />
            &lt;/create&gt;<br />
            <br />
            &lt;convert converter=<font class="java-string">"bean"</font> match=<font class="java-string">"onlyfun.caterpillar.Message"</font>/&gt;      <br />
            &lt;/allow&gt;<br />
            &lt;/dwr&gt;<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
使用者取得訊息時，是直接傳回List物件，而List中裝的是Message物件，Message物件是自訂物件，conterver設定為 bean，表示DWR會自動將Message的getter名稱轉換為傳回客戶端的JavaScript物件中的屬性，例如Message中有 getText()，則在客戶端可以用message.text這樣的方式來存取。 <br />
<br />
接著是簡單的客戶端網頁&#8230; <br />
<table class="java" cellspacing="1" cellpadding="3" bgcolor="#999999" border="0">
    <tbody>
        <tr>
            <td valign="top" align="left" width="1" bgcolor="#dddddd">
            <pre><font color="#555555">1<br />
            2<br />
            3<br />
            4<br />
            5<br />
            6<br />
            7<br />
            8<br />
            9<br />
            10<br />
            11<br />
            12<br />
            13<br />
            14<br />
            15<br />
            16<br />
            17<br />
            18<br />
            19<br />
            20<br />
            21<br />
            22<br />
            23<br />
            24<br />
            25<br />
            26<br />
            27<br />
            28<br />
            29<br />
            30<br />
            31<br />
            32<br />
            33<br />
            34<br />
            35<br />
            36<br />
            37<br />
            38<br />
            39<br />
            40<br />
            41<br />
            42<br />
            43<br />
            44<br />
            45<br />
            46<br />
            47<br />
            </font></pre>
            </td>
            <td valign="top" align="left" bgcolor="#ffffff">
            <pre>&lt;!DOCTYPE HTML PUBLIC <font class="java-string">"-//W3C//DTD HTML 4.01 Transitional//EN"</font>&gt;<br />
            &lt;html&gt;<br />
            &lt;head&gt;<br />
            &lt;meta http-equiv=<font class="java-string">"Content-Type"</font> content=<font class="java-string">"text/html; charset=BIG5"</font>&gt;<br />
            &lt;title&gt;Insert title here&lt;/title&gt;<br />
            &nbsp;<br />
            &lt;script src=<font class="java-string">"dwr/interface/Chat.js"</font> type=<font class="java-string">"text/javascript"</font>&gt;&lt;/script&gt;<br />
            &lt;script src=<font class="java-string">"dwr/engine.js"</font> type=<font class="java-string">"text/javascript"</font>&gt;&lt;/script&gt;<br />
            &lt;script src=<font class="java-string">"dwr/util.js"</font> type=<font class="java-string">"text/javascript"</font>&gt;&lt;/script&gt;<br />
            &nbsp;<br />
            &lt;script type=<font class="java-string">"text/javascript"</font>&gt;<br />
            function sendMessage() <font class="java-bracket">{</font><br />
            var text = DWRUtil.getValue(<font class="java-string">"text"</font>);<br />
            DWRUtil.setValue(<font class="java-string">"text"</font>, <font class="java-string">""</font>);<br />
            Chat.addMessage(text, gotMessages);<br />
            <font class="java-bracket">}</font><br />
            &nbsp;<br />
            function gotMessages(messages) <font class="java-bracket">{</font><br />
            var chatlog = <font class="java-string">""</font>;<br />
            <font class="java-reserved_word"><strong>for</strong></font> (var data in messages) <font class="java-bracket">{</font><br />
            chatlog = <font class="java-string">"&lt;div&gt;"</font> + messages[data].text +<br />
            <font class="java-string">"&lt;/div&gt;"</font> + chatlog;<br />
            <font class="java-bracket">}</font><br />
            DWRUtil.setValue(<font class="java-string">"chatlog"</font>, chatlog);<br />
            setTimeout(<font class="java-string">"queryMessage()"</font>, 2000);<br />
            <font class="java-bracket">}</font><br />
            &nbsp;<br />
            function queryMessage() <font class="java-bracket">{</font><br />
            Chat.getMessages(gotMessages);<br />
            <font class="java-bracket">}</font><br />
            &lt;/script&gt;<br />
            &nbsp;<br />
            &lt;/head&gt;<br />
            &lt;body&gt;<br />
            &nbsp;<br />
            &lt;p&gt;<br />
            Your Message:<br />
            &lt;input id=<font class="java-string">"text"</font>/&gt;<br />
            &lt;input type=<font class="java-string">"button"</font> value=<font class="java-string">"Send"</font><br />
            onclick=<font class="java-string">"sendMessage()"</font>/&gt;<br />
            &lt;/p&gt;<br />
            &nbsp;<br />
            &lt;p&gt;Messages:&lt;/p&gt;<br />
            &lt;div id=<font class="java-string">"chatlog"</font>&gt;&lt;/div&gt;<br />
            &nbsp;<br />
            &lt;/body&gt;<br />
            &lt;/html&gt;<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
當List物件傳回時，它成為gotMessages(messages)中的messages物件，而messages物件中包括 Message物件轉換後對應的JavaScript物件，由於我們已經設定了Converter，所以可以用messages[data].text來 取得傳回的訊息&#8230; <br />
<br />
簡單抓個畫面&#8230; </span><br />
<img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/caterpillar_here/2.jpg" /><br />
<br />
<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1311605</p>
<img src ="http://www.blogjava.net/libin2722/aggbug/190766.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2008-04-04 11:37 <a href="http://www.blogjava.net/libin2722/articles/190766.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ajax基本原理</title><link>http://www.blogjava.net/libin2722/articles/159715.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Sun, 11 Nov 2007 06:07:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/159715.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/159715.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/159715.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/159715.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/159715.html</trackback:ping><description><![CDATA[&nbsp;
<p style="text-align: center" align="center"><strong><span style="font-size: 15pt; font-family: 宋体">Ajax</span></strong><strong><span style="font-size: 15pt; font-family: 宋体">基本原理</span></strong></p>
<p><strong><span style="font-size: 12pt; font-family: 宋体">摘要：</span></strong><span style="font-family: 宋体">本文介绍了</span>Ajax<span style="font-family: 宋体">的基本原理，交互过程和与之相关的技术及简单的实现方法，在此基础上给出了一个完整的实例，以使得能够对</span>Ajax<span style="font-family: 宋体">有一个更清楚的理解。</span></p>
<p><strong><span style="font-size: 12pt; font-family: 宋体">关键字：</span></strong>Ajax<span style="font-family: 宋体">，</span>JavaScript<span style="font-family: 宋体">，</span>DOM<span style="font-family: 宋体">，无刷新页面，不完全刷新</span></p>
<p><strong><span style="font-size: 12pt; font-family: 宋体">引言</span></strong></p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">计算机桌面应用使我们得以用以前不能想象的方式处理大量的复杂数据；基于计算机网络的</span>C/S<span style="font-family: 宋体">模式应用使得共享数据和资源成为现实。然而，正如</span>C/S<span style="font-family: 宋体">模式的应用是由于人们不满足单机的桌面应用一样，人们对</span>C/S<span style="font-family: 宋体">模式也心存抱怨了：</span>C/S<span style="font-family: 宋体">模式除了带给我们数据和资源共享的便利之外，也给我们带来了令我们（程序开发设计人员）和客户头疼的部署和发布问题。于是，</span>B/S<span style="font-family: 宋体">模式应用应运而生，而且得到了迅速的发展。</span>B/S<span style="font-family: 宋体">模式应用符合一定规范的浏览器作为通用客户端，从而解决了</span>C/S<span style="font-family: 宋体">模式中最令人头疼的部署和发布问题。但是，到此并没有结束，</span>B/S<span style="font-family: 宋体">虽然解决了应用的部署和发布问题，却因为种种限制，使得应用没有了以前丰富的交互，并且每次与服务器的交互都要完全刷新页面，这是非常糟糕和令人不快的。本文讨论了如何解决页面完全刷新和缺乏交互性的问题，我们用的方法就是――</span>Ajax<span style="font-family: 宋体">。</span></p>
<p><strong><span style="font-size: 12pt">Ajax</span></strong></p>
<p><strong><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><span style="font-family: 宋体">那么，</span>Ajax<span style="font-family: 宋体">到底是什么呢？</span>Ajax<span style="font-family: 宋体">（</span>Asynchronous JavaScript + XML<span style="font-family: 宋体">），即异步</span>JavaScript + XML<span style="font-family: 宋体">的缩写，这只是最初的观点，最初由</span>Jesse James Garrett<span style="font-family: 宋体">创造出来的。但是，</span>Ajax<span style="font-family: 宋体">现在的覆盖面已经有了进一步的扩展，把允许浏览器与服务器通信而无需刷新当前页面的技术都涵盖在其中了。</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">坦率的讲，</span>Ajax<span style="font-family: 宋体">并不是什么新鲜玩艺。也就是说，</span>Ajax<span style="font-family: 宋体">并不是一种全新的技术，而更像一种技巧，是把过去的几种技术巧妙结合的技巧。真正与</span>Ajax<span style="font-family: 宋体">相关的新名词应该是</span>XMLHttpRequest<span style="font-family: 宋体">――一个最早在</span>IE 5<span style="font-family: 宋体">中出现，最近开始在多数浏览器得到支持的用来实现异步通信的对象。正如前面所说，</span>B/S<span style="font-family: 宋体">模式是利用浏览器作为其通用的客户端，所以要想异步通讯成为可能，必须要得到浏览器的支持。如果不是有了浏览器对</span>XMLHttpRequest<span style="font-family: 宋体">对象的广泛支持，我们可能不会看到</span>Ajax<span style="font-family: 宋体">的今天，更不会看到许多对</span>Ajax<span style="font-family: 宋体">的著名应用，如</span>Google Map<span style="font-family: 宋体">，</span>Google Suggest<span style="font-family: 宋体">，</span>Ta-da List<span style="font-family: 宋体">等。</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ajax<span style="font-family: 宋体">的处理过程是怎样的呢？下图为</span>Ajax<span style="font-family: 宋体">应用的标准处理模式。</span></p>
<p><span style="z-index: 2; left: 0pt; position: absolute">
<table cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td>
            <div style="padding-right: 7.2pt; padding-left: 7.2pt; padding-bottom: 3.6pt; padding-top: 3.6pt" v:shape="_x0000_s1052">
            <p><span style="font-family: 宋体">数据库</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
</span><strong><span style="font-size: 12pt">
<table cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p>XHR</p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span style="font-family: 宋体">事件</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span style="color: white">Function callback()</span></p>
            <p><span style="color: white">{//&#8230;&#8230;}</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span style="font-family: 宋体">服务器资源</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p style="text-indent: 5.25pt">1</p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p>2</p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p style="text-indent: 5.25pt">6</p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p>3</p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p>5</p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p style="text-indent: 5.25pt">4</p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
</span></strong></p>
<p style="text-align: center" align="center"><span style="font-family: 宋体">图</span> 1 <span style="font-family: 宋体">标准</span>Ajax<span style="font-family: 宋体">处理过程</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">从图中我们可以看出：由事件触发，创建一个</span>XMLHttpRequest<span style="font-family: 宋体">对象，把</span>HTTP<span style="font-family: 宋体">方法（</span>Get/Post<span style="font-family: 宋体">）和目标</span>URL<span style="font-family: 宋体">以及请求返回后的回调函数设置到</span>XMLHttpRequest<span style="font-family: 宋体">对象，通过</span>XMLHttpRequest<span style="font-family: 宋体">向服务器发送请求，请求发送后继续响应用户的界面交互，只有等到请求真正从服务器返回的时候才调用</span>callback()<span style="font-family: 宋体">函数，对响应数据进行处理。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">在这个交互过程中，涉及到几种我们不得不提的技术：</span></p>
<p style="margin-left: 39pt; text-indent: -18pt; tab-stops: list 39.0pt"><span style="font-family: 宋体">1．&nbsp;</span>XHTML<span style="font-family: 宋体">和</span>CSS<span style="font-family: 宋体">――用来使表现标准化；</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">2</span><span style="font-family: 宋体">．</span>DOM<span style="font-family: 宋体">――动态的修改文档的内容和结构；</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">3</span><span style="font-family: 宋体">．</span>XML<span style="font-family: 宋体">――进行数据的交换和处理；</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">4</span><span style="font-family: 宋体">．</span>JavaScript<span style="font-family: 宋体">――对上述几种技术进行绑定，使其成为协同工作的整体。</span></p>
<p><strong><span style="font-size: 12pt">Ajax</span></strong><strong><span style="font-size: 12pt; font-family: 宋体">相关技术及基本原理</span></strong></p>
<p style="margin-left: 39pt; text-indent: -18pt; tab-stops: list 39.0pt"><strong><span style="font-size: 12pt; font-family: 宋体">1．</span></strong><strong><span style="font-size: 12pt; font-family: 宋体">XMLHttpRequest</span></strong><strong><span style="font-size: 12pt; font-family: 宋体">简介</span></strong></p>
<p style="text-indent: 21pt">XMLHttpRequest<span style="font-family: 宋体">，是我们得以实现异步通讯的根本。最早在</span>IE 5 <span style="font-family: 宋体">中以</span>ActiveX<span style="font-family: 宋体">组件实现；最近，</span>Mozilla 1.0<span style="font-family: 宋体">和</span>Safari 1.2<span style="font-family: 宋体">中实现为本地对象。</span>XMLHttpRequest<span style="font-family: 宋体">虽然不是</span>W3C<span style="font-family: 宋体">标准，但却得到了</span>FireFo<span style="font-family: 宋体">x</span><span style="font-family: 宋体">、Safari、Opera、Konqueror、IE等绝大多数浏览器的支持。这就使得Ajax有了今天如火如荼的发展。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">用XMLHttpRequest进行异步通讯，首先必须用JavaScript创建一个XMLHttpRequest对象实例。创建XMLHttpRequest对象实例的代码清单如下所示：</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">var xmlHttp;</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">function createXMLHttpRequest(){</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; if(window.ActiveXObject){</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; else if(window.XMLHttpRequest){</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlHttp = new XMLHttpRequest();</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">}</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">可以看出，创建XMLHttpRequest对象相当容易。首先，声明一个全局变量xmlHttp用来保存即将创建的XMLHttpRequest对象的引用；然后，在createXMLHttpRequest()方法中完成具体创建工作。因为IE与其他浏览器对XMLHttpRequest 对象的实现方法不同，因此在创建时，通过一个分支语句进行判断。如果window.ActiveXObject调用返回true，则证明为IE浏览器，那么就通过传递&#8220;Microsoft.XMLHTTP&#8221;给ActiveXObject()来创建XMLHttpRequest对象，否则就把XMLHttpRequest实现为本地JavaScript对象。XMLHttpRequest对象在不同浏览器上的实现是兼容的，所以可以用同样的方法访问XMLHttpRequest的方法和属性。</span></p>
<p style="text-indent: 21pt; text-align: center" align="center"><span style="font-family: 宋体">表 1&nbsp;标准XMLHttpRequest方法</span></p>
<table style="border-right: medium none; border-top: medium none; margin-left: 5.4pt; border-left: medium none; width: 441pt; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" width="588" border="1">
    <tbody>
        <tr style="height: 7.9pt">
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 216pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 7.9pt" valign="top" width="288">
            <p style="text-align: center" align="center"><span style="font-family: 宋体">方&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 法</span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 225pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 7.9pt" valign="top" width="300">
            <p style="text-align: center" align="center"><span style="font-family: 宋体">说&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 明</span></p>
            </td>
        </tr>
        <tr style="height: 7.85pt">
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 216pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 7.85pt" valign="top" width="288">
            <p><span style="font-family: 宋体">abort()</span></p>
            <p><span style="font-family: 宋体">getAllResponseHeader()</span></p>
            <p><span style="font-family: 宋体">getResponseHeader("Header")</span></p>
            <p><span style="font-family: 宋体">open("method", "url")</span></p>
            <p><span style="font-family: 宋体">send(content)</span></p>
            <p><span style="font-family: 宋体">setRequestHeader("header", "value")</span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 225pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 7.85pt" valign="top" width="300">
            <p><span style="font-family: 宋体">停止当前请求</span></p>
            <p><span style="font-family: 宋体">把HTTP请求的所有响应头部作为键/值对返回</span></p>
            <p><span style="font-family: 宋体">返回指定首部的串值</span></p>
            <p><span style="font-family: 宋体">建立对服务器的调用</span></p>
            <p><span style="font-family: 宋体">向服务器发送请求</span></p>
            <p><span style="font-family: 宋体">把指定首部设置为所提供的值</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-indent: 21pt; text-align: center" align="center"><span style="font-family: 宋体">表 2&nbsp;标准XMLHttpRequest属性</span></p>
<table style="border-right: medium none; border-top: medium none; margin-left: 5.4pt; border-left: medium none; width: 432pt; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" width="576" border="1">
    <tbody>
        <tr style="height: 7.9pt">
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 126pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 7.9pt" valign="top" width="168">
            <p style="text-align: center" align="center"><span style="font-family: 宋体">属&nbsp;&nbsp;&nbsp; 性</span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 306pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 7.9pt" valign="top" width="408">
            <p style="text-align: center" align="center"><span style="font-family: 宋体">说&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 明</span></p>
            </td>
        </tr>
        <tr style="height: 7.85pt">
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 126pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 7.85pt" valign="top" width="168">
            <p><span style="font-family: 宋体">onreadystatechange</span></p>
            <p><span style="font-family: 宋体">readyState</span></p>
            <p><span style="font-family: 宋体">responseText</span></p>
            <p><span style="font-family: 宋体">responseXML</span></p>
            <p><span style="font-family: 宋体">status</span></p>
            <p><span style="font-family: 宋体">statusText</span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 306pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; height: 7.85pt" valign="top" width="408">
            <p><span style="font-family: 宋体">每个状态改变都会触发这个事件处理器</span></p>
            <p><span style="font-family: 宋体">请求的状态：0－未初始化，1－正在加载，2－已加载，3－交互中，4－完成</span></p>
            <p><span style="font-family: 宋体">服务器的响应，表示为一个文本字符串值</span></p>
            <p><span style="font-family: 宋体">服务器的响应，表示为一个XML</span></p>
            <p><span style="font-family: 宋体">服务器的HTTP状态码</span></p>
            <p><span style="font-family: 宋体">HTTP</span><span style="font-family: 宋体">状态码的相应文本</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="margin-left: 39pt; text-indent: -18pt; tab-stops: list 39.0pt"><strong><span style="font-size: 12pt; font-family: 宋体">2．</span></strong><strong><span style="font-size: 12pt; font-family: 宋体">利用XMLHttpRequest对象发送简单请求</span></strong></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">创建了XMLHttpRequest对象，并了解了XMLHttpRequest对象的方法和属性之后，让我们来看看怎样利用XMLHttpRequest对象发送简单的请求。利用XMLHttpRequest对象发送简单请求的基本步骤如下：</span></p>
<p style="margin-left: 39pt; text-indent: -18pt; tab-stops: list 39.0pt"><span style="font-family: 宋体">1）&nbsp;</span><span style="font-family: 宋体">创建XMLHttpRequest对象实例。</span></p>
<p style="margin-left: 39pt; text-indent: -18pt; tab-stops: list 39.0pt"><span style="font-family: 宋体">2）&nbsp;</span><span style="font-family: 宋体">设定XMLHttpRequest对象的回调函数，利用onreadystatechange属性。</span></p>
<p style="margin-left: 39pt; text-indent: -18pt; tab-stops: list 39.0pt"><span style="font-family: 宋体">3）&nbsp;</span><span style="font-family: 宋体">设定请求属性：设定HTTP方法（GET或POST）；设定目标URL。利用open()方法。</span></p>
<p style="margin-left: 39pt; text-indent: -18pt; tab-stops: list 39.0pt"><span style="font-family: 宋体">4）&nbsp;</span><span style="font-family: 宋体">将请求发送给服务器。利用send()方法。</span></p>
<p style="margin-left: 39pt; text-indent: -18pt; tab-stops: list 39.0pt"><strong><span style="font-size: 12pt; font-family: 宋体">3．</span></strong><strong><span style="font-size: 12pt; font-family: 宋体">利用DOM对服务器响应进行处理</span></strong></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">前面已经设置了回调函数，回调函数正是用来处理服务器响应信息的。但是，别忘了我们的最终目的：解决页面完全刷新和缺乏交互性的问题。在服务器对我们的请求信息作出响应后，我们就得实现页面的无缝更新（就是无闪烁的更新信息）。要实现这一点，那么就不得不提到DOM了。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">DOM</span><span style="font-family: 宋体">（Document Object Model）,文档对象模型，是以面向对象方式描述页面文档的对象模型。DOM中定义了，与平台和语言无关的，用来表示和修改文档所需的对象、以及这些对象的属性和方法。通过DOM，我们可以把页面上的数据和结构抽象成一个树型表示，进而可以通过DOM中定义的属性和方法对文档进行操作，如遍历、编辑等。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">这样，服务器相应信息就可以通过DOM的方法和属性，动态的更新到页面的相应节点。</span></p>
<p><span style="font-family: 宋体">从而使用户感觉不到刷新过程的存在，提高了交互性。</span></p>
<p style="margin-left: 39pt; text-indent: -18pt; tab-stops: list 39.0pt"><strong><span style="font-size: 12pt; font-family: 宋体">4．</span></strong><strong><span style="font-size: 12pt; font-family: 宋体">一个完整的例子</span></strong></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">在这里我们给出一个完整的利用Ajax的实例。实例包含两个文件：Request.htm和Response.xml。通过Request.htm向服务器发送请求，而Response.xml模仿了从服务器返回的响应。两个文件清单如下：</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">&lt;!--Request.htm-----------------------------------------------------------&gt;</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">&lt;html&gt;</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;head&gt;</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;title&gt;Ajax</span><span style="font-family: 宋体">应用实例&lt;/title&gt;</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;script type="text/javaScript"&gt;</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var xmlHttp;</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="font-family: 宋体">var requestType="";</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: purple; font-family: 宋体">function createXMLHttpRequest(){</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: purple; font-family: 宋体">&nbsp;&nbsp;&nbsp; if(window.ActiveXObject){</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: purple; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: purple; font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: purple; font-family: 宋体">&nbsp;&nbsp;&nbsp; else if(window.XMLHttpRequest){</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: purple; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlHttp = new XMLHttpRequest();</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: purple; font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: purple; font-family: 宋体">}</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: #333399; font-family: 宋体">function startRequest(theRequestType){</span></p>
<p style="margin-left: 84pt; text-indent: 21pt"><span style="color: #333399; font-family: 宋体">requestType = theRequestType;</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: #333399; font-family: 宋体">&nbsp;&nbsp;&nbsp; createXMLHttpRequest();</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: #333399; font-family: 宋体">&nbsp;&nbsp;&nbsp; xmlHttp.onreadystatechange = handleStateChange;</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: #333399; font-family: 宋体">&nbsp;&nbsp;&nbsp; xmlHttp.open("GET","Response.xml",true);</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: #333399; font-family: 宋体">&nbsp;&nbsp;&nbsp; xmlHttp.send(null);</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: #333399; font-family: 宋体">}</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: purple; font-family: 宋体">function myCallback(){</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: purple; font-family: 宋体">&nbsp;&nbsp;&nbsp; if(xmlHttp.readyState==4){</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: purple; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(xmlHttp.status==200){</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: purple; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(requestType=="all")</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: purple; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; listAll();</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: purple; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(requestType=="north")</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: purple; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; listNorth();</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: purple; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: purple; font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: purple; font-family: 宋体">}</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: #333399; font-family: 宋体">function listAll(){</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: #333399; font-family: 宋体">&nbsp;&nbsp;&nbsp; var xmlDoc = xmlHttp.responseXML;</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: #333399; font-family: 宋体">&nbsp;&nbsp;&nbsp; var allProvs = xmlDoc.getElementsByTagName("prov");</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: #333399; font-family: 宋体">&nbsp;&nbsp;&nbsp; outputList("all",allProvs);</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: #333399; font-family: 宋体">}</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: purple; font-family: 宋体">function listNorth(){</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: purple; font-family: 宋体">&nbsp;&nbsp;&nbsp; var xmlDoc = xmlHttp.responseXML;</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: purple; font-family: 宋体">&nbsp;&nbsp;&nbsp; var north = xmlDoc.getElementsByTagName("north")[0];</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: purple; font-family: 宋体">&nbsp;&nbsp;&nbsp; var northProvs = north.getElementsByTagname("prov");</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: purple; font-family: 宋体">&nbsp;&nbsp;&nbsp; outputList("north",northProvs);</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: purple; font-family: 宋体">}</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: #333399; font-family: 宋体">function outputList(title,provs){</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: #333399; font-family: 宋体">&nbsp;&nbsp;&nbsp; var out=title;</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: #333399; font-family: 宋体">&nbsp;&nbsp;&nbsp; var currentProv = null;</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: #333399; font-family: 宋体">&nbsp;&nbsp;&nbsp; for(var i=0;i&lt;provs.length;i++){</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: #333399; font-family: 宋体">&nbsp;&nbsp;&nbsp; currentProv = provs[i];</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: #333399; font-family: 宋体">&nbsp;&nbsp;&nbsp; out = out + &#8220;&lt;br/&gt;&#8221; + currentProv.childNodes[0].nodeValue;</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: #333399; font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: #333399; font-family: 宋体">&nbsp;&nbsp;&nbsp; document.getElementById(title).innerHTML = out;</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="color: #333399; font-family: 宋体">}</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/script&gt;</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;/head&gt;</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;body&gt;</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;h1&gt; Ajax</span><span style="font-family: 宋体">应用实例&lt;/h1&gt;</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form action="#"&gt;</span></p>
<p style="margin-left: 84pt"><span style="font-family: 宋体">&lt;input type="button" value="</span><span style="font-family: 宋体">列出所有沿海省市"</span></p>
<p style="margin-left: 105pt; text-indent: 21pt"><span style="font-family: 宋体">conclick="startRequest('all');</span><span style="font-family: 宋体">"/&gt;</span></p>
<p style="margin-left: 84pt"><span style="font-family: 宋体">&lt;div id="all"&gt;&lt;/div&gt;</span></p>
<p style="margin-left: 84pt"><span style="font-family: 宋体">&lt;input type="button" value="</span><span style="font-family: 宋体">列出江北沿海省市" </span></p>
<p style="margin-left: 84pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conclick="startRequest('north');</span><span style="font-family: 宋体">"/&gt;</span></p>
<p style="margin-left: 84pt"><span style="font-family: 宋体">&lt;div id="north"&gt;&lt;/div&gt;</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/form&gt;</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;/body&gt;</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">&lt;/html&gt;</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">&lt;!--Response.xml----------------------------------------------------------&gt;</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">&lt;?xml version="1.0"encoding="utf-8" ?&gt;</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">&lt;provs&gt;</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;north&gt;</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prov&gt;</span><span style="font-family: 宋体">辽宁&lt;/prov&gt;&lt;prov&gt;河北&lt;/prov&gt;&lt;prov&gt;天津&lt;/prov&gt;</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="font-family: 宋体">&lt;prov&gt;</span><span style="font-family: 宋体">山东&lt;/prov&gt;&lt;prov&gt;江苏&lt;/prov&gt;</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;/north&gt;</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;south&gt;</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prov&gt;</span><span style="font-family: 宋体">浙江&lt;/prov&gt;&lt;prov&gt;福建&lt;/prov&gt;&lt;prov&gt;广东&lt;/prov&gt;</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="font-family: 宋体">&lt;prov&gt;</span><span style="font-family: 宋体">广西&lt;/prov&gt;&lt;prov&gt;海南&lt;/prov&gt;&lt;prov&gt;上海&lt;/prov&gt;</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="font-family: 宋体">&lt;prov&gt;</span><span style="font-family: 宋体">台湾&lt;/prov&gt;&lt;prov&gt;香港&lt;/prov&gt;&lt;prov&gt;澳门&lt;/prov&gt;</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;/south&gt;</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">&lt;/provs&gt;</span></p>
<p><strong><span style="font-size: 12pt; font-family: 宋体">小结</span></strong></p>
<p><strong><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><span style="font-family: 宋体">我们已经了解了Ajax的基本原理和相关的技术。其实，Ajax就是通过JavaScript创建XMLHttpRequest对象，再由JavaScript调用XMLHttpRequest对象的方法完成异步通信；然后，再由JavaScript通过DOM的属性和方法，完成页面的不完全刷新。</span></p>
<p><strong><span style="font-size: 12pt; font-family: 宋体">参考文献</span></strong></p>
<p><span style="font-family: 宋体">1</span><span style="font-family: 宋体">．Ryan Asleson , Nathaniel T.Schutta 著金灵等译《Ajax基础教程 人民邮电出版社</span></p>
<p><span style="font-family: 宋体">2</span><span style="font-family: 宋体">．张晓龙&nbsp;基于Ajax的web应用&nbsp;《电脑开发与应用》第19卷第8期&nbsp;17～18页</span></p>
<p><span style="font-family: 宋体">3</span><span style="font-family: 宋体">．史胜辉&nbsp;Ajax技术在WEB客户端开发中的应用 《中国管理信息化》2006年6月第9卷第6期 &nbsp;88～90页</span></p>
<img src ="http://www.blogjava.net/libin2722/aggbug/159715.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2007-11-11 14:07 <a href="http://www.blogjava.net/libin2722/articles/159715.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ajax 和 XML: 五种 Ajax 反模式</title><link>http://www.blogjava.net/libin2722/articles/158140.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Sun, 04 Nov 2007 16:15:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/158140.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/158140.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/158140.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/158140.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/158140.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Ajax 和 XML: 五种 Ajax 反模式            避免常见的 Ajax 代码陷阱                                                                                                                        ...&nbsp;&nbsp;<a href='http://www.blogjava.net/libin2722/articles/158140.html'>阅读全文</a><img src ="http://www.blogjava.net/libin2722/aggbug/158140.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2007-11-05 00:15 <a href="http://www.blogjava.net/libin2722/articles/158140.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>