emu in blogjava

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            171 隨筆 :: 103 文章 :: 1052 評論 :: 2 Trackbacks

          在上一篇《Ajax裸奔》中,我們定義了如此一個xml文件:

          news.xml:

           

          <?xml version="1.0" encoding="gb2312"?>
          <data>
           焦點|工行小額賬戶明年收費 不足300元要歸并
          &lt;br /&gt;
           財經|
          &quot;神六&quot;飛行開銷僅為美航天飛機4.5% 花9億&lt;br /&gt;
           財經|2005能源富豪榜揭榜 超市要撤致癌保鮮膜
          &lt;br /&gt;
           證券|神六催生高價股 MBO公司股改 高管一夜暴富
          &lt;br /&gt;
           證券|保險公司告基金利益輸送 科龍管理班子亮相 
          &lt;br /&gt;
           科技|神六飛船成功著陸 載人飛行取得圓滿成功
          &lt;br /&gt;
           關注|索尼中國不裁員 夏普與南京熊貓分道揚鑣 
          &lt;br /&gt;
           熱點|北電任命新總裁兼CEO 索愛發布第三季財報
          &lt;br /&gt;
           數碼|300萬像素手機推薦 最有降價潛力手機導購
          &lt;br /&gt;
           測評|近期五大DC跳水王 怪模怪樣個性手機推薦
          &lt;br /&gt;
           探索|亞歷山大古城的文化歷史 勝利者改寫歷史 
          &lt;br /&gt;
          </data>

           

          這確確實實是一個合法的xml文件,但是不是一個漂亮的xml文件。xml語言的一個巨大的優勢是自說明性。上面這個xml語言只說明了一件事:我有一堆數據(data標記),大家拿去用阿。可是怎么用呢,只能靠約定了。
          一個漂亮一點的xml應該像這樣:

          news2.xml:

          <?xml version="1.0" encoding="gb2312"?>
          <newsList>
           
          <title type="焦點">工行小額賬戶明年收費 不足300元要歸并</title>
           
          <title type="財經">&quot;神六&quot;飛行開銷僅為美航天飛機4.5% 花9億</title>
           
          <title type="財經">2005能源富豪榜揭榜 超市要撤致癌保鮮膜</title>
           
          <title type="證券">神六催生高價股 MBO公司股改 高管一夜暴富</title>
           
          <title type="證券">保險公司告基金利益輸送 科龍管理班子亮相</title>
           
          <title type="科技">神六飛船成功著陸 載人飛行取得圓滿成功</title>
           
          <title type="關注">索尼中國不裁員 夏普與南京熊貓分道揚鑣</title>
           
          <title type="熱點">北電任命新總裁兼CEO 索愛發布第三季財報</title>
           
          <title type="數碼">300萬像素手機推薦 最有降價潛力手機導購</title>
           
          <title type="測評">近期五大DC跳水王 怪模怪樣個性手機推薦</title>
           
          <title type="探索">亞歷山大古城的文化歷史 勝利者改寫歷史 </title>
          </newsList>

          這個xml非常好的說明了所有的事情:xml的內容是新聞標題,每個標題的分類是什么,標題內容是什么,一目了然,甚至一個不懂中文的程序員也可以從xml標記和層次中了解到這些信息,不需要多余的猜測和約定。

          第一種方式,我通常稱之為AJaH(Asynchronous Javascript and Hyper-text),第二種,我才稱為真正的Ajax。

          開發Ajax應用中,我們經常要面臨的一個選擇就是,用上面AJaH的方式還是下面Ajax的方式來組織數據。這并不是可以簡單的一刀切的問題,很大程度上取決于開發者對各方面優劣的取舍。我在這里只把兩者的優劣大概的列一下。
          1 Ajax比較好聽,有個球隊叫阿賈克斯的就是這么拼的,AjaH就不知道要怎么念才好聽了:)
          2 AjaH解析起來更容易更快。按照約定包裝好的數據只需要最少的加工就可以使用了,按照規范形式包裝的數據需要相對復雜的解析過程
          3 Ajax更加通用。用Ajax我們很容易就可以吧同一個CGI(廣義的cgi)生成的xml數據使用在任何不同的場合,而不需要后臺服務程序做出任何修改,用AjaH的話就很可能需要為相同的數據做出不同的版本。
          4 AjaX更不容易出錯,需要的時候我們可以建立DTD或者xmlschema來自動校驗xml數據的正確性,二AjaH的正確性則需要手工驗證來保障。
          5 Ajax更容易維護和修改。AjaH的數據中往往整合了html/css美工效果和上下文相關的javascript代碼,混合編碼造成了代碼維護的代價比較高。

          作為對比,我們試試解析新的news2.xml文件來生成頁面:

          betterAjax.html:
          <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
          <html>
          <head>
           
          <meta http-equiv="Content-Type" content="text/html; charset=gb18030" />
           
          <meta name="Author" content="emu" />
           
          <meta name="Keywords" content="ajax" />
           
          <title> 更好的Ajax例子 </title>
           
          <script type="text/JavaScript">
           
          <!--
           
          var newsXML;
           
          function init(){
            newsXML 
          = window.XMLHttpRequest?(new XMLHttpRequest()):(new ActiveXObject("Microsoft.XMLHTTP"));
            newsXML.onreadystatechange
          = handleXML;
            newsXML.open(
          "GET","news2.xml",true);
            newsXML.send(
          null);
           }
           
          function handleXML(){
            
          if(newsXML.readyState==4){
             
          var titleList = newsXML.responseXML.getElementsByTagName("title");
             
          var st = "";
             
          for(var i=0;i<titleList.length;i++){
              x 
          = titleList[i];
              st 
          += x.getAttribute("type")+"|"+(x.text?x.text:x.textContent)+"<br />";
             }
             document.body.innerHTML
          =st;
            }
           }
           
          //-->
           </script>
          </head>
          <body onload="init()">
          </body>
          </html>

           

          其實做起來也很容易,對不對?把這個頁面和前面的news2.xml放到同一個目錄下發布即可運行。

          本文全部原碼下載

          posted on 2006-01-26 17:00 emu 閱讀(1998) 評論(10)  編輯  收藏

          評論

          # re: Ajax還是Ajah,這是個問題 2006-02-02 14:50
          為何我無法運行成功?
          emu能否再測試一下?

          就是setp7,還有betterAjax文件

          step7的提示
          Line:21
          Char:4
          Code:0
          Error:Object required
          URL:file://C:\Documents and Settings\Jay-DotKu\My Documents\work\ajax\Ajax01\step7.html

          betterAjax則是沒有反應  回復  更多評論
            

          # re: Ajax還是Ajah,這是個問題 2006-02-02 15:40 emu
          因為你沒有把文件用一個http服務器發布出來。
          xmlhttprequest不能訪問本地文件系統,需要建立http連接才可以。  回復  更多評論
            

          # re: Ajax還是Ajah,這是個問題 2006-02-03 15:01 dingsea
          好文啊,黃老大!
          標記一下。
            回復  更多評論
            

          # re: Ajax還是Ajah,這是個問題 2006-03-17 09:25 tonghu006
          你好,emu,你的這個例子我把它放到IIS中運行怎么運行不出結果來呢,betterajax.html和step7.html  回復  更多評論
            

          # re: Ajax還是Ajah,這是個問題 2006-03-17 09:30 tonghu006
          betterajax.html這個不能運行出效果來,step7.htm現在可以在iis中運行
            回復  更多評論
            

          # re: Ajax還是Ajah,這是個問題 2006-03-17 14:33 emu
          呵呵,我不知道。遇到問題要自己調試。  回復  更多評論
            

          # re: Ajax還是Ajah,這是個問題 2006-05-11 10:26 worldlover
          betterajax.html這個文件運行后沒有任何效果,也沒有提示錯誤,這是怎么會事呀????  回復  更多評論
            

          # re: Ajax還是Ajah,這是個問題 2006-05-22 10:34 tonghu008
          請教一個問題,我用ajax,在服務器的后臺中我用一個循環送出xml,那么我在客戶端接受xml的時候是不是還是要循環接受呢?要是用循環來實現好象不行,怎么才能接受服務器端循環送出的xml文檔呢?請指教指教,謝謝!  回復  更多評論
            

          # re: Ajax還是Ajah,這是個問題 2006-07-14 10:13 aoyuxuan
          emu,你的文章太帥了。我一直都在為怎么在多瀏覽器讀取xml發愁呢。我是初學者,所以有些糊涂,但是你的文章后,猶如醍醐灌頂阿。好文,言簡意賅。^_^
          我還有一個問題,關于xml讀取后,做了一個超鏈接。
          怎么樣能做到,點擊超鏈接后傳到一個頁面后,在另一個頁面實現根據傳得參數調取相應的數據。
          就像使用asp,php那樣,例 發出頁面 http://xxx.asp?title=xxx
          接受頁面 http://yyy.asp
          接受后,根據xxx調出相應的內容。
          用aJax 怎么作?  回復  更多評論
            

          # re: Ajax還是Ajah,這是個問題 2006-07-15 14:34 emu
          這個跟ajax沒用關系了,在yyy.asp上可一通過referrer獲得發出頁面的地址信息來分析(在服務器端和瀏覽器端獲得的方式有點區別),不過更好的做法應該是顯式的傳遞參數:
          http://yyy.asp?title=xxx  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 镇江市| 常山县| 象山县| 鹤山市| 宜宾市| 淳安县| 肥乡县| 开阳县| 仙居县| 开远市| 阳城县| 海安县| 中江县| 贵南县| 崇文区| 泰顺县| 宿松县| 兴安盟| 额尔古纳市| 应用必备| 右玉县| 河北区| 拉孜县| 绥江县| 从化市| 明水县| 皮山县| 云南省| 诸城市| 公主岭市| 古浪县| 临武县| 云林县| 梅州市| 盘锦市| 广饶县| 从江县| 镇安县| 阿拉善右旗| 兴宁市| 电白县|