AJAX 已經有很多文章介紹它的原理及其應用了。但是遺憾的是現在並沒有很多結合實際項目應用。本文結合實際項目中的應用來講述利用 AJax 和SVG 技術如何創建各種激動人心的功能,並附帶可以運行的例子和源代碼。
本文需要一定的 AJax,SVG 知識和應用經驗。當然它們都可以在 ibm.com/developerworks/cn 上找到。
個人對於 AJAX 應用的建議是如果傳統的 MVC 能夠滿足的應用,沒有必要使用AJAX來代替,因為這裡 AJAX 唯一能帶來的好處只是無刷新。AJax 是用來幫助我們實現以往使用傳統 web 技術難以實現的功能的。
1. AJAX ,AJax(Asynchronous Javascript and XML)是多種技術的綜合,它使用 XHtml和 CSS 標准化呈現,使用 DOM 實現動態顯示和交互,使用 XML 和 XSTL 進行數據交換與處理,使用 XMLHttpRequest 對象進行異步數據讀取,使用 Javascript 綁定和處理所有數據。更重要的是它打破了使用頁面重載的慣例技術組合,可以說 AJax 已成為 Web 開發的重要武器
2. SVG(Scalable Vector Graphic) 是一個標准開放的矢量圖像格式。它使你設計的網頁可以更加精彩,更加細致。使用簡單的文本命令,SVG 甚至可以做出諸如色彩線性變化、自定義置入字體、透明、動態效果、慮鏡效果等各式常見的圖像效果。SVG 圖像是基於 XML(可擴展標識語言--未來的網絡語言)的應用,並由 W3C 組織的 SVG 開發組負責詳細的研究和開發。
3. DWR,DWR是一個開源的類庫,可以幫助開發人員開發包含 AJax 技術的網站。它可以允許在浏覽器裡的代碼使用運行在 WEB 服務器上的 Java 函數,就像它就在浏覽器裡一樣。
閱讀本文最好具有下列知識:
1. AJax 開發應用
2.SVG 相關知識,特別是與JavaScript交互。(developerworks 上有非常詳盡 SVG 的技術文章)
3. DWR基礎。 (developerWworks 上有非常詳盡的DWR框架的技術文章和例子,本文不詳細結束DWR基礎知識。)例如: http://www.ibm.com/developerworks/cn/Java/j-AJax3/
技術敘述的再好,不如一個實際的例子,我們先看看實際效果。讀者可以先下載本文附帶的例子,發布到任何一個支持JSP1.1的servle服務器上,例如Tomcat4.0或者 webshpere,weblogic上,然後訪問頁面:http://localhost:端口/AJaxSVG/DyMeter.JSP。(以Tomcat為例,端口就是8080)
點擊開始按鈕,你會發現圖表的指針會根據服務器的數據實時擺動。很類似與一個汽車儀器儀表盤,這是以往 cs 軟件或者是 Flash 才能實現的效果,現在我們使用純 web 的形式實現了。
從專業術語來說,它實際上是一個 Dash Board,其實在各種 BI(商業智能)應用中都可以看到它,它的靈感來自於汽車的儀表盤,它非常直觀的反映了當前數據的狀態,例如處於危險,安全,過低等等。
當然它並不新鮮,很多軟件都能提供這種圖表,我們今天要使用 AJax 和 SVG 來突破傳統應用,以往的軟件生成的圖片都是靜態的,注意我這裡的靜態是指它們生成的圖片上的指針不會像真正的汽車儀表盤一樣隨著汽車的各種數據的變化,例如速度、油量的變化而擺動,根據汽車的實時速度而擺動,而是用戶刷新一次頁面,軟件根據服務器端的數據重新生成圖片再顯示給最終用戶。
傳統的這種方式對於一般的 BI 應用來說是完全足夠了,但是對於實時性要求比較高的系統來說,利用監控系統來說,不可能要求用戶隨時刷新頁面,或者使用 JavaScript 來定時刷新頁面,這樣效果非常差,而且服務器端反復在內存,或者硬盤中生成圖片,用戶數量多之後,系統負擔太重了。
我們拋開技術想一下,我們實際上只想改變指針的位置就行了,根本沒有必要生成整個圖片或者是傳遞整個圖片的數據給客戶端。這種設置非常不合理,但是這在以往的技術上是難以完成的。
現在如果使用AJax技術,我們只需要傳輸過來當前的數據,告訴儀表盤的指針應該指向哪裡就行了。無需頁面刷新,無需重新生成圖片,並且網絡端,服務器端,用戶端的開銷都非常少,以往的方案沒有經驗的程序員經常會導致內存溢出,現在采用這種方案這種錯誤的風險就大大減小了。
其實原理並不復雜,我們利用 SVG 來繪制儀表盤,然後利用 AJax 技術定時向服務器請求更新數據(也就是指針所指向的數據),如果數據更新了,則調用 JavaScript 腳本讓SVG 的儀表盤重新定位指針,這樣就實現了圖表的實時刷新。下圖描述了各種技術的在本教程中的用途。
這個例子程序由一個 SVG 文件,JSP 文件,和一個 Java 類組成:
首先看看 MeterRemote.Java,它生成了指針所指向的數據,作為例子我只是生成一個隨機數據,在實際項目中它就應該是返回實際的數據,例如,汽車儀表盤就是當前汽車的時速。它們在實際項目中可以來自在實際項目中數據可以是來自數據庫,JMS,Web 服務,EJB 等。
import Java.util.Random;public class MeterRemote {private double curr_value,full_value=200;public double getDegree(){Random r=new Random();curr_value=r.nextInt(200);return curr_value/full_value*270;}}
接著我們利用 DWR 引擎把該 Java 類發布,讓遠程 AJax 應用能夠調用該 Java 類的方法 getDegree()。
打開 dwr.XML 文件,在本文提供的例子從您可以看到它,添加如下代碼:
<allow>
<create creator="new" Javascript="MeterRemote">
<param name="class" value="com.nbw.svg.DyChart.AJax.MeterRemote"/>
</create>
</allow>
這樣 DWR 就把一個 Java 類發布出來了,可以在頁面通過 JS 就可以直接調用它了,非常的簡單。它和大多數框架一樣使用了一個 XML 文件來完成自己的配置,使用 creat 標簽可以發布一個 java 類,creator=new 表明創建方式是通過new來創建實例,java 類這裡的配置都是一樣的,因為它支持spring和struts才會有不同的creator。Javascript="MeterRemote"說明了它在頁面中使用MeterRemote對象(JS對象)來調用。Param標簽就定義了具體的類的名稱。使用DWR還可以指定調用的權限和指定具體的Java類的方法,而不是把所有的對象的方法都發布出來。跟多的配置信息請查閱ibm上其它文章。
重新啟動服務器,使用浏覽器打開如下地址:
http://localhost:8080/AJaxSVG/dwr
如下圖所示:
會看到MeterRemote鏈接,說明發表成功了,單擊該鏈接 http://localhost:8080/AJaxSVG/dwr/test/MeterRemote 會看到測試頁面,它上面包含了如何使用,和可以調用的方法。
如下圖所示:
你可以點擊 Excute 來測試一下效果,這樣網頁就能夠直接調用 Java 端的程序了。接著我們看看 JSP 文件。
首先導入 JS,這樣才能:
1.<script type='text/Javascript' src='/ AJaxSVG
/dwr/engine.JS'></script>
2.<script type='text/Javascript' src='/ AJaxSVG
/dwr/util.JS'></script>
3.<script type='text/Javascript'src='/ AJaxSVG
/dwr/interface/MeterRemote.JS'></script>
1,2行是DWR引擎所需要的兩個JS文件。第3行是導入DWR引擎調用POJO Java所需要的JS文件。
function getValue()
{
MeterRemote.getDegree(loadinfo);
}
上面的方法從服務器端取得儀表盤的指針的數據。
重點是以下代碼:
function loadinfo(data){DWRUtil.setValue("reply1", data); curr_degree=data; var svgDocument = window.sample.getSVGDocument();chart=svgDocument.getElementById("line2");chart.setAttribute( "from", last_degree+",250,250"); chart.setAttribute( "to", curr_degree+",250,250"); chart.beginElement(); last_degree=curr_degree;}
上面的代碼根據遠程調用得到的儀表盤的指針數據來動態的改變SVG圖中指針的位置。
其中:
var svgDocument = window.sample.getSVGDocument();
得到SVG對象。
chart=svgDocument.getElementById("line2");
得到指針對象。
chart.setAttribute( "from", last_degree+",250,250"); chart.setAttribute( "to", curr_degree+",250,250");chart.beginElement();
遠程調用得到的儀表盤的指針數據來動態的改變SVG圖中指針的位置。
最後我們看看SVG文件,下面是值得關注的代碼部分
<circle cx="250" cy="250" r="150.0" fill="#ffffff"/><path d="M143.93398282201787 356.0660171779821 A150.0 150.0 , 0, 0,1,101.84674891072936 226.53483024396536 L250 250, Z" class="fill1"/><path d="M101.84674891072936 226.53483024396536 A150.0 150.0 , 0, 0,1,181.90142503906804 116.34902137174478 L250 250, Z" class="fill2"/><path d="M181.90142503906804 116.34902137174478 A150.0 150.0 , 0, 0,1,318.098574960932 116.34902137174484 L250 250, Z" class="fill3"/><path d="M318.098574960932 116.34902137174484 A150.0 150.0 , 0, 0,1,398.1532510892706 226.53483024396536 L250 250, Z" class="fill4"/><path d="M398.1532510892706 226.53483024396536 A150.0 150.0 , 0, 0,1,356.06601717798213 356.06601717798213 L250 250, Z" class="fill5"/><circle cx="250" cy="250" r="3" style="fill: #00C"/><line x1="129.7918471982869" y1="370.208152801713" x2="250" y2="250"style="stroke: #F00;stroke-width: 2px" id="finger"><animateTransform attributeName="transform" attributeType="XML" type="rotate" from="0,250,250" begin="run()" to="20,250,250" dur="2"fill="freeze" style="stroke: #F00;stroke-width: 2px" id="line2"/></line>
實際上上面的 SVG 代碼定義了一個靜態的指針指向 0 度的儀表盤。它由 <path> 標簽定義的。它往往是通過軟件來生產的,因為能生成 SVG 圖表的軟件非常多,例如 jfreechart 等,和文章篇幅限制就不詳細結束 SVG 圖表了。
結束語
使用本例子的原理我們已經在數個實際項目中應用了,從用戶使用的實際效果來說,性能和效果都非常滿意。替代了以往用戶使用 CS 軟件才能實現的實時監控圖表的功能,現在 AJAX 替代傳統的各種 MVC(例如Struts,JSF)框架並不能顯示出它的威力,特別是在開發 AJAX 工具奇缺,開發測試效率低下。但是它與其他技術的融合例如 SVG,往往能發揮意想不到的效果。AJax 和各種新興的 Web 2.0 技術的出現大大的豐富了 Web 程序員的技術力量,把以往只有 CS 軟件才能實現的功能,不僅實現了,而且更加完美和高效。
擁抱 AJax 擁抱 Web 2.0 你能做得更好!
下載
點擊下載源代碼