JFreeChart开源图表组件在Java开发中的应用(二)

简介:

 JFreeChart相关的初次探索就写两篇文章吧,两篇放一起太长,阅读起来不方便。JFreeChart提供了源代码,学习和研究起来容易多了。

      关于JFreeChart提供的示例图型如何实现,确实没有可参考的资料,不过Java的反编译工具可以帮助我们查看到具体实现,从而更容易的学习和DIY自己的图表。可以使用工具Java Decompiler或者jad(http://www.cnblogs.com/dkblog/archive/2008/04/07/1980817.html)来帮助我们查看源代码。


     下面是JFreeChart在Web开发中的应用:

     1.JFreeChart生成图表图片返回路径给前端

     2.JFreeChart以流的方式返回给前端

     3.JFreeChart在Struts中以chart这种类型返回给前端

     JFreeChart结合Struts2生成图表在前端展现流程如下:

     1.搭建Web工程,引入Struts2的基本Jar包,JFreeChart的Jar包

     2.配置Struts2与JFreeChart的插件struts2-jfreechart-plugin-2.3.14.2.jar 该插件下载地址:

http://www.java2s.com/Code/Jar/s/Downloadstruts2jfreechartplugin216jar.htm

      Struts2配置文件如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<? xml  version = "1.0"  encoding = "UTF-8"  ?>
<!DOCTYPE struts PUBLIC
     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
     "http://struts.apache.org/dtds/struts-2.0.dtd">
< struts >
     < package  name = "jfreechart"  extends = "jfreechart-default" >
         < action  name = "*"  class = "com.jfreechart.action.ChartAction"
             method = "{1}" >
             < result  name = "success"  type = "chart" >
                 < param  name = "width" >450</ param >
                 < param  name = "height" >450</ param >
             </ result >
         </ action >
         < action  name = "chart"  class = "com.jfreechart.action.AjaxAction"  method = "getChart" >
         </ action >
     </ package >
</ struts >

       这里的extends是jfreechart-default,是因为jfreechart-default这个包继承了struts-default.我们可以打开struts2-jfreechart-plugin-2.3.14.2.jar 查看struts-plugin.xml内容如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE struts PUBLIC
     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
     "http://struts.apache.org/dtds/struts-2.3.dtd">
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
< struts >
     < package  name = "jfreechart-default"  extends = "struts-default" >
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
         < result-types >
             < result-type  name = "chart"  class = "org.apache.struts2.dispatcher.ChartResult" >
                 < param  name = "height" >150</ param >
                 < param  name = "width" >200</ param >
             </ result-type >
         </ result-types >
     </ package >
</ struts >

  3.生成图表展现在前端页面

      3.1.以Struts2插件的Chart类型展现图表,创建Action,并且有一个属性成员JFreeChart对象


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public  class  ChartAction  extends  ActionSupport {
     /**
      *
      */
     private  static  final  long serialVersionUID = 2941035842042089833L;
     private  JFreeChart chart;
     public  String  getLineChart() {
         this .setChart( new  JFreeChartService().getLineChart());
         return  SUCCESS;
     }
     public  String  getPieChart() {
         this .setChart( new  JFreeChartService().getPieChart());
         return  SUCCESS;
     }
     public  String  getTwoLineChart() {
         this .setChart( new  JFreeChartService().getTwoLineChart());
         return  SUCCESS;
     }
     public  JFreeChart getChart() {
         return  chart;
     }
     public  void  setChart(JFreeChart chart) {
         this .chart = chart;
     }
}

      在页面中的img便签的src中直接设置为生成Chart的Action即可。

      Action配置参见struts配置文件中的第一个Action.


1
2
3
4
5
6
7
8
9
< div >
         < img  alt = "pie"  src = "getPieChart.action"  />
     </ div >
     < div >
         < img  alt = "twoline"  src = "getTwoLineChart.action"  />
     </ div >
     < div >
         < img  alt = "line"  src = "getLineChart.action"  />
     </ div >

     3.2 前端请求后台,后台JFreeChart生成本地图片,响应前端请求,返回图片访问路径达到图表展现的效果。


1
2
3
4
5
6
7
8
9
10
11
12
13
< div  id = "imgDiv"          No Image On Click Show
     </div>
     < script  type = "text/javascript" >
         function get() {
             alert("get");
             $.get("chart.action", {
                 type : "line"
             }, function(data) {
                 alert(data);
                 $("#imgDiv").html("< img  alt = 'No Image Show'  src = '"+' ${basePath}/jfreechart'+data+"'/>");
             }, "text");
         }
     </ script >

       从上述代码中可以看到页面加载完成后DIV中没有图表,点击事件发出,通过Ajax求,有后台生成好图表图篇返回给前端一个访问地址。


    3.3  当上述两种方式在浏览器页面上将图边完全展现的时候,我们查看HTML源代码,前img标签保持原样,后者者和普通的img便签src引用一张服务器端的图片一样。

    3.4 下面是两张关于这两种方式下的前端请求后台响应图表的网络状态。

     图3.4.1wKioL1MUswzRBh1LAAGaAOwFgF4265.jpg

  如图3.4.1:JFreeChart以Struts插件的方式通过chart类型以流的方式展现在页面,其数据接收占用了整个请求响应周期的最大时间。

    图3.4.2

wKiom1MUtBfwzvUPAADcPfvGrZw076.jpg



  图3.4.2:JFreeChart根据请求条件在服务器端生成图片,返回给前端图片的路径。这种方式有个好处是对于同一种请求只生成一次图片,这样就减少了响应时间。

  
  图3.4.1和图3.4.2对比:

  •   由于本地环境,网络条件局等

  •   图3.4.1响应时间和数据接收时间都比图3.4.2对应的时间长

  结论:

      图3.4.1这种图表渲染方式

      优点:不用在产生服务器端文件,服务器端不需要做额外的存储处理

      缺点:响应时间长,效率底,并发用户量大的时候,服务器压力大

      替代方案:用前端图表组件替代,服务器端只提供数据,渲染工作交由前端。

      图3.4.2这中图表渲染方式

      优点:相同请求生成一次图表,相应速度快,可以很好的支持多并发

      缺点:服务器端要做文件存储管理,占用服务器磁盘空间

  

 总结:

      关于JFreeChart在Web应用其实已经空乏其力了,大量的优秀的Web前端组件足以实现JFreeChart提供的图表类型。随着Web前端Javascript的力量十足,HTML5,CSS3 标准的完善,前端图像,图表的展现服务器端要做是提供约定格式的数据。但是JFreeChart在Web应用中还是有一席生存之地,前端渲染往往是动态展现,如果仅仅提供一个静态的图表用来展现,JFreeChart依然能够提供很多解决方案。



本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/1367236,如需转载请自行联系原作者

目录
打赏
0
0
0
0
265
分享
相关文章
智慧产科一体化管理平台源码,基于Java,Vue,ElementUI技术开发,二开快捷
智慧产科一体化管理平台覆盖从备孕到产后42天的全流程管理,构建科室协同、医患沟通及智能设备互联平台。通过移动端扫码建卡、自助报道、智能采集数据等手段优化就诊流程,提升孕妇就诊体验,并实现高危孕产妇五色管理和孕妇学校三位一体化管理,全面提升妇幼健康宣教质量。
33 12
菜鸟之路day02-04拼图小游戏开发一一JAVA基础综合项目
本项目基于黑马程序员教程,涵盖面向对象进阶、继承、多态等知识,历时约24小时完成。项目去除了登录和注册模块,专注于单机游戏体验。使用Git进行版本管理,代码托管于Gitee。项目包含窗体搭建、事件监听、图片加载与打乱、交互逻辑实现、菜单功能及美化界面等内容。通过此项目,巩固了Java基础并提升了实际开发能力。 仓库地址:[https://gitee.com/zhang-tenglan/puzzlegame.git](https://gitee.com/zhang-tenglan/puzzlegame.git)
44 6
Java中的this关键字详解:深入理解与应用
本文深入解析了Java中`this`关键字的多种用法
133 9
【潜意识Java】javaee中的SpringBoot在Java 开发中的应用与详细分析
本文介绍了 Spring Boot 的核心概念和使用场景,并通过一个实战项目演示了如何构建一个简单的 RESTful API。
42 5
【潜意识Java】了解并详细分析Java与AIGC的结合应用和使用方式
本文介绍了如何将Java与AIGC(人工智能生成内容)技术结合,实现智能文本生成。
70 5
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
56 14
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
39 13
【JAVA】封装多线程原理
Java 中的多线程封装旨在简化使用、提高安全性和增强可维护性。通过抽象和隐藏底层细节,提供简洁接口。常见封装方式包括基于 Runnable 和 Callable 接口的任务封装,以及线程池的封装。Runnable 适用于无返回值任务,Callable 支持有返回值任务。线程池(如 ExecutorService)则用于管理和复用线程,减少性能开销。示例代码展示了如何实现这些封装,使多线程编程更加高效和安全。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等