AJAX + SVG 实现实时监控图表

使用 svg 图表进行数据可视化 本文是Web数据可视化案例系列文章的第二篇。文章中介绍的项目是一个完整可运行的可视化项目。前台使用json对象展示数据表的数据,并且使用javascript绘制svg图像将数据可视化。后台使用python的pandas库进行数据处理,先将数据从数据库中多个历史表中查询出来,再把数据组织成前台需要的json结构,然后通过Bottle这个极其轻便、能够快速上手的Web框架将json数据传递给前台。 阅读详情

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
  • MeterChart.svg
  • DyMeter.jsp

首先看看 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 你能做得更好!

下载

点击下载源代码

智慧家安监控系统——用Java + html、css、js实现 目录系统背景系统介绍前端SVG监控情况弹出窗口图表后端表格处理Servlet类数据处理类前后端的数据交互内容及设计采用Servlet技术采用Ajax技术前后端数据交互操作前端第三方库介绍后端用的第三方JAR包的介绍一些小特色总结一些有用的参考链接 系统背景 随着人们生活水平的提高以及计算机网络的普及,尤其是近年来信息技术的发展和人们生活条件的改善,有更多的家庭都希望能够通过电脑、手机等网络设备实现家庭设备的远程监控。目前大部分的家庭监控系统都是以摄像头作为载体,一般仅仅用于监视,而在控制方面几乎没有,或者是 阅读详情

相关推荐

前端实操:利用Ajax、VML和JS打造实时监控报表

本文还有配套的精品资源,点击获取 简介:本项目利用前端技术实现Web应用中的实时数据更新和可视化,使用Ajax技术实现无需刷新页面的数据交互,采用VML技术在IE浏览器上绘制矢量图形报表,结合JavaScript处理页面交互和控制逻辑。项目结构涵盖了Eclipse和MyEclipse的配置文件、源代码、Web资源等,为开发者提供一个深入学习前端动态更新和图形渲染技术的完整案...

weixin_34162851的博客 2454

PPTAgent与DeepPresenter对比分析:两大AI演示生成系统的特色与适用场景

PPTAgent与DeepPresenter是两款领先的AI演示生成系统,它们通过不同的技术路径为用户提供智能演示文稿创建解决方案。PPTAgent作为EMNLP 2025收录项目,采用基于参考幻灯片的编辑式生成方法;而DeepPresenter作为ACL 2026收录项目,则强调环境驱动的反射式智能体框架。本文将从核心功能、技术架构、适用场景三个维度对比分析这两大系统的特色。 ## 核心功能对

gitblog_00002的博客 700

ECharts图表库:数据可视化实战教程.zip

ECharts自2013年由百度团队开源以来,已经成为前端数据可视化领域中广泛应用的JavaScript图表库。它的发布不仅填补了国内在这一领域的空白,也迅速成为全球范围内开发者的宠儿。Ajax(Asynchronous JavaScript and XML)是一种在无需重新加载整个页面的情况下,能够更新部分网页的技术。通过Ajax,可以使用JavaScript向服务器提出请求并处理响应。与传统网页请求的同步处理方式不同,Ajax支持异步请求,使得用户界面更为友好和响应迅速。

weixin_35755188的博客 681

数据可视化 SVG (一)

1 邂逅SVG和初体验 2 网格和坐标系 3 视口和视图框 4 绘制形状和路径 5 绘制文字和图片 6 SVG分组和复用 7 填充和边

weixin_56663198的博客 1206

基于JavaScript的FusionCharts图表实现与多语言集成实战

简介:FusionCharts是一款功能强大的JavaScript图表库,支持创建交互式、动画丰富的数据可视化图表,广泛应用于各类业务报表中。该库兼容C#、VB.NET、PHP和JSP等多种后端技术,便于在不同开发环境中集成。它提供20多种图表类型,包括柱状图、饼图、雷达图和仪表盘等,具备高度自定义、响应式布局、多语言支持及数据导出等功能。通过Ajax可实现数据实时更新,结合评估版资源可快速上手开发。

weixin_36178216的博客 839

R语言实战:Scheirer–Ray–Hare检验在非正态重复测量数据分析中的应用

本文详细介绍了当重复测量数据不满足正态分布假设时,如何利用R语言中的Scheirer–Ray–Hare检验进行数据分析。该检验作为非参数方法,无需数据服从正态分布或方差齐性,适用于分析组间差异、时间效应及其交互作用。文章通过实战案例,从环境搭建、数据准备、检验执行到结果解读与可视化,提供了完整的操作指南,帮助研究者有效处理心理学、医学等领域的复杂实验数据。

salt9的博客 780

项目总结[2]_svg+ajax+webservice+pSpace sdk实现实时数据的web展示

1.使用svg实现组态画面和动态数据展示 通过js的定时器调用webservice方法获取数据后更新节点数据 /// <summary>启动定时刷新</summary> function Start() { InitSvgElement(); this.timer = setIn...

weixin_30920091的博客 470

SAP移动类型

SAP移动类型移动类型定义 移动类型定义

qq_20593197的博客 6205

ajax异步获取svg,AjaxSVG实现煤矿井下排水的实时监测.doc

收稿日期:2010-09-10;修回日期:2010-12-01基金项目:黑龙江省教育科学振兴老工业基地项目(1152gzd08作者简介:李春华(1959-,女,黑龙江尚志人,教授,硕士,研究方向为智能控制及故障诊断。Ajax SVG 实现煤矿井下排水的实时监测李春华,李春静(黑龙江科技学院电气与信息学院,黑龙江哈尔滨150027摘要:为了解决传统B /S 结构实时监控系统在线运行期间存在网络负载大...

weixin_30416493的博客 238

工业4.0 底层逻辑

工业4.0 的概念已经被滥用了,它与物联网,工业物联网等概念一样,几乎什么都往里面装。演变成了一句口号和愿景。许多人并不清楚工业4.0的底层逻辑到底是什么?如何遵循工业4.0 的思想构建新一代智能制造系统?并没用清晰地展示工业4.0的技术路线图。

姚家湾博客 1993

保姆级教程:在MMSegmentation框架下复现HRNetV2+OCR语义分割(附完整代码与调试技巧)

本文提供了一份详细的MMSegmentation框架下HRNetV2+OCR语义分割的复现教程,包含完整代码与调试技巧。通过解析HRNetV2的多尺度特征融合和OCR模块的注意力计算,帮助开发者快速实现这一经典语义分割方案,并解决实际工程中的常见问题。

weixin_42527464的博客 359

svg应用

今天没什么事情,发一个以前做的图表的例子,希望对初学者能有所帮助! 这是用我用svg做的一个曲线例子,可以很好的和后台交互达到实时监控的效果;svg主要就是应用js操纵图表元素,实现图表的修改;它有很好的前端的交互性; 这是我例子的截图,共有3条曲线间隔3妙交替显示,例子没有涉及和后台的数据交互,我们现在的项目中应用ajax实现数据收发。 [img]http://daoger.iteye.c...

My english is poor,but I am happy to speak my poor english! 174

认知网络分析实战:用Python复现课堂对话研究(含LSA代码)

本文通过Python实战,详细演示了如何运用认知网络分析(ENA)和滞后序列分析(LSA)两种方法,对课堂对话数据进行深度挖掘。文章提供了从数据清洗、行为编码到网络构建、序列统计及可视化的完整代码流程,帮助教育研究者和数据分析师量化分析对话中的认知结构与动态互动模式,从而获得超越文本表面的研究洞见。

weixin_28559803的博客 155

NVD3工业4.0:生产线实时监控数据可视化终极指南

NVD3作为基于d3.js构建的可复用图表库,是工业4.0时代实现生产线实时数据可视化的强大工具。通过其丰富的图表类型和灵活的配置选项,企业能够轻松将复杂的生产数据转化为直观易懂的可视化仪表盘,助力决策者快速掌握生产状态并优化流程。 ## 为什么选择NVD3进行工业数据监控? 在工业4.0转型过程中,数据可视化是实现智能决策的关键环节。NVD3凭借以下优势成为理想选择: - **开箱即用的图

gitblog_00090的博客 920

使用PLINK做GWAS(2)

利用PLINK对单基因控制的性状进行定位,之前一篇文章粗滤的记录了一下使用PLINK的命令,本次博客主要记录一下如何根据SNP芯片的数据制作PLINK的格式,以及分析的步骤,最后数据的可视化。 首先,有的公司给的新片的数据就是一个excel表格,列表示的是样品,行表示的是基因型,基因型用ATCG构成,当然有的基因型是用数字0或者1表示的。下面我拿到的一个数据是15个样品构成的基因型,有13个样品是突变体,2个样品是野生型。 格式如下: 第二步:将此基因型存成csv文件,使用R进行读取,在R中制作pl

samhuairen的专栏 2921

【乐企】有关乐企能力测试接口对接-基础版(详细)

乐企能力测试接口对接详细代码以及步骤

九七的博客 7658

Highcharts前端图表库动态渲染CosyVoice3实时数据

通过Highcharts动态可视化CosyVoice3语音合成系统的运行状态,实时展示GPU、CPU使用率及任务队列等关键指标,提升系统透明度与用户体验。结合AJAX轮询或WebSocket实现数据更新,并通过颜色编码与告警提示辅助问题诊断,构建可感知的AI服务仪表盘。

weixin_42668301的博客 736

RK3588 Buildroot 新建板级DTS

在rk3588 linux开发过程中,新创建板型主要基于硬件差异化、软件适配与优化、项目定制化等多方面需求。

501846585_QQAndroid_java 1298
上一篇: GUI开发参考
下一篇: 使用标准文件流操作文件
htt9931
博客等级 码龄24年 43粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值