1.添加依赖
<dependency>
<groupId>jfree</groupId>
<artifactId>jcommon</artifactId>
<version>1.0.12</version>
</dependency>
<dependency>
<groupId>jfree</groupId>
<artifactId>jfreechart</artifactId>
<version>1.0.9</version>
</dependency>
需要两个jar,分别是jcommon和jfreechart,jfreechart的版本不能太高,否则会出现无法识别中文的现象。
2.web配置
<!-- 配置JfreeChart -->
<servlet>
<servlet-name>DisplayChart</servlet-name>
<servlet-class>
org.jfree.chart.servlet.DisplayChart
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DisplayChart</servlet-name>
<url-pattern>/DisplayChart</url-pattern>
</servlet-mapping>
servlet-name可以自定义,但保证上下一致。
3.关键代码
3.1折线图
public static String createLine(HttpServletRequest request, List<String> data, String[] str) {
HttpSession session = request.getSession(true);
DefaultCategoryDataset linedataset = new DefaultCategoryDataset();
if (data!= null && data.size() > 0) {
for (String data1: data) {
//Attr1是横坐标数据,Attr2是横坐标数据,str[2]是折线名称。str[2]若为n维数组,则生成n条折线
linedataset.addValue(data1.getAttr1(), str[2], data1.getAttr2());
}
} else {
return null;
}
JFreeChart chart = ChartFactory.createLineChart(str[0], // 折线图名称
str[1], // 横坐标名称
str[2], // 纵坐标名称
linedataset, // 数据
PlotOrientation.VERTICAL, // 水平显示图像
true, // include legend
true, // tooltips
false // urls
);
// 可以重新设置标题,替换标题
chart.setTitle(new TextTitle(str[0], new Font("宋体", Font.BOLD + Font.ITALIC, 20)));
// 获得图标中间部分,即plot
CategoryPlot plot = (CategoryPlot) chart.getPlot();
plot.setRangeGridlinesVisible(true); // 是否显示格子线
plot.setBackgroundAlpha(0.3f); // 设置背景透明度
// 获得横坐标
CategoryAxis categoryAxis = plot.getDomainAxis();
categoryAxis.setLabelFont(new Font("微软雅黑", Font.BOLD, 12));
// 获得纵坐标
NumberAxis numberAxis = (NumberAxis) plot.getRangeAxis();
numberAxis.setTickUnit(new NumberTickUnit(2000f));// 间隔
numberAxis.setLabelFont(new Font("微软雅黑", Font.BOLD, 12));
ValueAxis valueAxis = (ValueAxis) plot.getRangeAxis();
valueAxis.setLowerBound(0);// 最小值
valueAxis.setUpperBound(20000);// 最大值
// 返回一个字符串文件名,文件名自动生成,生成好的图片会自动放在服务器的临时文件下。url中的DisplayChart要与web中的配置一致
String fileName = null;
try {
fileName = ServletUtilities.saveChartAsPNG(chart, 600, 600, session);
} catch (IOException e) {
e.printStackTrace();
}
String url = request.getContextPath() + "/DisplayChart?filename=" + fileName;
return url;
}
3.2饼图
public static String createPie(HttpServletRequest request, List<String> data, String[] str) {
HttpSession session = request.getSession(true);
DefaultPieDataset piedataset= new DefaultPieDataset();
if (data!= null && data.size() > 0) {
for (String data1: data) {
piedataset.setValue(data1.getAttr1(), data1.getAttr2());
}
} else {
return null;
}
JFreeChart chart = ChartFactory.createPieChart(str[0], //标题
piedataset, //数据
true, //是否显示Legend
false, //是否显示提示
false);//图中是否存在URL
chart.setTitle(new TextTitle(str[0], new Font("宋体", Font.BOLD + Font.ITALIC, 20)));
String fileName = null;
try {
fileName = ServletUtilities.saveChartAsPNG(chart, 600, 600, session);
} catch (IOException e) {
e.printStackTrace();
}
String url = request.getContextPath() + "/DisplayChart?filename=" + fileName;
return url;
}
3.3柱状图
public static String createBar(HttpServletRequest request, List<String> data, String[] str) {
HttpSession session = request.getSession(true);
DefaultCategoryDataset bardataset = new DefaultCategoryDataset();
if (data!= null && data.size() > 0) {
for (int i = 0; i < 10; i++) {
//Attr1是横坐标数据,Attr2是柱名称,Attr3是纵坐标数据
bardataset .setValue(data.get(i).getAttr1(), data.get(i).getAttr2(),
data.get(i).getAttr3());
}
} else {
return null;
}
JFreeChart chart = ChartFactory.createBarChart(str[0], str[1], str[2], bardataset , PlotOrientation.VERTICAL, true,
true, false);
chart.setTitle(new TextTitle(str[0], new Font("宋体", Font.BOLD + Font.ITALIC, 20)));
CategoryPlot plot = (CategoryPlot) chart.getPlot();
// 获得横坐标
CategoryAxis categoryAxis = plot.getDomainAxis();
categoryAxis.setLabelFont(new Font("微软雅黑", Font.BOLD, 12));
// 获得纵坐标
NumberAxis numberAxis = (NumberAxis) plot.getRangeAxis();
numberAxis.setTickUnit(new NumberTickUnit(1000f));// 间隔
numberAxis.setLabelFont(new Font("微软雅黑", Font.BOLD, 12));
String fileName = null;
try {
fileName = ServletUtilities.saveChartAsPNG(chart, 600, 600, session);
} catch (IOException e) {
e.printStackTrace();
}
String url = request.getContextPath() + "/DisplayChart?filename=" + fileName;
return url;
}
4.jsp
<img src="${url}" title="${str}" data-action="zoom"
data-original="${url}" style="width: 100%; height: 100%;" />
zoom是图片放大工具