使用Open Flash Chart(OFC)制作图表(Struts2处理)
对于服务器资源和网络资源吃紧的项目还不得不想办法,虽然JFreeChart非常的华丽,但是还好有Open Flash Chart,制作简单的柱状图,饼状图和折线图足够用,而且Flash的展示效果绝不比JFreeChart的差。项目地址是:http://teethgrinder.co.uk/open-flash-chart/
先说说Open Flash Chart的工作原理,不要看到Flash就害怕,OFC的开发包内就是一个flash文件,其实我们不需要改动原有的Flash,只需给Flash提供符合规范的数据即可。OFC所需的数据格式就是JSON,JSON不依赖于任何技术(Java,.NET和PHP都有生成JSON代码的工具),这就使得OFC更加Open。本文从Java角度出发,使用Struts2框架,来分析OFC的使用。
GoogleCode社区的一款开源插件为Java开发者使用OFC提供了JSON生成的专用工具,那就是jofc2,我可以使用jofc2采用类似JFreeChart的方式来组织代码,大大提升开发效率。该项目的地址是:http://jofc2.googlecode.com
项目按照Struts2的开发标准搭建,然后把OFC开发所需的flash文件,页面显示Flash的支持文件swfobject.js放到发布目录的相应位置,再将jofc2和其依赖的xstream的jar包放到WEB-INF/lib下并加入编译路径即可。
有这样一个需求:记录系统访问用户所使用的浏览器并用图表显示。那么需要在数据库中记录这样的信息,如图所示:
 这里面记录了9种浏览器的系统访问量,现在我们要在页面中用OFC来显示它,首先对Struts2做配置。代码如下:
- package xxx.app.action.chart;
 - import java.util.ArrayList;
 - import java.util.List;
 - import java.util.Map;
 - import javax.servlet.http.HttpServletResponse;
 - import org.apache.struts2.ServletActionContext;
 - import jofc2.model.Chart;
 - import jofc2.model.axis.Label;
 - import jofc2.model.axis.XAxis;
 - import jofc2.model.axis.YAxis;
 - import jofc2.model.elements.LineChart;
 - import xxx.app.action.BaseAction;
 - public class OfcChartAction extends BaseAction {
 - private Chart ofcChart;
 - public Chart getOfcChart() {
 - return ofcChart;
 - }
 - public String showChart() throws Exception{
 - //y轴数据集合-使用数量
 - List<Number> dataSet = new ArrayList<Number>();
 - //x轴数据集合-浏览器类型
 - List<Label> xLabel = new ArrayList<Label>();
 - //获取需要显示的数据集
 - List browserList = getServMgr().getVisitStatService().getBrowserStat();
 - for (int i = 0; i < browserList.size(); i++) {
 - Map map = (Map) browserList.get(i);
 - //填充x轴
 - dataSet.add((Integer) map.get("statCount"));
 - //填充y轴
 - xLabel.add(new Label((String) map.get("statVar")));
 - }
 - //设置X轴内容
 - XAxis labels = new XAxis();
 - labels.addLabels(xLabel);
 - //设置Y轴显示值域:Range的三个参数含义为:坐标最小值,最大值和步进值
 - YAxis range = new YAxis();
 - range.setRange(0, 200, 10);
 - //OFC折线图设置
 - LineChart lineChart = new LineChart(LineChart.Style.NORMAL);
 - lineChart.addValues(dataSet);
 - lineChart.setColour("#6666FF");
 - lineChart.setText("使用者数量");
 - //图表设置
 - Chart chart = new Chart("用户浏览器使用量分布");
 - chart.setXAxis(labels);
 - chart.setYAxis(range);
 - chart.addElements(lineChart);
 - //打印JSON格式的文本
 - System.out.print(chart.toString());
 - HttpServletResponse response = ServletActionContext.getResponse();
 - response.setContentType("application/json-rpc;charset=utf-8");
 - response.setHeader("Cache-Control", "no-cache");
 - response.setHeader("Expires", "0");
 - response.setHeader("Pragma", "No-cache");
 - response.getWriter().write(chart.toString());
 - return null;
 - }
 - }
 
Service中获取数据我们使用Spring的JdbcTemplate进行。
- //获取记录的浏览器信息
 - private static final String SQL_GET_BROWER_STAT = "select statVar,statCount from nd_stats where statType='browser'";
 - /**
 - * 获取记录的浏览器信息
 - */
 - public List getBrowserStat() {
 - return jt.queryForList(SQL_GET_BROWER_STAT);
 - }
 
写好Action,我们简单配置一下,因为我们只是得到JSON文本,所以不必配置跳转,只需配置请求即可。
- <action name="ofcChart" class="xxx.app.action.chart.OfcChartAction">
 - </action>
 
页面的JS代码也很简单。如下即可:
- <script type="text/javascript" src="${base}/js/swfobject.js"></script>
 - <script type="text/javascript">
 - var flashvars = {"data-file":"${base}/manage/stat/ofcChart!showChart.action"};
 - var params = {menu: "false",scale: "noScale",wmode:"opaque"};
 - swfobject.embedSWF("${base}/swf/open-flash-chart.swf", "chart", "600px", "400px", "9.0.0",
 - "expressInstall.swf",flashvars,params);
 - </script>
 - <div id="chart">
 - </div>
 
这里需要多说几句,首先是路径,不能错了,错了就请求不到数据了。Swfobject.js是页面使用JS方式配置Flash显示的,比较方便,所有使用它了。设置一个div用于Flash的显示,这个id是embedSWF的第二个参数,不能忘写了。还有就是请求地址参数的问题,这里我们是方便测试就没有传递参数,而实际开发不可避免传递参数。参数传递时在请求地址后面按普通形式书写即可,只是&这个连接符需要转义,写成%26,其他就没有什么了。 
    我们得到的结果就是这样的,这是很普通的折线图。但是不比JFreeChart的差哦。 
 
    同时在控制台我们得到jofc2为我们生成的JSON文本。
- {"is_thousand_separator_disabled":0,"is_decimal_separator_comma":0,"title":{"tex
 - t":"用户浏览器使用量分布"},"y_axis":{"min":0,"steps":10,"max":200},"x_axis":{"la
 - bels":{"labels":[{"text":"Safari"},{"text":"MSIE6X"},{"text":"MSIE7X"},{"text":"
 - MSIE8X"},{"text":"Firefox"},{"text":"Chrome"},{"text":"Opera"},{"text":"Maxthon"
 - },{"text":"Other"}]}},"num_decimals":2,"is_fixed_num_decimals_forced":0,"element
 - s":[{"font-size":10,"text":"使用者数量","type":"line","values":[6,2,63,168,1,10,
 - 1,0,0],"colour":"#6666FF"}]}
 
下面我们做柱状图,做个个性点的,用sketch类型。
- //Sketch型柱状图设置
 - SketchBarChart sketchChart = new SketchBarChart();
 - sketchChart.setColour("#6666FF");
 - sketchChart.addValues(dataSet);
 - sketchChart.setText("使用者数量");
 - //图表设置
 - Chart chart = new Chart("用户浏览器使用量分布");
 - chart.setXAxis(labels);
 - chart.setYAxis(range);
 - chart.addElements(sketchChart);
 
这样我们就得到了下面的显示效果,是不是很卡通,哈哈。 
 
    需要注意jofc2将sketch风格的柱状图单独写成了一个类,而使用普通风格的柱状图时不时这么进行的。
- //柱状图Bar的集合
 - List<Bar> barList=new ArrayList<Bar>();
 - for (int i = 0; i < browserList.size(); i++) {
 - Map map = (Map) browserList.get(i);
 - //填充Bar,并给出提示
 - barList.add(new Bar((Integer) map.get("statCount")).setTooltip("#val#次"));
 - //填充y轴
 - xLabel.add(new Label((String) map.get("statVar")));
 - }
 - //柱状图设置
 - BarChart barChart=new BarChart(BarChart.Style.GLASS);
 - barChart.addBars(barList);
 - barChart.setColour("#6666FF");
 - barChart.setText("使用者数量");
 - //图表设置
 - Chart chart = new Chart("用户浏览器使用量分布");
 - chart.setXAxis(labels);
 - chart.setYAxis(range);
 - chart.addElements(barChart);
 
我们得到如下的柱状图。 
 
   最后一种是饼状图,下面我们来画饼。
- //饼状图
 - PieChart pieChart = new PieChart();
 - for (int i = 0; i < browserList.size(); i++) {
 - Map map = (Map) browserList.get(i);
 - //填充x轴
 - dataSet.add((Integer) map.get("statCount"));
 - //饼状图添加块
 - pieChart.addSlice((Integer) map.get("statCount"), (String) map.get("statVar"));
 - }
 - //饼状图设置
 - pieChart.setColours("#d01f3c", "#356aa0", "#C79810");
 - pieChart.setText("使用者数量");
 - pieChart.setRadius(180); //饼图的半径
 - pieChart.setTooltip("#val# / #total#<br>#percent#");
 - //图表设置
 - Chart chart = new Chart("用户浏览器使用量分布");
 - chart.setXAxis(labels);
 - chart.setYAxis(range);
 - chart.addElements(pieChart);
 
生成的饼状图如下: 
 
    OFC接收一个JSON格式的文本用来填充Flash,Flash解析这段文本就生成了漂亮的图表。当然OFC的设置还有很多,可以做出非常炫的效果,这里就不深入研究了,当然就是set一些属性罢了。最后我们还是看一下JFreeChart的吧。 
 
    希望对使用者有用,欢迎交流探讨更深入内容。
使用Open Flash Chart(OFC)制作图表(Struts2处理)的更多相关文章
- Open Flash Chart 简介
		
http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-ofc/ Open Flash Chart(OFC)是一个开源的 Flash 图表绘 ...
 - Open Flash Chart图表的JSON格式基本属性详解
		
http://blog.csdn.net/wangwenhui11/article/details/4283571 数据文件必须是JSON格式.JSON对象的基本格式: {} 把所有对象都编写在{}里 ...
 - Open Flash Chart 之线图(二)
		
上一节在研究Open Flash Chart时,漏掉不少东西,只是简单的熟悉了一下后端的属性设置.今天再来补充一下. 一.显示Open Flash Chart图表 Open Flash Chart 前 ...
 - PHP-Open Flash Chart报表生成
		
下载: http://www.cnblogs.com/huangcong/archive/2013/01/27/2878650.html 安装: 解压ZIP包, 将open-flash-chart.s ...
 - Open Flash Chart在php中的使用教程
		
http://www.cnblogs.com/huangcong/archive/2013/01/27/2878650.html 为了画一个漂亮的表格,我从网上找到了OpenFlashChart(of ...
 - Flash网站Loading制作
		
Flash网站Loading制作~~~ stop(); stage.scaleMode=StageScaleMode.NO_SCALE; //指定舞台属性为不跟随播放器大小而改变 stage.show ...
 - Python Open Flash Chart (pyOFC2) — Home
		
Python Open Flash Chart (pyOFC2) - Home pyOFC2 Python Open Flash Chart 2
 - Excel中用REPT函数制作图表
		
本文从以下七个方面,阐述在Excel中用REPT函数制作图表: 一. 图形效果展示 二. REPT语法解释 三. REPT制作条形图 四. REPT制作漏斗图 五. REPT制作蝴蝶图 六. REPT ...
 - Chart.js 动态图表的使用
		
一.相关资料 1. 简介 Chart.js 是一个基于 HTML5 的简单的面向对象的图表库,支持包括 IE7/8 和所有现代浏览器.支持六种图标:曲线图(Linecharts).柱状图(Barcha ...
 
随机推荐
- HTML5新增的一些属性和功能之八——web Worker
			
Web Workers 为什么用web workers? 浏览器的原理中决定了页面打开只有一个主线程--UI渲染线程,如果线程中有耗时的程序(js)会阻塞线程,使得页面中其他的UI无法渲染,我们一般把 ...
 - ASP.NET 实现PDF文件下载
			
本文介绍了一种在ASP.NET中下载文件的方法. 方法一:可能是最简单的.最短的方式: Response.ContentType = "application/pdf"; Resp ...
 - Java反射举例
			
本文參考:http://www.cnblogs.com/yydcdut/p/3845430.html 1.Java反射的基本介绍 Java的反射很强大,传递class. 能够动态的生成该类.取得这个类 ...
 - Multithreading: How to Use the Synchronization Classes
			
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源) 翻译文章来源: msdn - Multithreading: How to Use t ...
 - JavaScript总结(二) 系统分析
			
学习Javascript的时候.遇到了一个问题. 看了牛腩的视频,感觉讲的太简单和基础,像认识一位新朋友.但仅有一面之缘就结束了. 再看姜浩的视频.又看得迷迷糊糊,让我找到了当初看两位台湾专家讲VB. ...
 - JavaScript 之  call apply  bind
			
关键字 this 绑定的方法 this的动态切换,固然为JavaScript创造了巨大的灵活性,但也使得编程变得困难和模糊.有时,需要把this固定下来,避免出现意想不到的情况.JavaScript提 ...
 - Linux基础知识(二)
			
1. 请回答,32位和64位有什么区别呢?什么时候安装32位的,又什么时候安装64位操作系统呢?如何查看系统是32位的还是64位的? 所谓的32位.64位指的是CPU的GPRs(General-Pur ...
 - Android与JS混编(js调用java)
			
项目中需要使用android与js的混编来开发app. 下面就介绍一下吧. 有时候我们需要用js调用native控件,要想实现这个功能,我们需要做的就只有三步: 1.允许webview执行js脚本 2 ...
 - java 静态文件使用注解
			
spring框架为我们代码的编写带来了极大的便利,特别是注解的使用.但是有个问题,当我们在静态文件中使用注解的时候,这个时候就会报错了.如以下代码: @Autowired private UserSe ...
 - Xcode快捷键 ----  提高效率
			
Mac中主要有四个修饰键,分别是Command,Control,Option和Shift. 1. ⌘ + L 搜索行数,输入行数,调到指定行数 2.⌘ + shift + O 查询flie ...