JAVA做报表 -- JFreeChart 实例2

第二种方式,在web的服务端生成图表后发送给浏览器端。

(以下代码可以执行)

 

既然是web程序,那首要就是工程文件web.xml了。

web.xml

    <servlet>
        <servlet-name>ChartServlet</servlet-name>
        <servlet-class>com.××.××.report.ChartServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>ChartServlet</servlet-name>
        <url-pattern>/chartServlet</url-pattern>
    </servlet-mapping>

 

ChartServlet.java

//生成JFreeChart chart实例与第一种方法无异

//关键在于chart图形的显示上

//第一种方式是要把chart加入ChartPanel,如后显示在Frame中

//第二种方式则简单些
//ChartUtilities.writeChartAsJPEG(response.getOutputStream(), chart, 500, 300);

//ChartUtilities -- A collection of utility methods for JFreeChart. Includes methods for converting charts to image //formats (PNG and JPEG) plus creating simple HTML image maps.

//利用JFreeChart包中的函数,把图形输出到response

//当然也可以把该图形文件保存,只需这般 ChartUtilities.writeChartAsJPEG(new FileOutputStream("D:// test.jpg"), chart, 500, 300);

 

图片发送到浏览器端

图片写在文件中

 

package com.youcity.website.tools.report;

import java.awt.BasicStroke;
import java.awt.Color;
import java.io.IOException;

import javax.servlet.*;
import javax.servlet.http.*;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.MeterPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.ThermometerPlot;
import org.jfree.data.Range;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.DefaultValueDataset;

/**
 * 生成jFreeChart图片的Servlet
 *
 * @author javaFound
 */
public class ChartServlet extends HttpServlet {
    /**
     * 根据客户端请求的图表类型chartType的值,返回对应的图表,
     */
    public void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 输出图片格式为png格式
        response.setHeader("Cache-Control", "no-cache");
        response.setContentType("image/png");
        // 请求的图表类型
        String chartType = request.getParameter("chartType");
        System.out.println("请求的图表类型是 : " + chartType);
        // for export Chart:
        JFreeChart chart = null;
        if (chartType.equalsIgnoreCase("PieChart3D")) {
            // 创建pie图的数据集方法
            DefaultPieDataset data = ChartTools.getPieDataSet();
            chart = ChartFactory.createPieChart3D("这是PieChart3D图:", data, true,
                    false, false);
        } else if (chartType.equalsIgnoreCase("PieChart")) {
            // 创建pie图的数据集方法
            DefaultPieDataset data = ChartTools.getPieDataSet();
            chart = ChartFactory.createPieChart("这是PieChart图:", data, true,
                    false, false);
        } else if (chartType.equalsIgnoreCase("RingChart")) {
            // 创建pie图的数据集方法
            DefaultPieDataset data = ChartTools.getPieDataSet();
            chart = ChartFactory.createRingChart("这是RingChart图:", data, true,
                    false, false);
        } else if (chartType.equalsIgnoreCase("BarChart3D")) {
            // 创建bar图的数据集方法
            DefaultCategoryDataset data = ChartTools.getCategoryDataset();
            // PlotOrientation.HORIZONTAL这个参数说明是水平还是垂直方向VERTICAL
            chart = ChartFactory.createBarChart3D("这是BarChart3D", "数量", "地点",
                    data, PlotOrientation.VERTICAL, true, false, false);
        } else if (chartType.equalsIgnoreCase("LineChart")) {
            // 创建线图
            DefaultCategoryDataset data = ChartTools.getCategoryDataset();
            chart = ChartFactory.createLineChart("这是LineChart", "数量", "地点",
                    data, PlotOrientation.VERTICAL, true, false, false);
        } else if (chartType.equalsIgnoreCase("AreaChart")) {
            // 创建区域形图
            DefaultCategoryDataset data = ChartTools.getCategoryDataset();
            chart = ChartFactory.createAreaChart("这是AreaChart", "数量", "地点",
                    data, PlotOrientation.VERTICAL, true, false, false);
        } else if (chartType.equalsIgnoreCase("WaterfallChart")) {
            // 搞不明白这是什么图:(
            DefaultCategoryDataset data = ChartTools.getCategoryDataset();
            chart = ChartFactory.createWaterfallChart("这是WaterfallChart", "数量",
                    "地点", data, PlotOrientation.VERTICAL, true, false, false);
        } else if (chartType.equalsIgnoreCase("Thermometer")) {
            // 整个温度计。。。。。。。。。。
            // 数据集,初始值为0
            DefaultValueDataset valuedataset = new DefaultValueDataset(0);
            // 创建漫度计的Plot对象
            ThermometerPlot thermometerplot = new ThermometerPlot(valuedataset);
            chart = new JFreeChart("设备温度", JFreeChart.DEFAULT_TITLE_FONT,
                    thermometerplot, false);
            thermometerplot.setThermometerStroke(new BasicStroke(2.0F));
            // 图表的轮廓颜色
            thermometerplot.setThermometerPaint(Color.BLUE);
            thermometerplot.setOutlinePaint(null);
            // 图表计数单位
            thermometerplot.setUnits(10);
            // 数值范围
            thermometerplot.setRange(-40, 40);
            thermometerplot.setForegroundAlpha(1f);
            // 图表的当前值
            valuedataset.setValue(20);
        } else if (chartType.equalsIgnoreCase("MeterChart")) {
            // 整个仪表盘
            // 数据集,初始值为30
            DefaultValueDataset valuedataset = new DefaultValueDataset(30);
            // 创建Plot对象
            MeterPlot meterplot = new MeterPlot(valuedataset);
            chart = new JFreeChart("当前流量速度", JFreeChart.DEFAULT_TITLE_FONT,
                    meterplot, false);
            // 表盘上显示的数据单位说明
            meterplot.setUnits("条/秒)");
            // 表盘分害的单位,即30为一格
            meterplot.setTickSize(30);
            // 显示数据范围,0~600
            meterplot.setRange(new Range(0, 600));
            // 图表的当前值
            valuedataset.setValue(100);
        }
        if (null != chart) {
            // 将图片对象输出到客户端
            java.io.OutputStream ous = response.getOutputStream();
            ChartUtilities.writeChartAsJPEG(ous, chart, 500, 300);
            // 使用这样的代码输出可能会出错!
            // ChartUtilities.writeChartAsJPEG(ous,100,chart,500,300,null);
            ous.flush();
            ous.close();
        }
    }
}

 

页面代码如下:

 

<%@page contentType="text/html" pageEncoding="utf-8"%> 
<title>jFreeChart图表测试 @NetJava.cn</title> 
<br>请选择要生成的图表类型: 
<hr> 
    <select id="scType" οnchange="loadChartBySelectType(this)"> 
        <option value="1">请选择一种图表</option> 
        <option value="PieChart3D">PieChart3D</option> 
        <option value="PieChart">PieChart</option> 
        <option value="BarChart3D">BarChart3D</option> 
        <option value="LineChart">LineChart</option> 
        <option value="RingChart">RingChart</option> 
        <option value="AreaChart">AreaChart</option> 
        <option value="WaterfallChart">WaterfallChart</option> 
        <option value="Thermometer">Thermometer</option> 
        <option value="MeterChart">MeterChart</option> 
    </select> 
<hr> 
 
<div id="displayChart" /> 
 
<script type="text/javascript"> 
    /**选择jf图表类型时,载入图片*/ 
    function loadChartBySelectType(sua) { 
        var cType=sua.value; 
        if(cType=="1"){ 
        return ; 
    } 
    var disabledImageZone=document.getElementById("displayChart"); 
     //这样多简单,清理div中己有的东东:) 
     disabledImageZone.innerHTML=""; 
    var imageZone = document.createElement('img'); 
    imageZone.setAttribute('id','imageZone'); 
    //提取服务器上的图片显示下来: 
    imageZone.setAttribute('src',"chartServlet?chartType="+cType); 
    disabledImageZone.appendChild(imageZone); 

</script>

 

另:

如果遇到如下错误

  1. WARN(SimpleSaxErrorHandler.java: 45 );XmlBeanDefinitionReader: 45  - Ignored XML validation warning: URI was not reported to parser  for  entity [document]  
  2. org.xml.sax.SAXParseException: URI was not reported to parser for  entity [document]  
  3.     at gnu.xml.aelfred2.SAXDriver.warn(SAXDriver.java:934 );  
  4.     at gnu.xml.aelfred2.SAXDriver.startExternalEntity(SAXDriver.java:631 );  
  5.     at gnu.xml.aelfred2.XmlParser.pushURL(XmlParser.java:3358 );  
  6.     at gnu.xml.aelfred2.XmlParser.doParse(XmlParser.java:159 );  
  7.     at gnu.xml.aelfred2.SAXDriver.parse(SAXDriver.java:320 );  
  8.     at gnu.xml.aelfred2.XmlReader.parse(XmlReader.java:294 );  
  9.     at gnu.xml.dom.JAXPFactory$JAXPBuilder.parse(JAXPFactory.java:186 );
  10. ……

 

  1. WARN(SimpleSaxErrorHandler.java:45 );XmlBeanDefinitionReader: 45  - Ignored XML validation warning: No base URI; hope URI is absolute: http: //www.springframework.org/dtd/spring-beans.dtd   
  2. org.xml.sax.SAXParseException: No base URI; hope URI is absolute: http://www.springframework.org/dtd/spring-beans.dtd   
  3.     at gnu.xml.aelfred2.SAXDriver.warn(SAXDriver.java:934 );  
  4.     at gnu.xml.aelfred2.XmlParser.readExternalIds(XmlParser.java:2399 );  
  5.     at gnu.xml.aelfred2.XmlParser.parseDoctypedecl(XmlParser.java:804 );  
  6.     at gnu.xml.aelfred2.XmlParser.parseProlog(XmlParser.java:522 );  
  7.     at gnu.xml.aelfred2.XmlParser.parseDocument(XmlParser.java:414 );  
  8.     at gnu.xml.aelfred2.XmlParser.doParse(XmlParser.java:167 );  
  9.     at gnu.xml.aelfred2.SAXDriver.parse(SAXDriver.java:320 );  
  10.     at gnu.xml.aelfred2.XmlReader.parse(XmlReader.java:294 );  
  11.     at gnu.xml.dom.JAXPFactory$JAXPBuilder.parse(JAXPFactory.java:186 ); 

说明JFreeChart和spring有冲突,去掉JFreeChart的gnujaxp.jar就好了

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值