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,如需转载请自行联系原作者

相关文章
|
6月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
6月前
|
人工智能 算法 Java
Java与AI驱动区块链:构建智能合约与去中心化AI应用
区块链技术和人工智能的融合正在开创去中心化智能应用的新纪元。本文深入探讨如何使用Java构建AI驱动的区块链应用,涵盖智能合约开发、去中心化AI模型训练与推理、数据隐私保护以及通证经济激励等核心主题。我们将完整展示从区块链基础集成、智能合约编写、AI模型上链到去中心化应用(DApp)开发的全流程,为构建下一代可信、透明的智能去中心化系统提供完整技术方案。
422 3
|
6月前
|
Java 数据安全/隐私保护 索引
(Java)Java里JFrame窗体的基本操作(组件篇-3)
回顾 说过了下拉框和下拉列表,本篇内容将了解滚动面板和各类输入框 什么是组件? 如果不熟悉组件,可以将组件看作是某个Form表单中的表单元素,组件可以完善JFrame窗口的布局,以及一些功能; 本篇内容中所有的组件所用到的类全都来自于javax.swing这个包中,记得引入; 另:在使用组件前,请先将窗体中的内容类给实例化出来进行操作,代码如下: Container c = getContentPane(); JScollPane JScollPane类,说的就是滚动面板。它不同于其他组件,它是一个容器,
133 2
|
6月前
|
Java 索引 容器
(Java)Java里JFrame窗体的基本操作(组件篇-2)
回顾 这算是JFrame窗体基本操作的组件第二篇了,上一篇说过了单选框,复选框,按钮。 在这一篇中,我会说明下拉框和列表框 什么是组件? 自行百度:java中JFrame窗体里的组件是什么? 名字都给你想好了 ( :I ) JComBox下拉框 JComBox类,就是下拉框,实例化出来后,要填写泛型&lt;&gt;,添加是什么数据类型的内容,泛型中就写上该数据类型; JComboBox&lt;?&gt; combox = new JComboBox&lt;&gt;(); 以下实例化下拉框的时候我泛型写的全
170 0
|
6月前
|
Java 容器
(Java)Java里JFrame窗体的基础操作(组件-1)
如果不熟悉组件,可以将组件看作是某个Form表单中的表单元素,当然这只是在不熟悉组件的前提下。如果深入了解了组件,那么它有着非常多的组件,这些组件可以完善JFrame窗口的布局,以及一些功能; 本篇内容中所有的组件所用到的类全都来自于javax.swing这个包中,记得引入
125 0
|
6月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
433 8
|
7月前
|
人工智能 Java API
Java与大模型集成实战:构建智能Java应用的新范式
随着大型语言模型(LLM)的API化,将其强大的自然语言处理能力集成到现有Java应用中已成为提升应用智能水平的关键路径。本文旨在为Java开发者提供一份实用的集成指南。我们将深入探讨如何使用Spring Boot 3框架,通过HTTP客户端与OpenAI GPT(或兼容API)进行高效、安全的交互。内容涵盖项目依赖配置、异步非阻塞的API调用、请求与响应的结构化处理、异常管理以及一些面向生产环境的最佳实践,并附带完整的代码示例,助您快速将AI能力融入Java生态。
1130 12
|
7月前
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
7月前
|
存储 Java 关系型数据库
Java 项目实战基于面向对象思想的汽车租赁系统开发实例 汽车租赁系统 Java 面向对象项目实战
本文介绍基于Java面向对象编程的汽车租赁系统技术方案与应用实例,涵盖系统功能需求分析、类设计、数据库设计及具体代码实现,帮助开发者掌握Java在实际项目中的应用。
274 0
|
6月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
295 1