设为首页 收藏本站
查看: 1704|回复: 0

[经验分享] (IBM)Struts 2 中 JFreeChart 插件的使用分析和功能改进

[复制链接]

尚未签到

发表于 2017-5-27 10:03:29 | 显示全部楼层 |阅读模式
  Struts 2 中 JFreeChart 插件的使用分析和功能改进
  JFreeChart 可用于生成各式各样的统计图表,只要开发人员提供符合 JFreeChart 所需格式的数据,JFreeChart 即可自动生成相应的统计图表,这些统计图表既可以直接输出成图片文件,也可被导出成 PDF 文档。
  JFreeChart 的安装和使用
  为了使用 JFreeChart 来生成统计图表,必须下载和安装 JFreeChart 项目。下载和安装 JfreeChart 的步骤比较简单:登录 http://www.jfree.org/jfreechart/download.html 即可下载 JFreeChart 的最新版,然后将 JFreeChart 所需的核心 JAR 包、第三方 JAR(位于 lib 路径下)复制到应用的 CLASSPATH 路径下即可;如果是 Web 应用则需要使用 JFreeChart 图表,将这些 JAR 文件复制到
Web 应用的 WEB-INF/lib 路径下。如果编译和运行中需要使用 JFreeChart 项目,则还应将 lib 路径下的 jfreechart-1.0.13.jar 文件添加到系统的 CLASSPATH 环境变量里;如果使用 Ant,或其他 IDE 工具,则无需添加环境变量。
  JFreeChart 是一个非常优秀的图表工具,而且简单、易用,我们只需提供满足 JFreeChart 要求的数据,即可使用 ChartFactory 创建一个 JFreeChart 图表,该图表既可以输出成图片文件,也可以导出成各种格式的文档。
  现在将以生成一张饼图为例,示范如何使用 JFreeChart 生成统计图。下面是生成饼状图的 Java 代码:

清单 1. PieChartDemo.java
public class PieChartDemo
{
public static void main(String[] args) throws IOException
{
// 生成普通饼图
JFreeChart chart = ChartFactory.createPieChart(
"图书销量统计图",  // 图表标题
getDataSet(), // 数据
true, // 是否显示图例
false, // 是否显示工具提示
false // 是否生成 URL
);
// 重新设置图表标题,改变字体
chart.setTitle(new TextTitle("图书销量统计图"
, new Font("黑体", Font.ITALIC , 22)));
// 取得统计图表的第一个图例
LegendTitle legend = chart.getLegend(0);
// 修改图例的字体
legend.setItemFont(new Font("宋体", Font.BOLD, 14));
// 获得饼图的 Plot 对象
PiePlot plot = (PiePlot)chart.getPlot();
// 设置饼图各部分的标签字体
plot.setLabelFont(new Font("隶书", Font.BOLD, 18));
// 设定背景透明度(0-1.0 之间)
plot.setBackgroundAlpha(0.9f);
FileOutputStream fos = new FileOutputStream("book.jpg");
ChartUtilities.writeChartAsJPEG(
fos, // 输出到哪个输出流
1, //JPEG 图片的质量,0~1 之间
chart, // 统计图表对象
800, // 宽
600,// 宽
null //ChartRenderingInfo 信息
);
fos.close();
}
private static DefaultPieDataset getDataSet()
{
// 提供生成饼图的数据
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("疯狂 Java 讲义",47000);
dataset.setValue("轻量级 Java EE 企业实战",38000);
dataset.setValue("疯狂 Ajax 讲义",31000);
dataset.setValue("Struts 2 权威指南",29000);
dataset.setValue("疯狂 XML 讲义",25000);
return dataset;
}
}

  上面代码先提供一个方法,该方法返回 Dataset 对象,这个 Dataset 就是创建统计图表的底层数据,然后调用 ChartFactory 的 createPieChart 方法来生成一个 JFreeChart 对象,这个对象就是统计图表,该图表可以直接输出到图片文件中,也可导出成各种格式的文件。
  上面示例是导出了一个 JPG 格式的图片文件,编译、运行上面程序,将生成一个 book.jpg 文件,使用 ACDSee 浏览该图片,将看到如图 1 所示的饼图。
  
图 1. 使用 JFreeChart 生成的饼图
DSC0000.gif
  

  从图 1 中可以看出,JFreeChart 统计图可以分成 3 个部分:


  • 图表标题部分。
  • 实际统计图部分。
  • 图表图例部分。
  结合上面代码部分可以看出,修改统计图表的标题部分(包括修改图表标题内容、字体大小等)都是通过 JFreeChart 对象的 setTitle 方法实现的,修改统计图表的图例则通过 LegendTitle 对象来完成。一个统计图可以包含多个图例,当调用 JFreeChart 对象的 getLegend(int index)方法时,就可以取得该图表的指定索引的图例对象,一旦取得了指定图例,就可以修改图例的文本内容、字体大小等。
  在上面程序中,我们调用了 ChartFactory 的 createPieChart 方法,该方法用于创建一个平面的饼图;如果将该方法修改为 createPieChart3D,则用于创建一个 3D 饼图,创建 3D 饼图时,我们将前景色修改为 0.5 的透明度,将看到生成如图 2 所示的 3D 饼图
  图 2. 使用 JFreeChart 生成的 3D 饼图
DSC0001.gif
  JFreeChart 开发步骤
  通过上面的开发过程,我们不难发现通过 JFreeChart 开发统计图表是非常简单的,按如下步骤即可非常方便地开发出各种统计图表。
  (1)提供一个 Dateset 实例,该实例里包含了创建统计图表的数据。
  JFreeChart 使用 DataSet 来封装统计数据,程序首先应将需要显示的统计数据转换为 DataSet。不同的统计图表所使用的 Dataset 实例不一样,例如,饼图使用 PieDataset 实例作为饼图数据;而柱状图则采用 CategoryDataset 作为柱状图数据。
  (2)使用 ChartFactory 的多个工厂方法 createXxxChart 来创建统计图表,统计图表就是一个 JFreeChart 对象。
  (3)得到了 JFreeChart 对象后,可以调用 setTitle 来修改统计图表的标题;或者调用 getLegend 方法来获得指定索引的图表图例,取得图例对象后即可修改图表的图例。
  (4)通过 JFreeChart 对象的 getPlot 方法,即可获得图表的 Plot 对象,该对象对应于统计图表的实际图表部分,可以调用 Plot 对象的方法来修改图表中的各种显示内容。
  按上面的 4 个步骤进行,即可快速开发出各种简单的 JFreeChart 图表。
  在上面步骤中,共涉及到 JFreeChart 的如下核心 API:


  • XxxDataset:这是一个数据集对象,封装系统中需要显示的统计数据,用于提供显示图表所用的数据。对于不同类型的统计图表,也需要使用不同的 Dataset 对象。
  • ChartFactory:该对象是一个图表工厂类,通过调用该工厂类的不同方法,即可生成不同的统计图表。
  • JFreeChart:代表内存中的统计图表对象,JFreeChart 由如下 3 个部分组成:TextTitle(标题)、LegendTitle(图例标题)和 XxxPlot(实际统计图)。这个统计图表既可输出成图片文件,也可转换成内存中图片,直接在 Java 程序中显示出来。
  • ChartUtilities:该类包含了系列输出统计图表的工具方法,包括输出各种格式的(如 JPG 和 PNG 等)的图表,包括直接输出到文件和普通输出流等。除此之外,该类还包含了创建 HTML 热点的方法(具体参看后面内容)。
  • XxxPlot:实际统计图表对象,这个对象决定了实际图表的显示样式,创建该对象时需要 Axis、Renderer 及数据集对象的支持。
  实际统计图表是根据 XxxPlot 对象生成的,为了生成 XxxPlot 对象,还需要额外的 Axis、Renderer 的支持;除此之外,如果希望在网页上生成带交互功能的热点图,还需要用到 XxxURLGenerator 和 XxxToolTipGenerator 等 API。即 JFreeChart 还包含如下常用的核心 API:


  • XxxAxis:用于处理图表的两个轴:纵轴和横轴。
  • XxxRenderer:负责如何显示一个图表对象。
  • XxxURLGenerator:用于生成 Web 图表中每个项目的超级链接。
  • XxxToolTipGenerator:用于生成图表的帮助提示,不同类型图表对应不同类型的工具提示类。
  为 Struts 2 应用安装 JFreeChart 插件
  为了在 Struts 2 中使用 JFreeChart 统计图表,Struts 2 提供了 JFreeChart 插件支持。借助于 JFreeChart 插件的支持,Struts 2 可以非常方便地使用 JFreeChart 统计图表。
  借助于 JFreeChart 插件的支持,Struts 2 允许我们只需在 Action 中返回一个 JFreeChart 实例,而无需处理导出 JFreeChart 实例,在页面显示统计图表等细节。只要我们为 Action 指定一个类型为 chart 的 Result,该 Result 将自动生成一个 JFreeChart 图表来显示 Action 的处理结果。
  与 Struts 2 的其他插件类似,安装 JFreeChart 插件非常容易,只需将 Struts 2 的 JFreeChart 插件复制到 Web 应用的 WEB-INF/lib 路径下即可。
  查看 struts2-jfreechart-plugin-2.1.6.jar 文件中的 struts-plugin.xml 文件时,发现该配置文件中代码如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!-- 指定 Struts 2 配置文件的 DTD 信息 -->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- 让 jfreechart-default 包是由 struts-default 包扩展而来 -->
<package name="jfreechart-default" extends="struts-default">
<!-- 包里面的定义没有任何改变 -->
...
</package>
</struts>
  此处的 jfreechart-default 包已经继承了 struts-default,因此让我们配置 Action 所在包继承 jfreechart-default 即可。
  除了要将上面的 struts2-jfreechart-plugin-2.1.6.jar 文件复制到 Web 应用的 WEB-INF/lib 路径下之外,当然还需要将 JFreeChart 的二进制类库文件复制到 Web 应用的 WEB-INF/lib 路径下。经过上面步骤,即完成了 Struts 2 和 JFreeChart 的整合。
  在 Struts 2 应用中使用 JFreeChart

Struts 2.1 的改进

JFreeChart 插件要求用户的 Action 中 JFreeChart 类型的属性名只能是 chart(必须提供 getChart() 方法,且该方法返回 JFreeChart 对象),这种硬编码方式提供的统计图表大大降低了 Action 的灵活性。Struts 2.1 改进了这个地方,开发者允许使用任何方法返回一个 JFreeChart 对象。假如开发者提供了 getAbc() 方法返回一个 JFreeChart 对象,那需要开发者配置 Action 时配置一个名为 value 的参数。也就是增加如下配置:


  将 JFreeChart 与 Struts 2 整合后,可以对 JFreeChart 统计图表的开发有一定的简化作用。下面就以一个简单的饼状图为例,介绍如何在 Struts 2 中使用 JFreeChart 统计图表。
  创建 Action 类
  如果仅仅使用 Struts 2 官方提供的 JFreeChart 插件,那么 Struts 2 的 JFreeChart 插件对开发 JFreeChart 并没有提供太多的简便,我们依然需要手动创建 JFreeChart 实例。如果需要的 Action 中的统计图表能被 Struts 2 处理,则要求该 JFreeChart 类型的属性名为 chart ——也就是要求该 Action 内必须有一个 getChart() 方法,该方法返回一个 JFreeChart 对象。
  下面是该 Action 的实现类代码:

清单 2. ChartAction.java
public class ChartAction extends ActionSupport
{
private JFreeChart chart;
// 必须提供 getChart() 方法,且由该方法返回 JFreeChart 对象
public JFreeChart getChart()
{
chart = ChartFactory.createPieChart3D(
"图书销量统计图",  // 图表标题
getDataSet(), // 数据
true, // 是否显示图例
false, // 是否显示工具提示
false // 是否生成 URL
);
// 重新设置图表标题,改变字体
chart.setTitle(new TextTitle("图书销量统计图"
, new Font("黑体", Font.ITALIC , 22)));
// 取得统计图表的第一个图例
LegendTitle legend = chart.getLegend(0);
// 修改图例的字体
legend.setItemFont(new Font("宋体", Font.BOLD, 14));
// 获得饼图的 Plot 对象
PiePlot plot = (PiePlot)chart.getPlot();
// 设置饼图各部分的标签字体
plot.setLabelFont(new Font("隶书", Font.BOLD, 18));
// 设定背景透明度(0-1.0 之间)
plot.setBackgroundAlpha(0.9f);
// 设定前景透明度(0-1.0 之间)
plot.setForegroundAlpha(0.50f);
return chart;
}
// 获取生成统计图的 Dataset
private DefaultPieDataset getDataSet()
{
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("疯狂 Java 讲义",47000);
dataset.setValue("轻量级 Java EE 企业实战",38000);
dataset.setValue("疯狂 Ajax 讲义",31000);
dataset.setValue("Struts 2 权威指南",29000);
dataset.setValue("疯狂 XML 讲义",25000);
return dataset;
}
}

  

  上面 Action 类继承了 ActionSupport 类,因此无需提供 execute 方法——这是因为 ActionSupport 类已经提供了一个 execute() 方法,该方法返回一个 success 字符串作为逻辑视图,该 Action 直接使用 ActionSupport 的 execute 方法作为系统的处理逻辑。
  从上面代码中不难发现,上面的 Action 有如下两个非常不灵活的地方:


  • 需要手动创建 JFreeChart 实例,与创建普通 JFreeChart 图表没有太大的区别。
  • Action 的统计图表属性名必须是 chart(必须提供 getChart() 方法,且该方法返回 JFreeChart 对象),这种硬编码方式提供的属性大大降低了 Action 的灵活性。
  配置 Action
  配置 JFreeChart 的 Action 非常简单,只需要为该 Action 指定一个类型为 chart 的 Result,该 Result 将使用 JFreeChart 统计图表来作为视图组件。配置类型为 chart 的 Result 时,可以指定两个参数:width 和 height,这两个参数分别指定统计图的宽和高。
  因为前面已经定义了名为 jfreechart-default 的包,该包扩展了 Struts 2 系统的 struts-default 包,在 struts-default 包里增加了一个名为 chart 的 Result 类型。因此我们应该让 Struts 2 应用中自定义包继承 jfreechart-default 包即可。
  下面是本示例应用的 struts-config.xml 文件:
  


清单 3. struts-config.xml
<?xml version="1.0" encoding="GBK"?>
<!-- 指定 Struts 2 配置文件的 DTD 信息 -->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<!-- 配置 Struts 2 应用中的常量 -->
<constant name="struts.custom.i18n.resources"
value="messageResource"/>
<constant name="struts.i18n.encoding" value="GBK"/>
<!-- 配置本应用中的包,继承 jfreechart-default 包 -->
<package name="lee" extends="jfreechart-default">
<!-- 定义一个名为 bookChart 的 Action -->
<action name="bookChart" class="lee.ChartAction">
<result type="chart">
<!-- 定义 JFreeChart 报表的大小 -->
<param name="width">800</param>
<param name="height">600</param>
</result>
</action>
</package>
</struts>

  

  上面配置文件配置了一个名为 bookChart 的 Action,该 Action 将产生一个类型为 chart 的 Result。在浏览器中直接向 bookChart.action 发送请求,将看到如图 3 所示的统计图。
  
图 3. 整合 Struts 2 和 JFreeChart 生成统计图
DSC0002.gif


  从上面的程序中不难看出,Struts 2 的 JFreeChart 插件所完成的事情就是负责将 Action 里的 JFreeChart 实例提取出来,并输出到 HttpServletResponse 中。
  分析 Struts 2 官方提供的 JFreeChart 插件不难发现,它的主要作用就是在页面中显示 Action 中的 JFreeChart 对象。因此 JFreeChart 插件所完成的工作非常有限,即使我们在 Struts 2 中整合了 JFreeChart 框架,我们依然需要自己手动创建 JFreeChart 实例,这是非常烦琐的事情。最理想的状况是我们只提供需要显示的数据,而 Struts 2 对 JFreeChart 进行封装,自动生成 JFreeChart 图表,并将其显示在 HTML 页面上。
  下面我们将来介绍改进后的 JFreeChart 插件
  改进 JFreeChart 插件
  前面提到 Struts 2 的 JFreeChart 插件存在一些不够方便的地方,主要是 Struts 2 的 Action 还必须手动创建 JFreeChart 对象,这就显得比较繁琐了。
  对于常见的饼图、柱状图,我们可以对 JFreeChart 插件进行适当改进,由 JFreeChart 插件来根据 Dataset 创建 JFreeChart 对象,这样就可以让 Struts 2 Action 开发者更加简便。
  JFreeChart 插件的关键就是实现了一个名为“chart”的 Result Type,为了简化 JFreeChart 插件,我们改进这个名为“chart”的 Result Type,下面是改进过的 Result Type 类:
  


清单 4. CrazyChartResult.java
package org.crazyit.struts2.dispatcher;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.Result;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.ChartFactory;
import org.jfree.data.general.*;
import org.jfree.data.category.CategoryDataset;
import org.jfree.chart.plot.PlotOrientation;
import org.apache.struts2.dispatcher.ChartResult;
import java.io.OutputStream;
public class CrazyChartResult extends ChartResult
{
private boolean chartSet;
private Dataset dataset;
private String chartType;
private String title;
public CrazyChartResult()
{
super();
}
// 省略了各属性的 setter 和 getter 方法
...
public void execute(ActionInvocation invocation) throws Exception
{
// 获取 dataset
if (!chartSet)
{
System.out.println("!!!!!!!!!!!");
dataset = (Dataset) invocation.getStack()
.findValue("dataset", Dataset.class);
}
// 如果 JFreeChart 不存在,Dataset 也不存在,那将引发异常
if (super.getChart() == null
&& dataset == null)
throw new NullPointerException(
"No JFreeChart object found on the stack with name "
+ super.getValue()  + "且创建统计图表的 Dataset 也不存在!");
if (super.getChart() == null
&& dataset != null)
{
if (chartType.equals("pieChart"))
{
// 创建统计图
super.setChart(ChartFactory.createPieChart(
title,  // 图表标题
(PieDataset)dataset, // 数据
true, // 是否显示图例
false, // 是否显示工具提示
false // 是否生成 URL
));
}
else if (chartType.equals("barChart"))
{
super.setChart(ChartFactory.createBarChart(
title,
"横座标",
"纵坐标",
(CategoryDataset)dataset,
PlotOrientation.HORIZONTAL,
true, // 是否显示图例
false, // 是否显示工具提示
false // 是否生成 URL
));
}
else
{
throw new IllegalArgumentException(
"该插件暂不支持" + chartType + "类型的统计图 .");
}
}
// 保证统计图表的高、宽数据存在。
if (super.getHeight() == null)
throw new NullPointerException("No height parameter was given.");
if (super.getWidth() == null)
throw new NullPointerException("No width parameter was given.");
// 获取输出图片的二进制输出流
OutputStream os = ServletActionContext
.getResponse().getOutputStream();
try
{
// 输出统计图
if ("png".equalsIgnoreCase(super.getType()))
ChartUtilities.writeChartAsPNG(os, super.getChart()
, super.getWidth(), super.getHeight());
else if ("jpg".equalsIgnoreCase(super.getType())
|| "jpeg".equalsIgnoreCase(super.getType()))
ChartUtilities.writeChartAsJPEG(os, super.getChart()
, super.getWidth(), super.getHeight());
else
throw new IllegalArgumentException(super.getType()
+ " is not a supported render type (only JPG and PNG are).");
}
finally
{
if (os != null) os.flush();
}
}
}

  

  上面程序中粗体字代码就负责根据 Action 中 Dataset 来创建 JFreeChart 对象,从上面源代码中可以看出,这个 JFreeChart 插件只支持创建饼图和柱状图两种;如果开发者希望使用其他其他统计图,则依然需要手动创建 JFreeChart 对象。
  提供了上面 CrazyChartResult 类之后,接下来为新的 Struts 2 插件提供 struts-plugin.xml 文件,这个文件的配置非常简单,只要将名为 chart 的 Result Type 改为使用 CrazyChartResult 类即可。下面是扩展后的 JFreeChart 插件中配置文件的代码:

<?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-default" extends="struts-default">   
<result-types>
<result-type name="chart"
class="org.crazyit.struts2.dispatcher.CrazyChartResult">
<param name="height">150</param>
<param name="width">200</param>
</result-type>
</result-types>
</package>
</struts>
  从上面粗体字代码可以看出,此时的 JFreeChart 插件中名为“chart”的 Result Type 已经改为使用 CrazyChartResult 了,这就允许 Struts 2 中 Action 只要提供 Dataset 即可。
  将这些资源打包成 JAR 文件,即可放在项目中正常使用了。扩展后的 JFreeChart 插件可下载本文的 struts2-crazytjfreechart-plugin-2.1.6.jar 附件。
  使用改进后 JFreeChart 插件
  提供了改进后的 JFreeChart 插件之后,接下来开发者开发的 Action 就会简单多了,下面的 Action 只有一个 getDataset() 方法,该方法返回创建 JFreeChart 的 Dataset 对象,不再需要手动创建 JFreeChart 对象——这个工作由扩展后的 JFreeChart 插件完成。
  还是前面那个创建饼图的示例程序,但此时的 Action 就简单多了,下面是该 Action 类的代码:
  


清单 5. ChartAction.java
public class ChartAction extends ActionSupport
{
// 获取生成统计图的 Dataset
public DefaultPieDataset getDataset()
{
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("Java",47000);
dataset.setValue("Java EE",38000);
dataset.setValue("Ajax",31000);
dataset.setValue("Struts 2",29000);
dataset.setValue("XML",25000);
return dataset;
}
}


  

  上面的 Action 类已经简化多了,该 Action 只需提供一个 Dataset 即可,剩下的事情都交给 JFreeChart 插件来完成。
  当然,开发者还应该告诉 JFreeChart 需要创建怎样的统计图、统计图的标题等必要信息,因此配置该 Action 时需要更多的参数,下面是该 Action 的配置代码:
  


清单 6. struts.xml
<?xml version="1.0" encoding="GBK"?>
<!-- 指定 Struts 2 配置文件的 DTD 信息 -->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<!-- 配置 Struts 2 应用中的常量 -->
<constant name="struts.custom.i18n.resources"
value="messageResource"/>
<constant name="struts.i18n.encoding" value="GBK"/>
<!-- 配置本应用中的包,继承 jfreechart-default 包 -->
<package name="lee" extends="jfreechart-default">
<!-- 定义一个名为 bookChart 的 Action -->
<action name="bookChart" class="lee.ChartAction">
<result type="chart">
<!-- 定义 JFreeChart 报表的大小 -->
<param name="width">800</param>
<param name="height">600</param>
<!-- 指定统计图的标题 -->
<param name="title">Test Title</param>
<!-- 指定创建一个饼图 -->
<param name="chartType">pieChart</param>
</result>
</action>
</package>
</struts>


  

  上面配置文件中粗体字代码指定了创建统计图的类型(饼图)、统计图的标题,提供了这些必要信息之后,JFreeChart 插件即可根据 Action 提供的 Dataset、配置文件中提供的统计图标题、统计图类型自动生成统计图。在浏览器中直接向 bookChart.action 发送请求,将看到如图 3 所示的统计图。
  
图 4. 使用改进后的 JFreeChart 插件
DSC0003.gif

  从图 4 可以看出,改进后的 JFreeChart 插件可以根据 Action 提供的 Dataset 来生成统计图,但需要指出的是:采用这种方式生成的统计图显然无法设置太多的自定义属性——这是因为 JFreeChart 插件负责根据 Dataset 来创建 JFreeChart,而 JFreeChart 插件显然没法根据具体项目进行定制。
  由此可见,改进后的 JFreeChart 插件用起来更方便;如果开发者需要获得对 JFreeChart 全部的控制,则依然可以在 Action 中手动创建 JFreeChart,从而弥补灵活性不足的缺点。



  小结
  JFreeChart 是一个非常优秀的统计图表工具,对于实际企业开发具有非常重要的作用。Struts 2 作为一个强大前端 MVC 框架,已经提供了对 JFreeChart 的封装,不过这种封装对于实际开发来说显得还不够简洁。本文主要从简洁、易用的角度对 Struts 2 的 JFreeChart 做了进一步改进,使得实际项目中可以更方便使用 JFreeChart 来生成统计图表。
  




  下载
  


  描述
  名字
  大小
  下载方法



  扩展后的 JFreeChart 插件


  struts2-crazytjfreechart-plugin-2.1.6.jar


  12KB


  HTTP


  转载自:http://www.ibm.com/developerworks/cn/java/j-lo-struts2-jfreechart/

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-381633-1-1.html 上篇帖子: 在IBM Rational RequisitePro 下篇帖子: IBM pSeries AIX System Administration -- 存储管理、LVM 和文件系统一
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表