AJAX + SVG 實現(xiàn)實時監(jiān)控圖表 | ![]() | ![]() |
Written by 皮振華 | |
2006-Jun-28 | |
來源:IBM網(wǎng)站 (IBM.COM) AJAX 已經(jīng)有很多文章介紹它的原理及其應用了。但是遺憾的是現(xiàn)在并沒有很多結(jié)合實際項目應用。本文結(jié)合實際項目中的應用來講述利用 AJAX 和SVG 技術如何創(chuàng)建各種激動人心的功能,并附帶可以運行的例子和源代碼。
AJAX 已經(jīng)有很多文章介紹它的原理及其應用了。但是遺憾的是現(xiàn)在并沒有很多結(jié)合實際項目應用。本文結(jié)合實際項目中的應用來講述利用 AJAX 和SVG 技術如何創(chuàng)建各種激動人心的功能,并附帶可以運行的例子和源代碼。
1. AJAX ,AJAX(Asynchronous JavaScript and XML)是多種技術的綜合,它使用 XHTML和 CSS 標準化呈現(xiàn),使用 DOM 實現(xiàn)動態(tài)顯示和交互,使用 XML 和 XSTL 進行數(shù)據(jù)交換與處理,使用 XMLHttpRequest 對象進行異步數(shù)據(jù)讀取,使用 Javascript 綁定和處理所有數(shù)據(jù)。更重要的是它打破了使用頁面重載的慣例技術組合,可以說 AJAX 已成為 Web 開發(fā)的重要武器
技術敘述的再好,不如一個實際的例子,我們先看看實際效果。讀者可以先下載本文附帶的例子,發(fā)布到任何一個支持JSP1.1的servle服務器上,例如Tomcat4.0或者 webshpere,weblogic上,然后訪問頁面:http://localhost:端口/ajaxSVG/DyMeter.jsp。(以 Tomcat為例,端口就是8080) ![]() 點擊開始按鈕,你會發(fā)現(xiàn)圖表的指針會根據(jù)服務器的數(shù)據(jù)實時擺動。很類似與一個汽車儀器儀表盤,這是以往 cs 軟件或者是 flash 才能實現(xiàn)的效果,現(xiàn)在我們使用純 web 的形式實現(xiàn)了。 從專業(yè)術語來說,它實際上是一個 Dash Board,其實在各種 BI(商業(yè)智能)應用中都可以看到它,它的靈感來自于汽車的儀表盤,它非常直觀的反映了當前數(shù)據(jù)的狀態(tài),例如處于危險,安全,過低等等。 當然它并不新鮮,很多軟件都能提供這種圖表,我們今天要使用 AJAX 和 SVG 來突破傳統(tǒng)應用,以往的軟件生成的圖片都是靜態(tài)的,注意我這里的靜態(tài)是指它們生成的圖片上的指針不會像真正的汽車儀表盤一樣隨著汽車的各種數(shù)據(jù)的變化,例如速度、油量的變化而擺動,根據(jù)汽車的實時速度而擺動,而是用戶刷新一次頁面,軟件根據(jù)服務器端的數(shù)據(jù)重新生成圖片再顯示給最終用戶。 傳統(tǒng)的這種方式對于一般的 BI 應用來說是完全足夠了,但是對于實時性要求比較高的系統(tǒng)來說,利用監(jiān)控系統(tǒng)來說,不可能要求用戶隨時刷新頁面,或者使用 JavaScript 來定時刷新頁面,這樣效果非常差,而且服務器端反復在內(nèi)存,或者硬盤中生成圖片,用戶數(shù)量多之后,系統(tǒng)負擔太重了。 我們拋開技術想一下,我們實際上只想改變指針的位置就行了,根本沒有必要生成整個圖片或者是傳遞整個圖片的數(shù)據(jù)給客戶端。這種設置非常不合理,但是這在以往的技術上是難以完成的。 現(xiàn)在如果使用AJAX技術,我們只需要傳輸過來當前的數(shù)據(jù),告訴儀表盤的指針應該指向哪里就行了。無需頁面刷新,無需重新生成圖片,并且網(wǎng)絡端,服務器端,用戶端的開銷都非常少,以往的方案沒有經(jīng)驗的程序員經(jīng)常會導致內(nèi)存溢出,現(xiàn)在采用這種方案這種錯誤的風險就大大減小了。
![]()
這個例子程序由一個 SVG 文件,JSP 文件,和一個 JAVA 類組成: ![]() 會看到MeterRemote鏈接,說明發(fā)表成功了,單擊該鏈接 http://localhost:8080/ajaxSVG/dwr/test/MeterRemote 會看到測試頁面,它上面包含了如何使用,和可以調(diào)用的方法。 如下圖所示: ![]() 你可以點擊 Excute 來測試一下效果,這樣網(wǎng)頁就能夠直接調(diào)用 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引擎調(diào)用POJO java所需要的js文件。 function getValue() { MeterRemote.getDegree(loadinfo); } 上面的方法從服務器端取得儀表盤的指針的數(shù)據(jù)。 重點是以下代碼: 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; } 上面的代碼根據(jù)遠程調(diào)用得到的儀表盤的指針數(shù)據(jù)來動態(tài)的改變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(); 遠程調(diào)用得到的儀表盤的指針數(shù)據(jù)來動態(tài)的改變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 代碼定義了一個靜態(tài)的指針指向 0 度的儀表盤。它由 <path> 標簽定義的。它往往是通過軟件來生產(chǎn)的,因為能生成 SVG 圖表的軟件非常多,例如 jfreechart 等,和文章篇幅限制就不詳細結(jié)束 SVG 圖表了。
|