Java开源项目中制作图表比较出色的就是JFreeChart了,相信大家都听说过,它不仅可以做出非常漂亮的柱状图,饼状图,折线图基本图形之外,还能制作甘特图,仪表盘等图表。在Web应用中可以为项目增色不少。JFreeChart技术成熟,完全是通过Java代码控制图表生成,掌握难度不大。但是它的一个缺点就是所有资源在服务器端生成,需要占用大量的服务器资源,而且图表以流的形式输送到客户端也占用了大量的网络资源。 
    对于服务器资源和网络资源吃紧的项目还不得不想办法,虽然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做配置。代码如下:

  1. package xxx.app.action.chart;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.Map;
  5. import javax.servlet.http.HttpServletResponse;
  6. import org.apache.struts2.ServletActionContext;
  7. import jofc2.model.Chart;
  8. import jofc2.model.axis.Label;
  9. import jofc2.model.axis.XAxis;
  10. import jofc2.model.axis.YAxis;
  11. import jofc2.model.elements.LineChart;
  12. import xxx.app.action.BaseAction;
  13. public class OfcChartAction extends BaseAction {
  14. private Chart ofcChart;
  15. public Chart getOfcChart() {
  16. return ofcChart;
  17. }
  18. public String showChart() throws Exception{
  19. //y轴数据集合-使用数量
  20. List<Number> dataSet = new ArrayList<Number>();
  21. //x轴数据集合-浏览器类型
  22. List<Label> xLabel = new ArrayList<Label>();
  23. //获取需要显示的数据集
  24. List browserList = getServMgr().getVisitStatService().getBrowserStat();
  25. for (int i = 0; i < browserList.size(); i++) {
  26. Map map = (Map) browserList.get(i);
  27. //填充x轴
  28. dataSet.add((Integer) map.get("statCount"));
  29. //填充y轴
  30. xLabel.add(new Label((String) map.get("statVar")));
  31. }
  32. //设置X轴内容
  33. XAxis labels = new XAxis();
  34. labels.addLabels(xLabel);
  35. //设置Y轴显示值域:Range的三个参数含义为:坐标最小值,最大值和步进值
  36. YAxis range = new YAxis();
  37. range.setRange(0, 200, 10);
  38. //OFC折线图设置
  39. LineChart lineChart = new LineChart(LineChart.Style.NORMAL);
  40. lineChart.addValues(dataSet);
  41. lineChart.setColour("#6666FF");
  42. lineChart.setText("使用者数量");
  43. //图表设置
  44. Chart chart = new Chart("用户浏览器使用量分布");
  45. chart.setXAxis(labels);
  46. chart.setYAxis(range);
  47. chart.addElements(lineChart);
  48. //打印JSON格式的文本
  49. System.out.print(chart.toString());
  50. HttpServletResponse response = ServletActionContext.getResponse();
  51. response.setContentType("application/json-rpc;charset=utf-8");
  52. response.setHeader("Cache-Control", "no-cache");
  53. response.setHeader("Expires", "0");
  54. response.setHeader("Pragma", "No-cache");
  55. response.getWriter().write(chart.toString());
  56. return null;
  57. }
  58. }

Service中获取数据我们使用Spring的JdbcTemplate进行。

  1. //获取记录的浏览器信息
  2. private static final String SQL_GET_BROWER_STAT = "select statVar,statCount from nd_stats where statType='browser'";
  3. /**
  4. * 获取记录的浏览器信息
  5. */
  6. public List getBrowserStat() {
  7. return jt.queryForList(SQL_GET_BROWER_STAT);
  8. }

写好Action,我们简单配置一下,因为我们只是得到JSON文本,所以不必配置跳转,只需配置请求即可。

  1. <action name="ofcChart" class="xxx.app.action.chart.OfcChartAction">
  2. </action>

页面的JS代码也很简单。如下即可:

  1. <script type="text/javascript" src="${base}/js/swfobject.js"></script>
  2. <script type="text/javascript">
  3. var flashvars = {"data-file":"${base}/manage/stat/ofcChart!showChart.action"};
  4. var params = {menu: "false",scale: "noScale",wmode:"opaque"};
  5. swfobject.embedSWF("${base}/swf/open-flash-chart.swf", "chart", "600px", "400px", "9.0.0",
  6. "expressInstall.swf",flashvars,params);
  7. </script>
  8. <div id="chart">
  9. </div>

这里需要多说几句,首先是路径,不能错了,错了就请求不到数据了。Swfobject.js是页面使用JS方式配置Flash显示的,比较方便,所有使用它了。设置一个div用于Flash的显示,这个id是embedSWF的第二个参数,不能忘写了。还有就是请求地址参数的问题,这里我们是方便测试就没有传递参数,而实际开发不可避免传递参数。参数传递时在请求地址后面按普通形式书写即可,只是&这个连接符需要转义,写成%26,其他就没有什么了。 
    我们得到的结果就是这样的,这是很普通的折线图。但是不比JFreeChart的差哦。 
 
    同时在控制台我们得到jofc2为我们生成的JSON文本。

  1. {"is_thousand_separator_disabled":0,"is_decimal_separator_comma":0,"title":{"tex
  2. t":"用户浏览器使用量分布"},"y_axis":{"min":0,"steps":10,"max":200},"x_axis":{"la
  3. bels":{"labels":[{"text":"Safari"},{"text":"MSIE6X"},{"text":"MSIE7X"},{"text":"
  4. MSIE8X"},{"text":"Firefox"},{"text":"Chrome"},{"text":"Opera"},{"text":"Maxthon"
  5. },{"text":"Other"}]}},"num_decimals":2,"is_fixed_num_decimals_forced":0,"element
  6. s":[{"font-size":10,"text":"使用者数量","type":"line","values":[6,2,63,168,1,10,
  7. 1,0,0],"colour":"#6666FF"}]}

下面我们做柱状图,做个个性点的,用sketch类型。

  1. //Sketch型柱状图设置
  2. SketchBarChart sketchChart = new SketchBarChart();
  3. sketchChart.setColour("#6666FF");
  4. sketchChart.addValues(dataSet);
  5. sketchChart.setText("使用者数量");
  6. //图表设置
  7. Chart chart = new Chart("用户浏览器使用量分布");
  8. chart.setXAxis(labels);
  9. chart.setYAxis(range);
  10. chart.addElements(sketchChart);

这样我们就得到了下面的显示效果,是不是很卡通,哈哈。 
 
    需要注意jofc2将sketch风格的柱状图单独写成了一个类,而使用普通风格的柱状图时不时这么进行的。

  1. //柱状图Bar的集合
  2. List<Bar> barList=new ArrayList<Bar>();
  3. for (int i = 0; i < browserList.size(); i++) {
  4. Map map = (Map) browserList.get(i);
  5. //填充Bar,并给出提示
  6. barList.add(new Bar((Integer) map.get("statCount")).setTooltip("#val#次"));
  7. //填充y轴
  8. xLabel.add(new Label((String) map.get("statVar")));
  9. }
  10. //柱状图设置
  11. BarChart barChart=new BarChart(BarChart.Style.GLASS);
  12. barChart.addBars(barList);
  13. barChart.setColour("#6666FF");
  14. barChart.setText("使用者数量");
  15. //图表设置
  16. Chart chart = new Chart("用户浏览器使用量分布");
  17. chart.setXAxis(labels);
  18. chart.setYAxis(range);
  19. chart.addElements(barChart);

我们得到如下的柱状图。 
 
   最后一种是饼状图,下面我们来画饼。

  1. //饼状图
  2. PieChart pieChart = new PieChart();
  3. for (int i = 0; i < browserList.size(); i++) {
  4. Map map = (Map) browserList.get(i);
  5. //填充x轴
  6. dataSet.add((Integer) map.get("statCount"));
  7. //饼状图添加块
  8. pieChart.addSlice((Integer) map.get("statCount"), (String) map.get("statVar"));
  9. }
  10. //饼状图设置
  11. pieChart.setColours("#d01f3c", "#356aa0", "#C79810");
  12. pieChart.setText("使用者数量");
  13. pieChart.setRadius(180); //饼图的半径
  14. pieChart.setTooltip("#val# / #total#<br>#percent#");
  15. //图表设置
  16. Chart chart = new Chart("用户浏览器使用量分布");
  17. chart.setXAxis(labels);
  18. chart.setYAxis(range);
  19. chart.addElements(pieChart);

生成的饼状图如下: 
 
    OFC接收一个JSON格式的文本用来填充Flash,Flash解析这段文本就生成了漂亮的图表。当然OFC的设置还有很多,可以做出非常炫的效果,这里就不深入研究了,当然就是set一些属性罢了。最后我们还是看一下JFreeChart的吧。 
 
    希望对使用者有用,欢迎交流探讨更深入内容。

使用Open Flash Chart(OFC)制作图表(Struts2处理)的更多相关文章

  1. Open Flash Chart 简介

    http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-ofc/ Open Flash Chart(OFC)是一个开源的 Flash 图表绘 ...

  2. Open Flash Chart图表的JSON格式基本属性详解

    http://blog.csdn.net/wangwenhui11/article/details/4283571 数据文件必须是JSON格式.JSON对象的基本格式: {} 把所有对象都编写在{}里 ...

  3. Open Flash Chart 之线图(二)

    上一节在研究Open Flash Chart时,漏掉不少东西,只是简单的熟悉了一下后端的属性设置.今天再来补充一下. 一.显示Open Flash Chart图表 Open Flash Chart 前 ...

  4. PHP-Open Flash Chart报表生成

    下载: http://www.cnblogs.com/huangcong/archive/2013/01/27/2878650.html 安装: 解压ZIP包, 将open-flash-chart.s ...

  5. Open Flash Chart在php中的使用教程

    http://www.cnblogs.com/huangcong/archive/2013/01/27/2878650.html 为了画一个漂亮的表格,我从网上找到了OpenFlashChart(of ...

  6. Flash网站Loading制作

    Flash网站Loading制作~~~ stop(); stage.scaleMode=StageScaleMode.NO_SCALE; //指定舞台属性为不跟随播放器大小而改变 stage.show ...

  7. Python Open Flash Chart (pyOFC2) — Home

    Python Open Flash Chart (pyOFC2) - Home pyOFC2 Python Open Flash Chart 2

  8. Excel中用REPT函数制作图表

    本文从以下七个方面,阐述在Excel中用REPT函数制作图表: 一. 图形效果展示 二. REPT语法解释 三. REPT制作条形图 四. REPT制作漏斗图 五. REPT制作蝴蝶图 六. REPT ...

  9. Chart.js 动态图表的使用

    一.相关资料 1. 简介 Chart.js 是一个基于 HTML5 的简单的面向对象的图表库,支持包括 IE7/8 和所有现代浏览器.支持六种图标:曲线图(Linecharts).柱状图(Barcha ...

随机推荐

  1. android中使用哪种方式解析XML比較好

    SAX是一个用于处理XML事件驱动的"推"模型. 长处是一种解析速度快而且占用内存少的xml解析器,它须要哪些数据再载入和解析哪些内容. 缺点是它不会记录标签的关系.而要让你的应用 ...

  2. Spring redirect直接返回项目根文件夹

    return "redirect:/";

  3. 找工作笔试面试那些事儿(10)---SQL语句总结

    SQL语句中常用关键词及其解释如下: 1)SELECT 将资料从数据库中的表格内选出,两个关键字:从 (FROM) 数据库中的表格内选出 (SELECT).语法为 SELECT "栏位名&q ...

  4. Android高级图片滚动控件,编写3D版的图片轮播器

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17482089 大家好,好久不见了,最近由于工作特别繁忙,已经有一个多月的时间没写博 ...

  5. 使用hbase的api创建表时出现的异常

    /usr/lib/jvm/java-7-openjdk-amd64/bin/java -Didea.launcher.port=7538 -Didea.launcher.bin.path=/usr/l ...

  6. C/C++中的虚析构函数和私有析构函数的使用

    代码: #include <iostream> using namespace std; class A{ public: A(){ cout<<"construct ...

  7. 512M内存机器如何用好Mysql

    购买阿里云512M内存ECS后,mysql有时候会自动关闭,停止运行 解决办法: a,优化mysql配置,因为自己安装的是mysql 5.6,而从5.6开始,mysql安装包中不再包含my-small ...

  8. linux 下配置mysql区分大小写(不区分可能出现找不到表的情况)怎么样使用yum来安装mysql

    Linux 默认情况下,数据库是区分大小写的:因此,要将mysql设置成不区分大小写 在my.cof 设置 lower_case_table_names=1(1忽略大小写,0区分大小写) 检查方式:在 ...

  9. 修改mysql错误提示语言的方法

    百度真的太恶心太无能了. 装了个mysql5,结果发现错误提示语言是法语. 然后我就想改成把错误提示语改成英语. 然后我使用各种关键字和方法百度了一个上午,居然全TM是告诉我怎么处理mysql中文乱码 ...

  10. 手机QQ v4.2 有感

    因为经常宅宿舍,很少出门,所以无论微信还是手机QQ都很少使用. 刚好最近见别人发来的表情我的2012自改版QQ总是无法解析,只能显示[吼叫].[啦啦]之类的字符,于是更新了v4.2的手机QQ把玩一番, ...