the5fire的技术博客

关注python、vim、linux、web开发和互联网--life is short, we need python.


JFreeChart饼状图Web应用及JFreeChart中文乱码解决

作者:the5fire | 标签:     | 发布:2011-01-06 12:11 p.m. | 阅读量: 3851, 3850

对于任何一款数据统计,或者是数据管理软件来说有一个直观的图形显示各个区域数据的分布无疑是让系统更好的为人服务的一个特色。比如说:进销存软件,CMS,DRP。一个直观的数据分布、统计显示是相当的重要,这里我就是简单的使用JFreeChart演示一下。 关于使用JFreeChart乱码的问题,我所知道的有两种不同的解决方案,一种是在生成图片的时候要设置编码格式,这个试了一下,本地生成图片没问题,不过web的没有测试成功;第二种是使用老版本的JfreeChart,目前最新的是1.0.13,使用1.0.10就可以解决乱码问题。不知道是不是这个组件开发的问题。JFreeChart1.0.10下载地址: http://u.115.com/file/f4571d9153

首先进行本地生成图片的演示: 建立一个类,BarChartDemo.java:

package com.demo;

import java.io.FileOutputStream;
import java.io.IOException;

import org.jfree.chart.*;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.*;

/**
* 该类用于演示最简单的柱状图生成
* @author 胡阳
*/
public class BarChartDemo {

    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("D:\\fruit.jpg");
            ChartUtilities.writeChartAsJPEG(fos_jpg,1.0f,chart,400,300,null);
        } finally {
            try {
                fos_jpg.close();
            } catch (Exception e) { }
        }

    }

    /**
    * 获取一个演示用的简单数据集对象
    * @return
    */

    private static CategoryDataset getDataSet() {
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        dataset.addValue(100, null, "苹果");
        dataset.addValue(200, null, "梨子");
        dataset.addValue(300, null, "葡萄");
        dataset.addValue(400, null, "香蕉");
        dataset.addValue(500, null, "荔枝");
        return dataset;
    }

    /**
    * 获取一个演示用的组合数据集对象
    * @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;
    }
}

运行一下,即可在D盘下生成一饼状图图片。哦,忘了说了,要先把JFreeChart1.0.10包里面的jcommon-1.10.13.jar和jfreechart-1.0.10.jar以及gnujaxp.jar拷打WEB-INF目录的lib文件下。

WEB使用演示: 首先建立一个Servlet,BarChartServlet.java:

package com.web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.data.general.DefaultPieDataset;

/**
 * 输出图形的一个Servlet
 * @author 胡阳
 *
 */
public class BarChartServlet extends HttpServlet {

    public void service(ServletRequest req, ServletResponse res)
    throws ServletException, IOException {
            res.setContentType("image/jpeg");
            DefaultPieDataset data = getDataSet();
            JFreeChart chart = ChartFactory.createPieChart3D("水果产量图",
                    data,
                    true,
                    false,
                    false
        );

        ChartUtilities.writeChartAsJPEG(res.getOutputStream(),1.0f,chart,400,300,null);
    }
    /**
    * 获取一个演示用的简单数据集对象
    * @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;
    }

}

然后配置xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:javaee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <servlet>
        <servlet-name>BarChartServlet</servlet-name>
        <servlet-class>com.web.BarChartServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>BarChartServlet</servlet-name>
        <url-pattern>/servlet/BarChartServlet</url-pattern>
    </servlet-mapping>
</web-app>

最后建立index.jsp页面进行效果测试:

<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
</head>
<body>
<img alt="饼状图" src="servlet/BarChartServlet">
</body>
</html>

最后效果:

http://img208.poco.cn/mypoco/myphoto/20110106/12/5591354820110106120055094.jpg

—EOF—


----EOF-----

扫码关注,或者搜索微信公众号:码农悟凡


其他分类: