我想用jsp连接oracle数据库后取得数据,然后将数据通过当前jsp传给一个java文件,这个java文件实现jfreechart的   画图功能,再将图显示到jsp当前的调用界面上
和数据库中数据到底是怎么对应生成图表的
好难哦~
给贴几个测试通过的例子参考呗
先谢拉~

解决方案 »

  1.   

    第1步,连接数据库,得到ResultSet第2步,从ResultSet得到CategoryDataset
     DefaultCategoryDataset dataset=new DefaultCategoryDataset();JfreeChart也提供了直接从Datasource/Connection中获得Dataset的JDBCDataset第3步,从Dateset中创建Chart最后一步,导出图片到WEB
      

  2.   

    步骤我知道
    就是数据的对应
    不如一个水果产量的表
      \ 名称  苹果      香蕉       梨        橘子      西瓜   ........等等
                  
        产量  300kg   100kg     200kg    400kg    1000kg  .........
    横轴自动取名称生成   纵轴取产量  并和横轴的名称对应好
    都是 动态的 取得数据并对应
    这个问题怎么解决?
      

  3.   

    给你个通过的实例,比较简单。
    java:package com.kettas.xiezq;import java.awt.BasicStroke;
    import java.awt.Color;
    import java.awt.Font;
    import java.io.PrintWriter;
    import java.text.DecimalFormat;
    import java.text.NumberFormat;import javax.servlet.http.HttpSession;import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartRenderingInfo;
    import org.jfree.chart.ChartUtilities;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.entity.StandardEntityCollection;
    import org.jfree.chart.labels.PieToolTipGenerator;
    import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
    import org.jfree.chart.labels.StandardPieToolTipGenerator;
    import org.jfree.chart.plot.PiePlot;
    import org.jfree.chart.servlet.ServletUtilities;
    import org.jfree.chart.title.TextTitle;
    import org.jfree.chart.urls.StandardPieURLGenerator;
    import org.jfree.data.general.DefaultPieDataset;
    import org.jfree.ui.RectangleInsets;public class PieDemo { private DefaultPieDataset dataset=new DefaultPieDataset();
    public void setValue(String key,double value){
    dataset.setValue(key,value);
    }
    public String generatePieDemo(String title,HttpSession session,PrintWriter pw){
    String filename=null;
    try{

    JFreeChart chart=ChartFactory.createPieChart("饼形图",
    dataset,
    true,
    false,
    false);
    chart.setBackgroundPaint(Color.red);
    Font font=new Font("黑体",Font.CENTER_BASELINE,16);
    TextTitle _title=new TextTitle(title);
    _title.setFont(font);
    chart.setTitle(_title);

    PiePlot plot=(PiePlot) chart.getPlot();
    plot.setBackgroundPaint(Color.blue);
    RectangleInsets insets=new RectangleInsets(5,5,5,5);
    plot.setInsets(insets);

    plot.setURLGenerator(new StandardPieURLGenerator("link.jsp","section"));
    plot.setSectionPaint(PiePlot.DEFAULT_LABEL_BACKGROUND_PAINT);
    //指定section轮廓线的颜色
       // plot.setDefaultOutlinePaint(Color.green);
    //
        plot.setExplodePercent(2,0.1);
        plot.setStartAngle(270);
        
        plot.setToolTipGenerator(new StandardPieToolTipGenerator());   
    /*

        
     JFreeChart chart = ChartFactory.createPieChart(
                "Pie Chart Demo 1",  // 图表标题
                   dataset,             // 数据集
                true,               // 是否为一个图例
                true,               //是否使用工具条,工具条就是将鼠标移动到图表不同部分后,出现的一个小提示框
                false               //图片是否有URL连接
               );          
            //生成PiePlot
               PiePlot plot = (PiePlot) chart.getPlot();
               plot.setSectionOutlinesVisible(false);                                      //是否显示分界线
               plot.setLabelFont(new Font("SansSerif", Font.PLAIN, 12));         //Label的字体
               plot.setNoDataMessage("No data available");          //如果没有数据该如何显示
               plot.setCircular(false);                                          //是否为正圆
               plot.setLabelGap(0.02);                                        //这个不太清楚,应该是设置椭圆内部的间距,如果改的很大的话图形会变得很奇怪。。
               plot.setForegroundAlpha(Float.parseFloat("0.4"));    //图片前景的透明度,图片的前景就是这里的饼状图,透明度为0.0~1.0
               plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}: ({1}M, {2})",
                                                NumberFormat.getNumberInstance(),
                                             new DecimalFormat("0.00%")));     //设置图片是否显示出百分比,0是数据,1是数值,2是百分比,
                                                                                               //后面两个参数是设置百分比取值到小数点几位,这里取到小数点后两位,如果百分比要设置为整数,就将这两个参数去掉即可
               plot.setToolTipGenerator((PieToolTipGenerator) new StandardPieSectionLabelGenerator("{0}: ({1}M, {2})",
                                                NumberFormat.getNumberInstance(),
                                             new DecimalFormat("0.00%")));     //设置工具条是否显示出百分比,其它同上,其它同上
        */
        //吧生成的图片放到指定目录
        ChartRenderingInfo info=new ChartRenderingInfo(new StandardEntityCollection());
        
        filename=ServletUtilities.saveChartAsPNG(chart,500,300,info,session);
        ChartUtilities.writeImageMap(pw,filename,info,true);
        pw.flush();
    }catch(Exception e){
    System.out.println("Exception"+e.toString());
    }

    return filename;
    }
    }
    jsp:
    <%@ page contentType="text/html;charset=GBK"%>
    <%@ page import = "java.io.PrintWriter" %>
    <%@ page import="com.kettas.xiezq.PieDemo"%>
    <%@ page import="java.sql.*"%><%!int sa1=0;%> 
    <%!int sa2=1;%>
    <%!int sa3=1;%>

    <%
        Class.forName("com.mysql.jdbc.Driver");
    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/xiezq","root","xiemoran");
    Statement stmt = conn.createStatement();

    String sql6="select salary from student where name='li'";
    String sql7 ="select salary from student where name='liukai'";
    String sql8 ="select salary from student where name='zhangchi'";
    ResultSet rs6 = stmt.executeQuery(sql6);
        while(rs6.next()){
    sa1=rs6.getInt("salary");
    }



    ResultSet rs7 = stmt.executeQuery(sql7);
    while(rs7.next()){
    sa2 =rs7.getInt("salary");
    }

     ResultSet rs8 = stmt.executeQuery(sql8);
    while(rs8.next()){
    sa3 =rs8.getInt("salary");
    }


    out.println(sa1);
    out.println(sa2);
    out.println(sa3);
    PieDemo chart = new PieDemo();
    chart.setValue("六月",sa1);
    chart.setValue("七月",sa2);
    chart.setValue("八月",sa3);String filename = chart.generatePieDemo("Pie Chart Demo 1", session, new PrintWriter(out));
    String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename;
    %>
    <HTML>
    <HEAD>
    <TITLE>www.sentom.net</TITLE>
    </HEAD>
    <BODY>
    <P ALIGN="CENTER">
    <img src="<%= graphURL %>" width=500 height=300 border=0 usemap="#<%= filename %>">
    </P>
    </BODY>
    </HTML>其中我用的jfreechart的两个包为jfreechart-1.0.9。jar,jcommen-1.0.2.jar.
    在web.xml中添加如下配置:
    <servlet-name>DisplayChart</servlet-name>
         <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DisplayChart</servlet-name>
    <url-pattern>/servlet/DisplayChart</url-pattern>
    </servlet-mapping>我用的是mysql数据库,你把驱动和url,name,password改成你的oracle数据库就可以应用了。
      

  4.   

    对了,表结构如下:
      id    name     address    salary
      1     xie       beijing    300
      2    zhangchi   ..         ...
      3   总之你自己建个简单的测试表就可以了。
      

  5.   

    package com.cn;import java.awt.Color;
    import java.awt.RenderingHints;
    import java.io.*;import javax.servlet.http.HttpSession;import org.jfree.data.category.CategoryDataset;
    import org.jfree.data.category.DefaultCategoryDataset;
    import org.jfree.data.general.DefaultPieDataset;
    import org.jfree.data.general.PieDataset;
    import org.jfree.chart.*;
    import org.jfree.chart.entity.StandardEntityCollection;
    import org.jfree.chart.plot.*;
    import org.jfree.chart.servlet.ServletUtilities;
    public class BarChartDemo {

    /**
     * 饼状图
     */
    public static String generatePieChart(HttpSession session, PrintWriter pw,int w, int h){
    String filename = null;
    PieDataset dataset = getDataSet();
    JFreeChart chart = ChartFactory.createPieChart3D(
    "水果产量图", // 图表标题
    dataset, // 数据集
    true,  // 是否显示图例
    false,  // 是否生成工具
    false  // 是否生成URL链接
    );
    chart.setBackgroundPaint(Color.pink);
    try {
    /*------得到chart的保存路径----*/
    ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
    filename = ServletUtilities.saveChartAsPNG(chart, w, h, info,session);
    /*------使用printWriter将文件写出----*/
    ChartUtilities.writeImageMap(pw, filename, info, true);
    pw.flush();
    } catch (IOException e) {
    e.printStackTrace();
    }
    return filename;
    }


    /**
     * 柱状图
     */
    public static String generateBarChart(HttpSession session, PrintWriter pw,int w, int h){
    String filename = null;
    CategoryDataset dataset = getDataSet2();
    JFreeChart chart = ChartFactory.createBarChart3D(
    "水果产量图", // 图表标题
    "水果", // 目录轴的显示标签
    "产量", // 数值轴的显示标签
    dataset, // 数据集
    PlotOrientation.VERTICAL, // 图表方向:水平、垂直
    true,  // 是否显示图例(对于简单的柱状图必须是false)
    false,  // 是否生成工具
    false  // 是否生成URL链接
    );
    try {
    /*------得到chart的保存路径----*/
    ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
    filename = ServletUtilities.saveChartAsPNG(chart, w, h, info,session);
    /*------使用printWriter将文件写出----*/
    ChartUtilities.writeImageMap(pw, filename, info, true);
    pw.flush();
    } catch (IOException e) {
    // TODO 自动生成 catch 块
    e.printStackTrace();
    }
    return filename;
    }

    /**
     * 折线图
     */
    public static String generateLineChart(HttpSession session, PrintWriter pw,int w, int h){
    String filename = null;
    CategoryDataset dataset = getDataSet3();
    JFreeChart chart = ChartFactory.createLineChart(
    "水果产量图", // 图表标题
    "水果", // 目录轴的显示标签
    "产量", // 数值轴的显示标签
    dataset, // 数据集
    PlotOrientation.VERTICAL, // 图表方向:水平、垂直
    true,  // 是否显示图例(对于简单的柱状图必须是false)
    false,  // 是否生成工具
    false  // 是否生成URL链接
    );

    /*----------设置消除字体的锯齿渲染(解决中文问题)--------------*/
    chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,
    RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);

    /*------------配置图表属性--------------*/
    // 1,设置整个图表背景颜色
    chart.setBackgroundPaint(Color.pink);

    /*------------设定Plot参数-------------*/
    CategoryPlot plot = chart.getCategoryPlot();
    // 2,设置详细图表的显示细节部分的背景颜色
    //plot.setBackgroundPaint(Color.PINK);
    // 3,设置垂直网格线颜色
    plot.setDomainGridlinePaint(Color.black);
    //4,设置是否显示垂直网格线
    plot.setDomainGridlinesVisible(true);
    //5,设置水平网格线颜色
    plot.setRangeGridlinePaint(Color.blue);
    //6,设置是否显示水平网格线
    plot.setRangeGridlinesVisible(true);

    try {
    /*------得到chart的保存路径----*/
    ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
    filename = ServletUtilities.saveChartAsPNG(chart, w, h, info,session);
    /*------使用printWriter将文件写出----*/
    ChartUtilities.writeImageMap(pw, filename, info, true);
    pw.flush();
    } catch (IOException e) {
    // TODO 自动生成 catch 块
    e.printStackTrace();
    }
    return filename;
    }

    /**
     * 在本地生成图片文件
     */
    public static void ganarateFruitChart(){
    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);
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    } finally {
    try {
    fos_jpg.close();
    } catch (Exception e) {}
    }
    }


    /**
     * 获取一个饼状图的简单数据集对象
     * @return
     */
    private static PieDataset getDataSet() {
    DefaultPieDataset dataset = new DefaultPieDataset();
    dataset.setValue("苹果", 100);
    dataset.setValue("梨子", 200);
    dataset.setValue("葡萄", 300);
    dataset.setValue("香蕉", 400);
    dataset.setValue("荔枝", 500);
    return dataset;
    }


    /**
     * 获取一个柱状图数据集对象
     * @return
     */
    private static CategoryDataset getDataSet2() {
    DefaultCategoryDataset dataset = new DefaultCategoryDataset();
    dataset.addValue(100, "北京", "苹果");
    dataset.addValue(500, "北京", "荔枝");
    dataset.addValue(400, "北京", "香蕉");
    dataset.addValue(200, "北京", "梨子");
    dataset.addValue(300, "北京", "葡萄");
    dataset.addValue(500, "上海", "葡萄");
    dataset.addValue(600, "上海", "梨子");
    dataset.addValue(400, "上海", "香蕉");
    dataset.addValue(700, "上海", "苹果");
    dataset.addValue(300, "上海", "荔枝");
    dataset.addValue(300, "广州", "苹果");
    dataset.addValue(200, "广州", "梨子");
    dataset.addValue(500, "广州", "香蕉");
    dataset.addValue(400, "广州", "葡萄");
    dataset.addValue(700, "广州", "荔枝");
    return dataset;
    }

    /**
     * 获取一个折线图数据集对象
     * @return
     */
    private static CategoryDataset getDataSet3() {
    DefaultCategoryDataset dataset = new DefaultCategoryDataset();
    dataset.addValue(100, "北京", "一月");
    dataset.addValue(200, "北京", "二月");
    dataset.addValue(100, "北京", "三月");
    dataset.addValue(400, "北京", "四月");
    dataset.addValue(300, "北京", "五月");
    dataset.addValue(500, "北京", "六月");
    dataset.addValue(90, "北京", "七月");
    dataset.addValue(700, "北京", "八月");
    dataset.addValue(800, "北京", "九月");
    dataset.addValue(1000, "北京", "十月");
    dataset.addValue(300, "北京", "十一月");
    dataset.addValue(700, "北京", "十二月");
    dataset.addValue(1200, "上海", "一月");
    dataset.addValue(1100, "上海", "二月");
    dataset.addValue(1000, "上海", "三月");
    dataset.addValue(900, "上海", "四月");
    dataset.addValue(800, "上海", "五月");
    dataset.addValue(700, "上海", "六月");
    dataset.addValue(600, "上海", "七月");
    dataset.addValue(500, "上海", "八月");
    dataset.addValue(400, "上海", "九月");
    dataset.addValue(300, "上海", "十月");
    dataset.addValue(200, "上海", "十一月");
    dataset.addValue(100, "上海", "十二月");
    dataset.addValue(600, "武汉", "一月");
    dataset.addValue(500, "武汉", "二月");
    dataset.addValue(400, "武汉", "三月");
    dataset.addValue(300, "武汉", "四月");
    dataset.addValue(200, "武汉", "五月");
    dataset.addValue(100, "武汉", "六月");
    dataset.addValue(200, "武汉", "七月");
    dataset.addValue(300, "武汉", "八月");
    dataset.addValue(400, "武汉", "九月");
    dataset.addValue(500, "武汉", "十月");
    dataset.addValue(600, "武汉", "十一月");
    dataset.addValue(700, "武汉", "十二月");
    return dataset;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
    ganarateFruitChart();
    }
    }这是一个很好的实例你只需要把获取数据集的方法getDataSet改成你自己从数据库里取数据的就可以了。
      

  6.   

    对了要显示到页面上的话这样调用
    <%@ page contentType="text/html;charset=GBK"%>
    <%@ page import="java.io.PrintWriter"%>
    <jsp:directive.page import="com.cn.BarChartDemo"/>
    <html>
    <head>
    <title>
    </title>
    <%
    //饼状图
    String fileNamePie=BarChartDemo.generatePieChart(session,new PrintWriter(out),580,250);
    String graphURLPie = request.getContextPath() + "/servlet/DisplayChart?filename=" + fileNamePie;
    //饼状图
    String fileNameBar=BarChartDemo.generateBarChart(session,new PrintWriter(out),580,250);
    String graphURLBar = request.getContextPath() + "/servlet/DisplayChart?filename=" + fileNameBar;
    //折线图
    String fileNameLine=BarChartDemo.generateLineChart(session,new PrintWriter(out),580,250);
    String graphURLLine = request.getContextPath() + "/servlet/DisplayChart?filename=" + fileNameLine;
    %>
    </head>
    <body bgcolor="#ffffff">
    <table align="center" width="580" border="0" cellspacing="0" cellpadding="0">
     <tr>
        <td>
          <img src="<%= graphURLPie %>"width=580 height=250 border=0 >
        </td>
     </tr>
     <tr>
        <td>
          <img src="<%= graphURLBar %>"width=580 height=250 border=0 >
        </td>
     </tr>
     <tr>
        <td>
          <img src="<%= graphURLLine %>"width=580 height=250 border=0 >
        </td>
     </tr>
    </table>
    </body>
    </html>
    配置文件web.xml配置一下
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <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>/servlet/DisplayChart</url-pattern>
    </servlet-mapping> <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    </web-app>
    我每次需要用到时都用这个实例,所以是保证可以的
      

  7.   

    7L的这是一个很好的实例你只需要把获取数据集的方法getDataSet改成你自己从数据库里取数据的就可以了,
    这个要怎么改啊…谁懂啊