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

相关文章
|
8月前
|
人工智能 算法 Java
Java与AI驱动区块链:构建智能合约与去中心化AI应用
区块链技术和人工智能的融合正在开创去中心化智能应用的新纪元。本文深入探讨如何使用Java构建AI驱动的区块链应用,涵盖智能合约开发、去中心化AI模型训练与推理、数据隐私保护以及通证经济激励等核心主题。我们将完整展示从区块链基础集成、智能合约编写、AI模型上链到去中心化应用(DApp)开发的全流程,为构建下一代可信、透明的智能去中心化系统提供完整技术方案。
508 3
|
8月前
|
Java 数据安全/隐私保护 索引
(Java)Java里JFrame窗体的基本操作(组件篇-3)
回顾 说过了下拉框和下拉列表,本篇内容将了解滚动面板和各类输入框 什么是组件? 如果不熟悉组件,可以将组件看作是某个Form表单中的表单元素,组件可以完善JFrame窗口的布局,以及一些功能; 本篇内容中所有的组件所用到的类全都来自于javax.swing这个包中,记得引入; 另:在使用组件前,请先将窗体中的内容类给实例化出来进行操作,代码如下: Container c = getContentPane(); JScollPane JScollPane类,说的就是滚动面板。它不同于其他组件,它是一个容器,
173 2
|
8月前
|
Java 索引 容器
(Java)Java里JFrame窗体的基本操作(组件篇-2)
回顾 这算是JFrame窗体基本操作的组件第二篇了,上一篇说过了单选框,复选框,按钮。 在这一篇中,我会说明下拉框和列表框 什么是组件? 自行百度:java中JFrame窗体里的组件是什么? 名字都给你想好了 ( :I ) JComBox下拉框 JComBox类,就是下拉框,实例化出来后,要填写泛型&lt;&gt;,添加是什么数据类型的内容,泛型中就写上该数据类型; JComboBox&lt;?&gt; combox = new JComboBox&lt;&gt;(); 以下实例化下拉框的时候我泛型写的全
213 1
|
8月前
|
Java 容器
(Java)Java里JFrame窗体的基础操作(组件-1)
如果不熟悉组件,可以将组件看作是某个Form表单中的表单元素,当然这只是在不熟悉组件的前提下。如果深入了解了组件,那么它有着非常多的组件,这些组件可以完善JFrame窗口的布局,以及一些功能; 本篇内容中所有的组件所用到的类全都来自于javax.swing这个包中,记得引入
169 1
|
8月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
691 8
|
9月前
|
人工智能 Java API
Java与大模型集成实战:构建智能Java应用的新范式
随着大型语言模型(LLM)的API化,将其强大的自然语言处理能力集成到现有Java应用中已成为提升应用智能水平的关键路径。本文旨在为Java开发者提供一份实用的集成指南。我们将深入探讨如何使用Spring Boot 3框架,通过HTTP客户端与OpenAI GPT(或兼容API)进行高效、安全的交互。内容涵盖项目依赖配置、异步非阻塞的API调用、请求与响应的结构化处理、异常管理以及一些面向生产环境的最佳实践,并附带完整的代码示例,助您快速将AI能力融入Java生态。
1448 12
|
Java 开发工具 git
Java开发初级6.24.3
5.在Git使用过程中,进行Git配置的操作命令是哪个() A. config B. config -g C. config -a D. git config 相关知识点: 在git中,经常使用git config 命令用来配置git的配置文件,git配置级别主要有:仓库级别 local 【优先级最高】、用户级别 global【优先级次之】、系统级别 system【优先级最低】 正确答案:D 10.RDBMS是什么? A. Rela Database Management Systems B. Relational Database Management Systems C. Relation
290 0
|
SQL 前端开发 JavaScript
Java开发初级6.24.2
3.Java网站src/main/java目录保存的是什么资源? A. Java源代码文件 B. 测试代码 C. JavaScript、CSS等文件 D. 图片资源 正确答案:A 4.什么是索引Index? A. SQL数据库里的表管理工具 B. SQL数据库里的查询工具 C. SQL数据库里的目录工具 D. SQL数据库用来加速数据查询的特殊的数据结构 正确答案:D
349 0
|
Java
Java开发初级6.24.1
1.下面关于泛型的描述中错误的一项是? A. “? extends 类”表示设置泛型上限 B. “? super 类”表示设置泛型下限 C. 利用“?”通配符可以接收全部的泛型类型实例,但却不可修改泛型属性内容 D. 如果类在定义时使用了泛型,则在实例化类对象时需要设置相应的泛型类型,否则程序将无法编译通过 相关知识点: https://edu.aliyun.com/course/35 正确答案:D 2.下列选项中属于SVN中控制鉴权用户访问版本库的权限默认权限的是() A. write B. read C. none D. null 相关知识点: auth-access:取值范围为"writ
393 0
|
Java 开发工具 git
Java开发初级6.23.3
5.在Git使用过程中,进行Git配置的操作命令是哪个() A. config B. config -g C. config -a D. git config 相关知识点: 在git中,经常使用git config 命令用来配置git的配置文件,git配置级别主要有:仓库级别 local 【优先级最高】、用户级别 global【优先级次之】、系统级别 system【优先级最低】 正确答案:D 10.RDBMS是什么? A. Rela Database Management Systems B. Relational Database Management Systems C. Relation
233 0