Struts2与JFreeChart整合

17 篇文章 0 订阅
3 篇文章 0 订阅
JFreechart是JAVA平台上的一个开放的图表绘制类库。完全使用JAVA语言编写的。基本上能够很直观的解决目前所有的统计方面的需求。JFreeChart可以生成饼图(pie charts),柱状图(bar charts),散点图(scatter plots),时序图(time series),甘特图(Gantt charts)等多种图表,并且可以产生PNG和JPEG格式的输出。
[size=xx-large][b]JFreeChart 与Struts2整合[/b][/size]
到JFreeChart的官网[url]http://www.jfree.org/jfreechart/download.html[/url]下载相关的资源,找到JFreeChart的资源包jfreechart-1.0.14.zip下载并解压。
lib:文件夹里面放的就是JFreeChart的jar包,和所有的JFreeChart依赖的jar包。
Struts2并没有求全而是设计了一个灵活,可扩展的插件体系,以插件的方式,为struts2添加新的功能。在struts2下载包中的lib目录会发现这里面以struts2作为文件名开头的文件可以被分成两类,一类是struts2的核心包,Eg:struts2-core-2.3.3.jar;而其他的都叫Struts2-xxx-plugin-2.3.3.jar,很显然,后者都是Struts2的插件。
这些插件的存在形式就是普通的jar包。打开看看会发现只要是插件的jar包,其根目录下都有一个叫Struts-plugin.xml的文件,里面有这个插件相应的配置。
以struts2-jfreeChart-plugin-2.3.3.jar中的struts-plugin.xml为例:
<?xml version="1.0" encoding="UTF-8" ?> 
<struts>
<package name="jfreechart-default" extends="struts-default">
<result-types>
<result-type name="chart" class="org.apache.struts2.dispatcher.ChartResult" default="false">
<param name="height">150</param>
<param name="width">200</param>
</result-type>
</result-types>
</package>
</struts>

其实这个struts-plugin.xml实际上就是个struts.xml,至此,可以看到struts2插件的存在方式:[color=red][b]struts2-xxx-plugin-版本号。jar[/b][/color]
[size=x-large][b]struts2插件的加载顺序和作用[/b][/size]
在启动web容器的时候,Struts2有一个运行时配置,它会按照以下顺序加载配置文件:
struts-default.xml这个文件应该在核心包中,也就是struts2-core-版本号.jar中,通常有一个。
struts-plugin.xml这种文件应该在所有的插件包中,也就是以struts2-xxx-plugin-版本号.jar,通常会有多个。
struts.xml这个文件应该在web应用的classpath根目录下有一个。
通常情况下,插件的配置文件优先于我们的配置文件加载,因此,我们可以像引用struts-default包一样来引用struts-plugin.xml文件中的其他包。
有了上面的那个JFreeChart插件的struts-plugin.xml后,我们的<package>元素只要继承插件中的包,就可以任意使用这个包内的任意资源。如下:(注:[color=green][b]以下代码都是工作项目中的真实代码[/b][/color])
<package name="default" extends="json-default,jfreechart-default">
<!-- 统计查询 -->
<action name="jFreeChart" class="logAction" method="jFreeChart">
<result name="success" type ="chart" >
<param name ="width"> 780 </param>
<param name ="height"> 370 </param>
</result>
</action>
</package>

注意三点:
[b][color=green]struts2的包在继承关系上是递归的,其配置文件可以多继承中间用“,”分割。[/color][/b]jfreeChart-default包继承自struts-default包,因此,可以自由使用struts-default的东西。
我们的包继承了jfreeChart-default包,因此,我们可以随意使用jfreeChart-default包中的东西,<result name="success" type="chart">就是使用了jfreechart-defaultbao中定义的<result-type name="char">.
插件就是以这种声明新包,然后再新包中声明新功能的方式,来简洁的加入到应用中,而且在插件中还可以通过声明替换struts-default包中的默认行为。
把struts2-jfreeChart-plugin-2.3.3.jar,jcommon-1.0.17.jar,jfreechart-1.0.14.jar导入到项目中,就可以进行相关的开发。
在公司项目中统计这块的业务代码是我来负责,首先写了一个JfreeChartUtil类
/**
package com.tq.platform.util;

/**
* @Title: Savepath.java
* @Package: com.tq.platform.util
* @Description: TODO(JFreeChart uitl)
* @author: 何枫
* @date: 2012-5-11 下午08:52:24
* @version: V1.0
*/
import java.awt.Color;
import java.awt.Font;
import java.awt.RenderingHints;
import java.io.File;
import java.io.FileOutputStream;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer3D;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.general.DatasetUtilities;

public class CreateLinechart {
/**
* 图片保存的根目录
* @param filename
* @return
*/
public String Savepath(){
String path = getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
String testpath = path.substring(0,path.lastIndexOf("WEB-INF"));
String filepath = testpath+"images/";
String JFpath = filepath +"core/";
return JFpath;//Tomcat的中webapps目录下项目的images文件夹
}

/**
* 柱状图,折线图 数据集 方法
*/
public CategoryDataset getBarData( String[] rowKeys,
String[] columnKeys,double[][] data) {
return DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);

}
public void isChartPathExist(String chartPath) {
File file = new File(chartPath);
if (!file.exists()) {
file.mkdirs();
// log.info("CHART_PATH="+CHART_PATH+"create.");
}

}
/**
*
* @Title: createBarChart3D
* @Description: TODO(柱状图样式)
* @param @param charTitle
* @param @param x
* @param @param y
* @param @param Dataset
* @param @param charName
* @param @return 设定文件
* @return JFreeChart 返回类型
* @throws
*/
public JFreeChart createBarChart3D(String charTitle, String x, String y, CategoryDataset Dataset, String charName){
JFreeChart chart = ChartFactory.createLineChart(charTitle, x, y,
Dataset, PlotOrientation.VERTICAL, true, true, false);
chart.setTitle(new TextTitle("用户统计图", new Font("黑体", Font.ITALIC,22)));
CategoryPlot categoryPlot = chart.getCategoryPlot();
NumberAxis numberaxis = (NumberAxis) categoryPlot.getRangeAxis();
// 设置纵坐标的标题字体和大小
numberaxis.setLabelFont(new Font("黑体", Font.CENTER_BASELINE, 24));
// 设置丛坐标的坐标值的字体颜色
numberaxis.setLabelPaint(Color.BLACK);
// 设置丛坐标的坐标轴标尺颜色
numberaxis.setTickLabelPaint(Color.RED);
// 获取横坐标
CategoryAxis domainAxis = categoryPlot.getDomainAxis();
// 设置横坐标的标题字体和大小
domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 13));
// 设置横坐标的坐标值的字体颜色
domainAxis.setTickLabelPaint(Color.BLACK);
// 设置横坐标的坐标值的字体
domainAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 20));
// 这句代码解决了底部汉字乱码的问题
chart.getLegend().setItemFont(new Font("黑体", 0, 16));
//在柱体的上面显示数据
BarRenderer3D custombarrenderer3d = new BarRenderer3D();
//数据字体颜色
custombarrenderer3d.setBaseItemLabelPaint(Color.BLACK);
custombarrenderer3d.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
custombarrenderer3d.setBaseItemLabelsVisible(true);
categoryPlot.setRenderer(custombarrenderer3d);
//图片路径
FileOutputStream fos_jpg = null;
try {
isChartPathExist(Savepath());
String chartName = Savepath() + charName;
fos_jpg = new FileOutputStream(chartName);

// 将报表保存为JPG文件
ChartUtilities.writeChartAsJPEG(fos_jpg, chart,780, 370);

} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
try {
fos_jpg.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return chart;
}

/**
* 折线图样式
* @param chartTitle
* @param x
* @param y
* @param xyDataset
* @param charName
* @return
*/
public JFreeChart createTimeXYChar(String chartTitle, String x, String y,
CategoryDataset xyDataset, String charName) {
JFreeChart chart = ChartFactory.createLineChart(chartTitle, x, y,
xyDataset, PlotOrientation.VERTICAL, true, true, false);
// 设置消除字体的锯齿渲染(解决中文问题)
chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
chart.setTextAntiAlias(false);
chart.setBackgroundPaint(Color.RED);
// 设置图标题的字体重新设置title
Font font = new Font("宋体", Font.BOLD, 20);
TextTitle title = new TextTitle(chartTitle);
title.getBackgroundPaint();
//设置字体颜色
title.setPaint(Color.BLUE);
title.setFont(font);
chart.setTitle(title);
CategoryPlot plot = chart.getCategoryPlot();
CategoryAxis valueAxis = plot.getDomainAxis();
// 设置x轴上面的字体
valueAxis.setTickLabelFont(new Font("宋书", Font.ITALIC, 12));
// 设置X轴的标题文字
valueAxis.setLabelFont(new Font("黑体", Font.CENTER_BASELINE, 13));
//设置主标题
TextTitle subtitle = new TextTitle("日时间段访问量对比",new Font("宋体", Font.BOLD, 12));
chart.addSubtitle(subtitle);
NumberAxis numberAxis = (NumberAxis) plot.getRangeAxis();
// 设置y轴上的字体
numberAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 13));
// 设置y轴上的标题字体
numberAxis.setLabelFont(new Font("黑体", Font.CENTER_BASELINE, 13));
// 设置底部的字体
chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));
// 设置面板字体
Font labelFont = new Font("SansSerif", Font.TRUETYPE_FONT, 12);
chart.setBackgroundPaint(Color.WHITE);
CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
// x轴 // 分类轴网格是否可见
categoryplot.setDomainGridlinesVisible(true);
// y轴 //数据轴网格是否可见
categoryplot.setRangeGridlinesVisible(true);
categoryplot.setRangeGridlinePaint(Color.WHITE);// 虚线色彩
categoryplot.setDomainGridlinePaint(Color.WHITE);// 虚线色彩
categoryplot.setBackgroundPaint(Color.lightGray);
// 设置轴和面板之间的距离
// categoryplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D));
CategoryAxis domainAxis = categoryplot.getDomainAxis();
domainAxis.setLabelFont(labelFont);// 轴标题
domainAxis.setTickLabelFont(labelFont);// 轴数值
// domainAxis.setCategoryLabelPositions(CategoryLabelPositions.createUpRotationLabelPositions(0.4));
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.STANDARD); // 横轴上的
// Lable
// 45度倾斜
// 设置距离图片左端距离
domainAxis.setLowerMargin(0.0);
// 设置距离图片右端距离
domainAxis.setUpperMargin(0.0);
NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
numberaxis.setAutoRangeIncludesZero(true);
// 获得renderer 注意这里是下嗍造型到lineandshaperenderer!!
LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer) categoryplot.getRenderer();
//XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer) categoryplot.getRenderer();//改变曲线颜色
lineandshaperenderer.setBaseShapesVisible(true); // series 点(即数据点)可见
lineandshaperenderer.setBaseLinesVisible(true); // series 点(即数据点)间有连线可见
// 显示折点数据
lineandshaperenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
lineandshaperenderer.setBaseItemLabelsVisible(true);
//图片路径
FileOutputStream fos_jpg = null;
try {
isChartPathExist(Savepath());
String chartName = Savepath() + charName;
fos_jpg = new FileOutputStream(chartName);

// 将报表保存为JPG文件
ChartUtilities.writeChartAsJPEG(fos_jpg, chart,780, 370);

} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
try {
fos_jpg.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return chart;
}


}

Action方法很简单,主要是获得数据集。
//用户统计
public String getstutasCountJFreechart(){
// 有序排序
LinkedHashMap<String, Object> parameters = new LinkedHashMap<String, Object>();
if (StringUtils.isNotBlank(stautsMonth)) {
parameters.put("stautsMonth", stautsMonth);
}
int year = Integer.parseInt(stautsMonth.substring(0, 4));
int month =Integer.parseInt(stautsMonth.substring(5, 7));
double[][] data = new double[1][5];
int i = 0;
for (Map.Entry<String, Integer> entry : manager.UserCount(parameters).entrySet()) {
String value = entry.getValue().toString();
data[0][i++] =Double.parseDouble(value);
}
/*for (int x = 0; x < data.length; x++) {
for (int y = 0; y < data[x].length; y++) {
System.out.println(data[x][y]);
}
}*/
String[] rowKeys = { "注册用户统计图" + " " + year +"年"+ month +"月"};
String[] columnKeys = { "待激活", "激活", "暂停", "黑名单", "作废" };

try {
CreateLinechart demo = new CreateLinechart();
getResponse().setContentType("image/jpg");
chart = demo.createBarChart3D("", "","数量", demo.getBarData(rowKeys, columnKeys,data), "chartStatus.jpg");
//chart = demo.createBarChart3D("", "","数量", demo.getBarData(rowKeys, columnKeys,data), PlotOrientation.VERTICAL, true, true, true);
ChartUtilities.writeChartAsJPEG(getResponse().getOutputStream(), chart, 780, 370, null);
} catch (Exception e) {
e.printStackTrace();
}
return SUCCESS;
}



[img]http://dl.iteye.com/upload/attachment/0068/7369/f5894b0a-291b-3cf3-9308-9456c8368216.jpg[/img]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值