JFreeChart是JAVA平台上的一个开放的图表绘制类库,是一个不错的java图形解决方案,利用它能够生成饼图、柱状图、散点图、时序图、甘特图等多种图表,能够解决大部分图形方面的需求。
在统计时,采用JFreeChart可以直接通过Servlet生成相应的展示图,不过项目架构中使用struts,将表现层与业务逻辑分离,此处无需在多使用其他交互方式。采用在申请jsp时,其中的img标签直接调用action,在action中调用业务逻辑,利用从DB中获取的产量统计数据,形成柱状图,将其输出到指定位置,之后返回输入流(inputStream)输出图片。示例代码如下所示:
Jsp端只需要利用img 的src指定相应Action(struts2内容)(View)
<img src="../chart_helper!generateBarChart.action" width="600" height="200" />
利用JFreeChart产生柱状图的核心代码,此处代码可独立与本文使用(Business)
这样在申请访问此jsp时会调用ChartHelperAction中的generateBarChart方法来得到统计图。其中重要的一点是利用JFreeChart生成柱状图存储在指定目录下。示例如下所示:
DefaultCategoryDataset dataset = new DefaultCategoryDataset(); dataset.addValue(150, "1", "A");
dataset.addValue(150, "2", "A");
dataset.addValue(150, "3", "A");
dataset.addValue(150, "1", "B");
dataset.addValue(150, "2", "B");
dataset.addValue(150, "3", "B");
dataset.addValue(150, "1", "C");
dataset.addValue(150, "2", "C");
dataset.addValue(150, "3", "C");
JFreeChart chart = ChartFactory.createBarChart3D(
"", // 图表标题
"", // 目录轴的显示标签
"产量", // 数值轴的显示标签
dataset, // 数据集
PlotOrientation.VERTICAL , // 图表方向:垂直
true, // 是否显示图例(对于简单的柱状图必须是false)
false, // 是否生成工具
false // 是否生成URL链接
);
//重新设置图标标题,改变字体
chart.setTitle(new TextTitle("图书销量统计图", new Font("黑体", Font.ITALIC , 22)));
//取得统计图标的第一个图例
LegendTitle legend = chart.getLegend(0);
//修改图例的字体
legend.setItemFont(new Font("宋体", Font.BOLD, 14));
CategoryPlot plot = (CategoryPlot)chart.getPlot();
chart.setBackgroundPaint(ChartColor.WHITE);
//设置柱状图到图片上端的距离
ValueAxis rangeAxis = plot.getRangeAxis();
rangeAxis.setUpperMargin(0.5);
//取得横轴
CategoryAxis categoryAxis = plot.getDomainAxis();
//设置横轴显示标签的字体
categoryAxis.setLabelFont(new Font("宋体" , Font.BOLD , 22));
//分类标签以45度角倾斜
// categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
categoryAxis.setTickLabelFont(new Font("宋体" , Font.BOLD , 18));
//取得纵轴
NumberAxis numberAxis = (NumberAxis)plot.getRangeAxis();
//设置纵轴显示标签的字体
numberAxis.setLabelFont(new Font("宋体" , Font.BOLD , 22));
//在柱体的上面显示数据
BarRenderer custombarrenderer3d = new BarRenderer();
custombarrenderer3d.setBaseItemLabelPaint(Color.BLACK);//数据字体的颜色
custombarrenderer3d.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
custombarrenderer3d.setBaseItemLabelsVisible(true);
plot.setRenderer(custombarrenderer3d);
FileOutputStream fos = null;
String imagePath = “D:\\chart.jpg”;
try {
fos = new FileOutputStream(imagePath);
//将统计图标输出成JPG文件
ChartUtilities.writeChartAsJPEG(
fos, //输出到哪个输出流
1, //JPEG图片的质量,0~1之间
chart, //统计图标对象
680, //宽
200,//宽
null //ChartRenderingInfo 信息
);
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
上面代码的核心是获取生成Chart的数据源,并借此创建创建柱状图,继而设置图的相关属性,输出到指定位置。上面代码的生成的柱状图效果如下所示:
值得注意的是由于这种报表一段时间下来会产生很多,而业务上也不需要存储这些信息,所以上文中输出的统计图可以依次覆盖。这是上述代码中指定了固定的输出路径imagePath = “D:\\chart.jpg”;。在实际开中这些内容最好在配置文件中设置。
读取硬盘图片,向JSP页面输出图片流(Action)
生成柱状图后我们可以将其读出到inputStream,继而将其输出成图片形式。下面的代码展示了上文jsp 中img src指定action的generateBarChart方法的部分代码,另外的代码为创建柱状图和返回柱状图路径的过程。
try{
String impath = 此处的图路径,是上面所示代码中生成柱状图的存储路径
File file = new File(imagePath);
InputStream inputStream = null;
if(file.exists()){
try {
inputStream = new FileInputStream(file);
} catch (FileNotFoundException e) {
}
}
int i = inputStream.available();
byte data[] = new byte[i];
inputStream.read(data);
HttpServletResponse response = ServletActionContext.getResponse();
ServletOutputStream out = response.getOutputStream();
response.setContentType( "multipart/form-data" );
out.write(data);
out.flush();
out.close();
}catch(IOException e){
e.printStackTrace();
}
此文中间部分是利用JFreeChart产生柱状图的核心代码。上述代码是利用既有的基于struts2的架构进行的图标展示。此外我们还可以将图标输出到整个应用项目中的文件夹中,而返回一个相对应用url的地址,达到直接显现的目的,从而避免上文中利用imgPath获取inputStream,再以图片输出流的形式输出的过程,即第三部分代码可省略。当然采用servlet形式直接输出统计表而不再进行存储和读取的方式会相对来讲更简单一点,不过这样的耦合性也会高一些。总之JFreeChart同Java有很好的结合,可以很好的解决图标需求,需加以深入研究。