在Struts2中,用JFreeChart实现饼状图统计

前段时间学习了一下JFreeChart,现在来整理一下自己所作的实例。

下面分别用两种方式来实现: 一种是以java应用程序的方式,一种是以web项目程序的方式

需要加入的jar包有:  jcommon-1.0.17.jar 、 jfreechart-1.0.14.jar(前两个是JFreeChart中所带的,在下载的JFreeChart的lib目录下) 、 struts2-jfreechart-plugin-2.3.16.3.jar(这个是Struts2所带的,在下载的Struts2的lib目录下)、struts2所常用的9个核心jar包 。 jar包的版本可以有所不同

上述jar包放入到项目的WebRoot/WEB-INF/lib目录下

1、 以java应用程序的方式运行,在web项目中的src目录下新建包: com.jfreechart.test  , 在该包中新建类 PieChartTest.java

PieChartTest.java

package com.jfreechart.test;import java.awt.Color;
import java.awt.Font;
import java.io.File;
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.NumberFormat;import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;
import org.jfree.util.Rotation;public class PieChartTest {public static void main(String[] args) throws IOException{//步骤1:创建CategoryDataset对象(准备数据)     PieDataset dataset = createDataset();     //步骤2:根据Dataset 生成JFreeChart对象,以及做相应的设置     JFreeChart jfreeChart = createChart(dataset);     //步骤3:将JFreeChart对象输出到文件     saveAsFile("F:\\PieChart.jpg", jfreeChart, 800, 600);     } /*** 创建一个dataset,该dataset包含图表要显示的数据* @return DefaultPieDataset*/private static DefaultPieDataset createDataset() {//DefaultPieDataset是默认的饼形图数据集合对象类,可用于创建饼形图数据集合对象DefaultPieDataset dataset = new DefaultPieDataset(); //为dataset对象设值dataset.setValue("文学类",20000); dataset.setValue("科技类",42000); dataset.setValue("财经类",21000); dataset.setValue("娱乐类",29000); //返回数据集合对象return dataset; }/**    * 根据PieDataset创建JFreeChart对象* @return JFreeChart    */      public static JFreeChart createChart(PieDataset pieDataset) {//JFreeChart类是一个制图对象类,先用它来创建一个制图对象chart//ChartFactory类是制图工厂类,用它来为制图对象chart完成实例化//createPieChart()是制图工厂的一个方法,用来创建一个常规的饼形图对象JFreeChart chart = ChartFactory.createPieChart("图书销量统计图",            //图表标题pieDataset,              //数据集true,                    //是否显示图例false,                   //是否采用标准生成器false                    //是否支持超链接);//通过JFreeChart对象的 setTitle方法,修改统计图表的标题部分(包括修改图表标题内容、字体大小等)chart.setTitle(new TextTitle("图书销量统计图", new Font("黑体", Font.ITALIC , 22))); //调用 JFreeChart对象的 getLegend(int index)方法,取得该图表的指定索引的图例对象,通过 LegendTitle对象来修改统计图表的图例  LegendTitle legend = chart.getLegend(0); //设置图例的字体和字体大小,即位于下方的字的字体和大小legend.setItemFont(new Font("宋体", Font.BOLD, 14));// 设置画布背景色//chart.setBackgroundPaint(new Color(192, 228, 106));//取得饼图的绘图(plot)对象PiePlot plot = (PiePlot)chart.getPlot();//设置Pie图的分类标签的字体,即位于Pie图的中间部分的每个扇形旁边对应的字的字体plot.setLabelFont(new Font("隶书", Font.BOLD, 16));//设置数据区的背景透明度,范围在0.0~1.0间plot.setBackgroundAlpha(0.9f);//设置PieChart是否显示为圆形    plot.setCircular(true);//完全关闭片区外廓,若将值设为 true 即可让外廓显示出来plot.setSectionOutlinesVisible(false);//设置忽略零值,不设值时默认会将一个标签放置在饼图片区显示的位置,并且在图表的图例中添加一个分类。//plot.setIgnoreZeroValues(true);//设置忽略null值,不设值时默认情况跟零值一样//plot.setIgnoreNullValues(true);//设置旋转角度    plot.setStartAngle(90.0);    //设置旋转方向,Rotation.CLOCKWISE)为顺时针。    plot.setDirection(Rotation.CLOCKWISE); //设置将某一片区取出,即偏离图表中心,以起到强调作用plot.setExplodePercent("文学类", 0.2);//设置每个数据区的填充颜色,不设置即默认,默认时是自动分配的//plot.setSectionPaint("文学类", new Color(200, 255, 255));        // 图片中显示百分比:自定义方式,{0} 表示选项, {1} 表示数值, {2} 表示所占比例 ,小数点后两位plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}={1}({2})", NumberFormat.getNumberInstance(),new DecimalFormat("0.00%")));// 图例显示百分比:自定义方式, {0} 表示选项, {1} 表示数值, {2} 表示所占比例//plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator("{0}={1}({2})"));return chart;}/*** 保存图表为文件 */public static void saveAsFile(String filePath, JFreeChart jfreeChart,      int weight, int height) throws IOException { //输出图表到文件,saveCharAsJPEG()方法的参数(File file,JFreeChart chart,int width,int height)ChartUtilities.saveChartAsJPEG(new File(filePath), jfreeChart, weight, height);}}

以java应用程序的方式,运行上面的 PieChartTest.java ,便可以在F盘的根目录下产生了一个名叫PieChart.jpg文件,如下图所示:

2、 以web项目程序的方式运行

(1)在web项目中的src目录下新建包: com.jfreechart.action , 在该包中新建类 PieChartAction.java

PieChartAction.java
package com.jfreechart.action;import java.awt.Font;
import java.io.File;
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Map;import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.util.Rotation;import com.jfreechart.commons.FileUtil;
import com.opensymphony.xwork2.ActionContext;public class PieChartAction {private JFreeChart chart;// 必须提供 getChart() 方法,且由该方法返回 JFreeChart 对象public JFreeChart getChart() throws Exception {//JFreeChart类是一个制图对象类,先用它来创建一个制图对象chart//ChartFactory类是制图工厂类,用它来为制图对象chart完成实例化//createPieChart()是制图工厂的一个方法,用来创建一个常规的饼形图对象chart = ChartFactory.createPieChart("图书销量统计图",            //图表标题createDataset(),         //数据集true,                    //是否显示图例false,                   //是否采用标准生成器false                    //是否支持超链接);//通过JFreeChart对象的 setTitle方法,修改统计图表的标题部分(包括修改图表标题内容、字体大小等)chart.setTitle(new TextTitle("图书销量统计图", new Font("黑体", Font.ITALIC , 22))); //调用 JFreeChart对象的 getLegend(int index)方法,取得该图表的指定索引的图例对象,通过 LegendTitle对象来修改统计图表的图例  LegendTitle legend = chart.getLegend(0); //设置图例的字体和字体大小,即位于下方的字的字体和大小legend.setItemFont(new Font("宋体", Font.BOLD, 14));// 设置画布背景色//chart.setBackgroundPaint(new Color(192, 228, 106));//取得饼图的绘图(plot)对象PiePlot plot = (PiePlot)chart.getPlot();//设置Pie图的分类标签的字体,即位于Pie图的中间部分的每个扇形旁边对应的字的字体plot.setLabelFont(new Font("隶书", Font.BOLD, 16));//设置数据区的背景透明度,范围在0.0~1.0间plot.setBackgroundAlpha(0.9f);//设置PieChart是否显示为圆形    plot.setCircular(true);//完全关闭片区外廓,若将值设为 true 即可让外廓显示出来plot.setSectionOutlinesVisible(false);//设置忽略零值,不设值时默认会将一个标签放置在饼图片区显示的位置,并且在图表的图例中添加一个分类。//plot.setIgnoreZeroValues(true);//设置忽略null值,不设值时默认情况跟零值一样//plot.setIgnoreNullValues(true);//设置旋转角度    plot.setStartAngle(90.0);    //设置旋转方向,Rotation.CLOCKWISE)为顺时针。    plot.setDirection(Rotation.CLOCKWISE); //设置将某一片区取出,即偏离图表中心,以起到强调作用plot.setExplodePercent("文学类", 0.2);//设置每个数据区的填充颜色,不设置即默认,默认时是自动分配的//plot.setSectionPaint("文学类", new Color(200, 255, 255));        // 图片中显示百分比:自定义方式,{0} 表示选项, {1} 表示数值, {2} 表示所占比例 ,小数点后两位plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}={1}({2})", NumberFormat.getNumberInstance(),new DecimalFormat("0.00%")));// 图例显示百分比:自定义方式, {0} 表示选项, {1} 表示数值, {2} 表示所占比例//plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator("{0}={1}({2})"));//设置生成的图表的文件名String fileName = "PieChartBook.jpg";//设置图表输出的指定路径String filePath = FileUtil.getWebRootPath()+"images\\chart\\"+fileName;//输出图表到文件saveAsFile(filePath, chart, 800, 600);//取得request对象Map request = (Map)ActionContext.getContext().get("request");//把生成的图表文件的路径filePath放进request对象中request.put("filePath", filePath);return chart;}/*** 保存图表为文件 */public static void saveAsFile(String filePath, JFreeChart jfreeChart,      int weight, int height) throws IOException { //输出图表到文件,saveCharAsJPEG()方法的参数(File file,JFreeChart chart,int width,int height)ChartUtilities.saveChartAsJPEG(new File(filePath), jfreeChart, weight, height);}/*** 创建一个dataset,该dataset包含图表要显示的数据* @return DefaultPieDataset*/private static DefaultPieDataset createDataset() {//DefaultPieDataset是默认的饼形图数据集合对象类,可用于创建饼形图数据集合对象DefaultPieDataset dataset = new DefaultPieDataset(); //为dataset对象设值dataset.setValue("文学类",20000); dataset.setValue("科技类",42000); dataset.setValue("财经类",21000); dataset.setValue("娱乐类",29000); //返回数据集合对象return dataset; }//在struts.xml中的对应<action>里,应该写的是  method="pieChart" 和  <result type="chart">public String pieChart() {return "success";}
}

(2)在web项目中的src目录下新建struts.xml文件

struts.xml
[java] view plaincopyprint?
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
  3. <struts>
  4. <!-- 配置 Struts 2 应用中的常量 -->
  5. <constant name="struts.i18n.encoding" value="UTF-8"/>
  6. <!-- 配置本应用中的包,继承 jfreechart-default 包 -->
  7. <package name="chart" extends="jfreechart-default">
  8. <!-- 定义一个名为 barChart 的 Action -->
  9. <action name="pieChart" class="com.jfreechart.action.PieChartAction" method="pieChart">
  10. <result type="chart">
  11. /PieChart.jsp
  12. <!-- 定义 JFreeChart 报表的大小 -->
  13. <param name="width">800</param>
  14. <param name="height">500</param>
  15. </result>
  16. </action>                                                                               </package>
  17. </struts>

(3)修改在web项目中的WebRoot/WEB-INF/目录下的web.xml

web.xml
[java] view plaincopyprint?
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="3.0"
  3. xmlns="http://java.sun.com/xml/ns/javaee"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  6. http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  7. <!-- 设置struts 2过滤器 -->
  8. <filter>
  9. <filter-name>struts 2</filter-name>
  10. <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  11. </filter>
  12. <filter-mapping>
  13. <filter-name>struts 2</filter-name>
  14. <url-pattern>/*</url-pattern>
  15. </filter-mapping>
  16. <!-- 设置欢迎页面 -->
  17. <welcome-file-list>
  18. <welcome-file>index.jsp</welcome-file>
  19. </welcome-file-list>
  20. <!-- session超时定义,单位为分钟 -->
  21. <session-config>
  22. <session-timeout>30</session-timeout>
  23. </session-config>
  24. </web-app>

(4)在web项目中的src目录下新建包: com.jfreechart.commons , 在该包中新建类 FileUtil.java

FileUtil.java
[java] view plaincopyprint?
  1. package com.jfreechart.commons;
  2. import javax.servlet.ServletContext;
  3. import org.apache.struts2.ServletActionContext;
  4. import com.opensymphony.xwork2.ActionContext;
  5. public class FileUtil {
  6. /**
  7. * 获得web项目根目录
  8. */
  9. public static String getWebRootPath() throws Exception {
  10. ActionContext actionContext = ActionContext.getContext();
  11. ServletContext servletContext = (ServletContext)actionContext.get(ServletActionContext.SERVLET_CONTEXT);
  12. String rootPath = servletContext.getRealPath("/");
  13. return rootPath;
  14. }
  15. }

(5)在web项目中的WebRoot/目录下新建index.jsp、PieChart.jsp

index.jsp
[java] view plaincopyprint?
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <%
  3. String path = request.getContextPath();
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>
  6. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  7. <html>
  8. <head>
  9. <base href="<%=basePath%>">
  10. <title>首页</title>
  11. </head>
  12. <body>
  13. <a href="pieChart.action">查看饼状图</a><br />
  14. </body>
  15. </html>

PieChart.jsp

[java] view plaincopyprint?
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <%@ taglib prefix="s" uri="/struts-tags"%>
  3. <%
  4. String path = request.getContextPath();
  5. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  6. %>
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  8. <html>
  9. <head>
  10. <base href="<%=basePath%>">
  11. <title>饼状图</title>
  12. </head>
  13. <body>
  14. <img src="<s:property value="#request.filePath" />" />
  15. </body>
  16. </html>

完成以上步骤后,把项目部署到服务器,在浏览器中访问该项目的index.jsp文件,点击“查看饼状图”的链接,即可跳转到PieChart.jsp页面,饼状图图表就显示在PieChart.jsp页面上了,图表的效果如上图一致。另外,上述所用的方法是 把图表先生成一个jpg文件,存放在服务器上的该web项目的相关目录下,然后在前台的jsp页面中引用该文件在项目中的的文件路径,即可把图表显示到前台页面中


整个项目的源码可在http://download.csdn.net/detail/wangcunhuazi/8134133这里下载

JFreeChart在Struts2中实现饼状图统计相关推荐

  1. JFreeChart在Struts2中实现3D折线图统计

    在Struts2中,用JFreeChart实现3D折线图统计 前段时间学习了一下JFreeChart,现在来整理一下自己所作的实例. 下面分别用两种方式来实现: 一种是以java应用程序的方式,一种是 ...

  2. JFreeChart在Struts2中实现3D饼状图统计

    在Struts2中,用JFreeChart实现3D饼状图统计 前段时间学习了一下JFreeChart,现在来整理一下自己所作的实例. 下面分别用两种方式来实现: 一种是以java应用程序的方式,一种是 ...

  3. JFreeChart框架中生成饼状图上怎样显示数据 [问题点数:40分,结帖人GreenLawn]

    我用JFreeChart框架生成饼状图,但想把数据信息在饼图上显示,是在饼图内部(即圆内)显示!怎样实现啊?? 去掉lable pieplot.setLabelGenerator(null); 去掉线 ...

  4. AntV中的饼状图重复渲染问题解决

    场景 在使用AntV的饼状图时,在页面加载完之后js中会ajax请求一次后台数据, 有一个时间的选择框,选择时间后点击搜索会再次执行ajax请求一次. 效果如图: 可是最终导致的后果是饼状图重复渲染. ...

  5. AntV中的饼状图中的花瓣图旁边的文字显示label怎样修改

    场景 官方花瓣图实例: http://antv.alipay.com/zh-cn/g2/3.x/demo/pie/pie-platelets.html 官方示例效果: 需要修改成的效果 需要将图形旁边 ...

  6. Python 在 excel 中画 饼状图 折线图

    excel 饼状图绘制 案例1 from openpyxl import Workbook from openpyxl.chart import PieChart, Reference from op ...

  7. C#应用NPOI实现导出EXcel表格中插入饼状图(可实现动态数据生成)

    一.思路:   1.excel是可以通过NPOI插入图片的: 2.C#通过NPOI生成饼状图: 3.把生成的饼状图以字节流的形式插入到表格 二.看代码: #region 生成饼图图例/// <s ...

  8. python柱状图、直方图和饼状图统计学生成绩

    Python的matplotlib库具有很强大的绘图功能,可以利用这个库函数来进行学生成绩统计.假如有一个班的某科学生成绩如表1所示,可以用柱状图.直方图和饼状图三种方式来进行统计分析.下边介绍一下操 ...

  9. AntV中的饼状图中的花瓣图中的ToolTip怎样修改

    场景 官方花瓣图实例: http://antv.alipay.com/zh-cn/g2/3.x/demo/pie/pie-platelets.html 官方示例效果: 官方的提示: 官方示例代码: & ...

最新文章

  1. Alpha 冲刺 (2/10)
  2. SDM450+android8.1播放左声道音频文件和右声道音频文件,左右喇叭都有声音问题
  3. 第四天2017/03/31(下午1:结构体、数组)
  4. wifi测试相关(iwconfig,WPA Supplicant用法)
  5. C语言精髓篇|函数的参数和返回值
  6. 物理学与计算机相关参考文献,物理学专业论文参考文献
  7. 学习IOS 开发需要什么?
  8. HiveQL学习笔记(四):Hive窗口函数
  9. 181027每日一句
  10. springboot实现图片验证码登录
  11. win10升级助手_不用QQ也能电脑远程,win10这功能太良心了!真后悔晚发现
  12. 一文读懂什么是数据产品交易
  13. YAML简介(.yml文件后缀)
  14. 一次搞懂 Android 音频开发
  15. 微信服务器 移动信号,微信消息延迟,只需更改手机这5个设置,效果“立竿见影”...
  16. Node + 讯飞语音 定时播放天气预报音频
  17. 如何创建一个 react 项目及如何运行?
  18. dSYM文件解析与分析
  19. android方法入口,Android App多个入口的实现方法
  20. 预防XSS,这几招管用!

热门文章

  1. php搭建markdown云笔记_使用 Leanote 搭建自己专属的云笔记
  2. 2018年7月面试记录
  3. tmodjs+artTemplate用法,简单的实例
  4. 全民目击之“波状登录”
  5. CAD转换技巧之cad如何转换成图片经验分享
  6. CAD图纸怎么快速转换图片格式?
  7. 任何一台计算机都可以安装win 7系统,任何电脑都能用U盘装64位win7么?
  8. log4j简介与学习
  9. 戴尔电脑开机时卡在logo处进不去系统的解决办法(Win10)
  10. Verilog 中需要使用原语的情况