在JSP中利用JFreechart生成各种图表
一个java新手编写web网页时遇到一个问题,就是取出数据库里的某个表的内容并将其生成柱状图或者折线图,这突然就比较迷茫,不知应该怎样完成,但静下心来想了想思路,首先我应该知道要生成图表有哪些路可寻,通过上网发现了大神总结的心得如下(原文):
https://blog.csdn.net/happylee6688/article/details/26960729
- ChartDirector
- JScharts
- JFreeChart
<%@ page pageEncoding="UTF-8"
contentType="text/html; charset=UTF-8"%>
<%@ page import="java.awt.Color,
org.jfree.chart.ChartFactory,
org.jfree.chart.JFreeChart,
org.jfree.chart.plot.PlotOrientation,
org.jfree.chart.servlet.ServletUtilities,
org.jfree.data.category.CategoryDataset,
org.jfree.data.general.*,
org.jfree.chart.plot.CategoryPlot,
org.jfree.chart.axis.CategoryAxis,
org.jfree.chart.axis.ValueAxis,
org.jfree.chart.renderer.category.BarRenderer3D,
org.jfree.chart.urls.StandardCategoryURLGenerator,
org.jfree.chart.*,
org.jfree.chart.entity.*,
org.jfree.chart.labels.*,
org.jfree.chart.axis.CategoryLabelPositions,
java.awt.Font,
java.awt.GradientPaint,
org.jfree.ui.TextAnchor,
org.jfree.chart.axis.NumberAxis,
org.jfree.chart.axis.NumberTickUnit
"%>
<%@ page import="org.jfree.data.general.DefaultPieDataset"%>
<%@ page import="org.jfree.data.category.CategoryDataset" %>
<%@ page import="org.jfree.data.category.DefaultCategoryDataset" %>
<%@ page import="org.jfree.chart.JFreeChart"%>
<%@ page import="org.jfree.chart.plot.PiePlot"%>
<%@ page import="org.jfree.chart.ChartRenderingInfo"%>
<%@ page import="org.jfree.chart.servlet.ServletUtilities"%>
<%@ page import="org.jfree.chart.urls.StandardPieURLGenerator"%>
<%@ page import="org.jfree.chart.entity.StandardEntityCollection"%>
<%@ page import="org.jfree.chart.encoders.SunPNGEncoderAdapter"%>
<%@ page import="org.jfree.chart.StandardChartTheme"%>
<%@ page import="org.jfree.chart.ChartFactory"%>
<%@ page import="org.jfree.chart.plot.CategoryPlot"%>
<%@ page import="org.jfree.chart.plot.PlotOrientation"%>
<%@ page import="org.jfree.chart.axis.CategoryAxis"%>
<%@ page import="org.jfree.chart.renderer.category.BarRenderer"%>
<%@ page import="org.jfree.chart.labels.StandardCategoryItemLabelGenerator"%>
<%@ page import="java.awt.Font"%>
<%@ page import="java.awt.Color"%>
<%@ page import="java.sql.*"%>
<%@ page import="java.util.*"%>
<%@ page import="java.awt.*"%>
<%@ page import="java.io.*"%>
<%@ page import="org.jfree.chart.axis.CategoryAxis3D"%>
<%@ page import="org.jfree.chart.axis.CategoryLabelPositions"%>
<%@ page import="org.jfree.chart.axis.CategoryAxis3D"%>
<%@ page import="org.jfree.chart.axis.NumberAxis3D"%>
<%@ page import="org.jfree.chart.axis.NumberTickUnit"%>
<%@ page import="org.jfree.chart.renderer.category.BarRenderer3D"%>
<%@ page import="org.jfree.chart.renderer.category.BarRenderer3D" %>
<%@ page import="org.jfree.chart.renderer.category.LineAndShapeRenderer" %>
<%@ page import="org.jfree.data.category.DefaultCategoryDataset" %>
<%@ page import="org.jfree.chart.plot.DatasetRenderingOrder" %>
//PS:一个新手就尽可能的导入类,以防出错.....
//饼状图代码如下:
<html>
<body>
<%
//实例化核心类对象
DefaultPieDataset dataset=new DefaultPieDataset();
//设置图表值,可为多个
dataset.setValue("paid",45);
dataset.setValue("Unpaid",25);
//根据JFreeChart提供的工厂类org.jfree.chart.ChartFactory创建饼状图
JFreeChart chart=ChartFactory.createPieChart3D("Student payment form",dataset,true,false,false);
//生成图形存入session,得到存入session的图形名称
String filename=ServletUtilities.saveChartAsPNG(chart,500,400,session);
//在页面中通过img展示生成的图形,通过jfreechart的servlet输出图形
String graphURL=request.getContextPath()+"/DisplayChart?filename="+filename;
%>
<img src="<%=graphURL %>" >
</body>
</html>
以上输出图表的方法是用JFreeChart的serverlet进行输出,所以要配置web.xml文件,如下:(如果图表不显示,多半是web.xml没有配置)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>ceshi</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<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>
</web-app>
事实上,图表输出是有俩种方式,另一种是通过一个函数输出:(柱状图为例)
//第一步,构造一个Dataset :填充要统计的数据
DefaultCategoryDataset mDataset = new DefaultCategoryDataset();
mDataset.addValue(2000, "清华大学", "本科生"); //数据一般从数据库得出,用个for循环即可
mDataset.addValue(1500, "清华大学", "研究生");
mDataset.addValue(1000, "清华大学", "博士生");
mDataset.addValue(900, "清华大学", "讲师");
mDataset.addValue(800, "清华大学", "副教授");
mDataset.addValue(300, "清华大学", "教授");
mDataset.addValue(600, "清华大学", "行政人员");
mDataset.addValue(400, "清华大学", "管理人员");
//第二步,生成图形,ChartFactory.createBarChart3D来生成柱状图
JFreeChart mChart = ChartFactory.createBarChart3D(
"学校人员分布图", // 图形名称
"类型", // 分类名称,为横坐标名称
"数量", // 值名称,为纵坐标名称
mDataset, // 数据集合
PlotOrientation.VERTICAL, // 垂直显示
true, // 是否显示图例
true,// 是否使用工具提示
false);// 是否使用url
//第三,显示,有俩种方法:流式输出与URL(上面已经讲了)输出
response.setContentType("image/png");
//流式输出
ChartUtilities.writeChartAsPNG(response.getOutputStream(),mChart,800,500);
//////////////////////////////////////////////////////
按理说,图表核心输出就已经学会了,但从上文得知,JFreeChart是不支持中文,会出现乱码,如果图表中的参数用英文,上面代码足以应付
如果想输出中文而且还不显示乱码,那必须要自己再配置,如下:
// 配置字体
Font xfont = new Font("宋体", Font.PLAIN, 12);// X轴
Font yfont = new Font("宋体", Font.PLAIN, 12);// Y轴
Font kfont = new Font("宋体", Font.PLAIN, 12);// 底部
Font titleFont = new Font("宋体", Font.BOLD, 25); // 图片标题
// 图形的绘制结构对象,对于饼图不适用
CategoryPlot plot = mChart.getCategoryPlot();
// X 轴
CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setLabelFont(xfont);// 轴标题
domainAxis.setTickLabelFont(xfont);// 轴数值
domainAxis.setTickLabelPaint(Color.BLACK); // 字体颜色
// Y 轴
ValueAxis rangeAxis = plot.getRangeAxis();
rangeAxis.setLabelFont(yfont);
rangeAxis.setLabelPaint(Color.BLACK); // 字体颜色
rangeAxis.setTickLabelFont(yfont);
这样就解决乱码了,上边的代码适用柱状图,设置字体,
对于折线图、饼图设置字体 的代码不太一样,需要单独对不同类型的图形设置字体,但都非常类似。
用户的一般需求上面的一些思路就足以,但有时想输出一些综合的图表,比如柱状图与折线图一起输出,甚至是柱状图与很多折线图一起输出,
网上也有很多例子,顺带着上面的思想也可以学习折线图。
综合图参考链接:
http://blog.sina.com.cn/s/blog_906e353d0101241e.html
https://blog.csdn.net/sb_jb/article/details/77867614?fps=1&locationNum=2