1,jfreechart使用的时候版本不宜太高,因为有乱码问题
我采用jfreechart-1.0.1
下载地址:http://sourceforge.net/projects/jfreechart/files/1.%20JFreeChart/
2,添加jar包(包括:mysql-connector-java-5.1.6-bin.jar)
3,查找jfreechart文档制作柱状图和饼图
参考地址:http://www.ibm.com/developerworks/cn/java/l-jfreechart/
【1】,将参考文档中的柱状图代码Copy到项目中
可能出现的问题:导入相应的包
柱状图参考代码:
package com.test.jfreechart;
import java.io.*;
import org.jfree.data.*;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.chart.*;
import org.jfree.chart.plot.*;
/**
* 该类用于演示最简单的柱状图生成
* @author Winter Lau
*/
public class TestJfreeChart {
public static void main(String[] args) throws IOException{
/*获取数据集*/
CategoryDataset dataset = getDataSet2();
/*给柱状图设置相应的参数*/
JFreeChart chart = ChartFactory.createBarChart3D(
"水果产量图", // 图表标题
"水果", // 目录轴的显示标签
"产量", // 数值轴的显示标签
dataset, // 数据集
PlotOrientation.VERTICAL, // 图表方向:水平、垂直
true, // 是否显示图例(对于简单的柱状图必须是 false)
false, // 是否生成工具
false // 是否生成 URL 链接
);
/*报表图片生成与输出*/
FileOutputStream fos_jpg = null;
try {
fos_jpg = new FileOutputStream("F:\\fruit.jpg");
ChartUtilities.writeChartAsJPEG(fos_jpg,chart,400,500,null);
} finally {
try {
fos_jpg.close();
} catch (Exception e) {}
}
}
/**
* 获取一个演示用的简单数据集对象1
* @return
*/
private static CategoryDataset getDataSet() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(100, "", "苹果");
dataset.addValue(200, "", "梨子");
dataset.addValue(300, "", "葡萄");
dataset.addValue(400, "", "香蕉");
dataset.addValue(500, "", "荔枝");
return dataset;
}
/**
* 获取一个演示用的组合数据集对象2
* @return
*/
private static CategoryDataset getDataSet2() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(100, "北京", "苹果");
dataset.addValue(100, "上海", "苹果");
dataset.addValue(100, "广州", "苹果");
dataset.addValue(200, "北京", "梨子");
dataset.addValue(200, "上海", "梨子");
dataset.addValue(200, "广州", "梨子");
dataset.addValue(300, "北京", "葡萄");
dataset.addValue(300, "上海", "葡萄");
dataset.addValue(300, "广州", "葡萄");
dataset.addValue(400, "北京", "香蕉");
dataset.addValue(400, "上海", "香蕉");
dataset.addValue(400, "广州", "香蕉");
dataset.addValue(500, "北京", "荔枝");
dataset.addValue(500, "上海", "荔枝");
dataset.addValue(500, "广州", "荔枝");
return dataset;
}
}
饼图参考代码:
package com.test.jfreechart;
import java.io.FileOutputStream;
import java.io.IOException;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.data.general.DefaultPieDataset;
/**
* 用于演示饼图的生成
* @author Winter Lau
*/
public class pieJfreeChart {
public static void main(String[] args) throws IOException{
DefaultPieDataset data = getDataSet();
JFreeChart chart = ChartFactory.createPieChart("水果产量图", // 图表标题
data,
true, // 是否显示图例
false,
false
);
// 写图表对象到文件,参照柱状图生成源码
FileOutputStream fos_jpg = null;
try {
fos_jpg = new FileOutputStream("F:\\fruitPie.jpg");
/*ChartUtilities.writeChartAsJPEG(fos_jpg,100,chart,400,300,null); */
ChartUtilities.writeChartAsJPEG(fos_jpg,chart,400,500,null);
} finally {
try {
fos_jpg.close();
} catch (Exception e) {}
}
}
/**
* 获取一个演示用的简单数据集对象
* @return
*/
private static DefaultPieDataset getDataSet() {
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("苹果",100);
dataset.setValue("梨子",200);
dataset.setValue("葡萄",300);
dataset.setValue("香蕉",400);
dataset.setValue("荔枝",500);
return dataset;
}
}
4,WEB上显示制作的报表图片
参考代码:
ShowProductSalesServlet.java
package com.test.jfreechart;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import com.test.util.DB;
public class ShowProductSalesServlet extends HttpServlet {
public ShowProductSalesServlet() {
// TODO Auto-generated constructor stub
super();
}
private DefaultCategoryDataset categoryDataset=new DefaultCategoryDataset();
private DefaultPieDataset pieDataset = new DefaultPieDataset();
private void getDataSet() {
/*DefaultCategoryDataset dataset = new DefaultCategoryDataset(); */
/*dataset.addValue(100, "北京", "苹果"); */
Connection conn=null;
ResultSet rs=null;
PreparedStatement ps=null;
try{
conn=DB.getDBConnection();
String sql="select name,saleNum from product";
ps=conn.prepareStatement(sql);
rs=ps.executeQuery();
System.out.println("查询语句:"+sql);
while(rs.next()){
categoryDataset.addValue(rs.getInt(2), "", rs.getString(1));
pieDataset.setValue(rs.getString(1),rs.getInt(2));
}
}catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
}finally{
DB.close(conn);
DB.close(ps);
DB.close(rs);
}
/*return dataset; */
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/* CategoryDataset dataset = getDataSet(); */
getDataSet();
/*条形图*/
JFreeChart chartCategory = ChartFactory.createBarChart3D(
"产品销量图", // 图表标题
"产品", // 目录轴的显示标签
"销量", // 数值轴的显示标签
categoryDataset, // 数据集
PlotOrientation.VERTICAL, // 图表方向:水平、垂直
true, // 是否显示图例(对于简单的柱状图必须是 false)
false, // 是否生成工具
false // 是否生成 URL 链接
);
/*饼图*/
JFreeChart pieChart = ChartFactory.createPieChart(
"水果产量图", // 图表标题
pieDataset,
true, // 是否显示图例
false,
false
);
FileOutputStream category_jpg = null;
FileOutputStream pie_jpg = null;
try {
/*条形图图片输出*/
category_jpg = new FileOutputStream("F:\\myeclipse_project\\jfreechart1\\WebRoot\\chartPhoto\\productSale.jpg");
/*ChartUtilities.writeChartAsJPEG(fos_jpg,100,chart,400,300,null); */
ChartUtilities.writeChartAsJPEG(category_jpg,chartCategory,400,500,null);
/*饼图图片输出*/
pie_jpg = new FileOutputStream("F:\\myeclipse_project\\jfreechart1\\WebRoot\\chartPhoto\\productSale_pie.jpg");
ChartUtilities.writeChartAsJPEG(pie_jpg,pieChart,400,500,null);
/*重定向到页面*/
this.getServletContext().getRequestDispatcher("/admin/show.jsp").forward(request, response);
} finally {
try {
category_jpg.close();
pie_jpg.close();
} catch (Exception e) {}
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}
上面代码关于图片的存放位置:我设置的是项目文件夹下chartPhoto文件夹的绝对路径
缺点:运行时要刷新项目文件,否则图片显示异常
DB.java
package com.test.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DB {
private static final String driver="com.mysql.jdbc.Driver";
private static final String url="jdbc:mysql://localhost:3306/jfreechart";
private static final String user="root";
private static final String password="110";
public static Connection getDBConnection(){
Connection conn=null;
try {
Class.forName(driver);
conn=DriverManager.getConnection(url,user,password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public static void close(Connection conn){
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(PreparedStatement pstmt){
if(pstmt!=null){
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(ResultSet rs){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(Statement stmt){
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
show.jsp
<pre class="java" name="code"><%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>显示JFREE CHART图表信息!</title>
</head>
<body>
<center>
<table border="1" width="90%" height="100%">
<tr><td><h3>产品销售条形图</h3></td><td><h3>产品销售饼图</h3></td></tr>
<tr>
<td> <img src="<%=request.getContextPath()%>/chartPhoto/productSale.jpg" /></td>
<td> <img src="<%=request.getContextPath()%>/chartPhoto/productSale_pie.jpg" /></td>
</tr>
</table>
<%--<img src="<%=basePath%>/chartPhoto/productSale.jpg" />
--%>
</center>
</body>
</html>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<servlet>
<description>报表制作</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>ShowProductSalesServlet</servlet-name>
<servlet-class>com.test.jfreechart.ShowProductSalesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ShowProductSalesServlet</servlet-name>
<url-pattern>/ShowProductSalesServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
简单数据库设计:
运行测试:
浏览器地址:http://localhost:8088/jfreechart1/ShowProductSalesServlet