2.JSP页面中:
<%
  String filename = WebChart.generateBarChart( session, new PrintWriter(out) );
  String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename;
  System.out.println( graphURL );
  WebDataSet webdataset = new WebDataSet();
  ArrayList dateList = webdataset.getData();
%>
<img src="<%= graphURL %>" width=500 height=300 border=0 usemap="#<%= filename %>">
我以前也没有这样写过.不知会不会出现你的第二个问题中所出面的情况.你可以试试.
我以前是用的这种方式(在Struts中):
<html:img page="/barChartAction.do"/>
因为我这种方式并不生成什么文件.而是直接在页面上输出.

解决方案 »

  1.   

    jerrywh() 兄:
         能不能具体说说你代码的思路,我有点不太懂我现在页面上是调用类完成chart的生成,然后再在当前页下显示它,就出现我所说的问题了!
      

  2.   

    2.JSP页面中:
    <%
      String filename = WebChart.generateBarChart( session, new PrintWriter(out) );
      String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename;
      System.out.println( graphURL );
      WebDataSet webdataset = new WebDataSet();
      ArrayList dateList = webdataset.getData();
    %>
    -------------------------------------------------------------------------------
    这样写生成一个图片文件,在服务器的临时文件夹下面。to:搂主,你每次都生成文件名相同,就会出错。例如第一次生成a.jpg,第二次要生成a.jpg的时候,这个文件已经存在了。jfreechart就会出错。建议你,每次生成的时候先判断文件是否存在,如果存在就删除,重新生成。第一个问题,我帮你看看,现在想不起来了
      

  3.   

    struts中是(以柱状图为例):
    Action:
    public class BarChartAction extends Action {
      private static final String CONTENT_TYPE = "image/jpeg";
      public ActionForward execute(ActionMapping mapping,
                                   ActionForm form,
                                   HttpServletRequest request,
                                   HttpServletResponse response) {
        response.setContentType( CONTENT_TYPE );
        BarDataSet dataset = new BarDataSet();
        ArrayList list = dataset.getData();    if( list.size() == 0 ){
          System.out.println( "&#65411;&#65403;&#65427;&#65424;&#65418;&#63729;&#65406;&#65437;." );
        }    Iterator iter = list.listIterator();
        DefaultCategoryDataset chartdataset = new DefaultCategoryDataset();
        while( iter.hasNext() ){
          BarChart bc = (BarChart)iter.next();
          chartdataset.addValue( new Long(bc.getHsAnnuity()), null, bc.getColumnName() );
        }    CategoryAxis categoryAxis = new CategoryAxis("");
        ValueAxis valueAxis = new NumberAxis("");
        BarRenderer renderer = new BarRenderer();
        renderer.setItemURLGenerator( new StandardCategoryURLGenerator( "xy_chart.jsp", "series", "section" ) );
        renderer.setToolTipGenerator( new StandardCategoryToolTipGenerator() );    Plot plot = new CategoryPlot( chartdataset, categoryAxis, valueAxis, renderer );
        JFreeChart chart = new JFreeChart( "60&#65419;&#12539;&#65422;&#65397;&#65412;&#65402;愷&#12539;&#12539;, JFreeChart.DEFAULT_TITLE_FONT, plot, false );
        chart.setBackgroundPaint( java.awt.Color.white );    ChartRenderingInfo info = new ChartRenderingInfo( new StandardEntityCollection() );    try {
          ChartUtilities.writeChartAsJPEG(response.getOutputStream(), 100, chart,
                                          600, 400);
        }
        catch (IOException ex) {
          ex.printStackTrace();
        }    return null;
      }
    }
    bean:
    package com.fanchina.jfree.bean;public class BarChart {
      private String columnName;
      private long hsAnnuity;  public BarChart( String columnName, long hsAnnuity ){
        this.columnName = columnName;
        this.hsAnnuity = hsAnnuity;
      }  public void setColumnName( String columnName ){
        this.columnName = columnName;
      }  public void setHsAnnuity( long hsAnnuity ){
        this.hsAnnuity = hsAnnuity;
      }  public String getColumnName(){
        return this.columnName;
      }  public long getHsAnnuity(){
        return this.hsAnnuity;
      }
    }
    setBean(这个类主要是从数据库中取数据,这里为了简单就这样了)
    public class BarDataSet {
      private ArrayList data = new ArrayList();  public BarDataSet() {/*
        data.add(new BarChart( "60", 101923 ) );
        data.add(new BarChart( "61", 113125 ) );
        data.add(new BarChart( "62", 122148 ) );
        data.add(new BarChart( "63", 117434 ) );
        data.add(new BarChart( "64", 133256 ) );
        data.add(new BarChart( "65", 157654 ) );
        data.add(new BarChart( "66", 195356 ) );
        data.add(new BarChart( "67", 122567 ) );
        data.add(new BarChart( "68", 146343 ) );
        data.add(new BarChart( "69", 184558 ) );*/
        data.add( 0, new IeFor60_Bean( 250, 60, 50, 0, 0, 60, 40, 0 ) );
        data.add( 1, new IeFor60_Bean( 260, 60, 50, 0, 0, 60, 40, 0 ) );
        data.add( 2, new IeFor60_Bean( 270, 60, 50, 0, 0, 60, 40, 0 ) );
        data.add( 3, new IeFor60_Bean( 280, 60, 50, 0, 40, 60, 40, 0 ) );
        data.add( 4, new IeFor60_Bean( 290, 60, 50, 0, 40, 60, 40, 0 ) );
        data.add( 5, new IeFor60_Bean( 300, 60, 0, 130, 0, 0, 40, 0 ) );
        data.add( 6, new IeFor60_Bean( 310, 60, 0, 145, 0, 0, 40, 0 ) );
        data.add( 7, new IeFor60_Bean( 320, 60, 0, 150, 0, 0, 40, 0 ) );
        data.add( 8, new IeFor60_Bean( 330, 60, 0, 155, 0, 0, 40, 0 ) );
        data.add( 9, new IeFor60_Bean( 340, 60, 0, 160, 0, 0, 40, 0 ) );
        data.add( 10, new IeFor60_Bean( 350, 60, 0, 165, 0, 0, 40, 0 ) );
      }  public ArrayList getData(){
        return this.data;
      }}
    最后JSP:
    <%@ page contentType="text/html; charset=GB2312" %>
    <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
    <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
    <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
    <html>
    <head>
    <title>
    bar_chart
    </title>
    </head>
    <body bgcolor="#ffffff">
    <h1>
    JBuilder Generated JSP
    </h1>
    <p>
    <html:img page="/barChartAction.jspx"/>
    </body>
    </html>
      

  4.   

    up
    我用的是ChartDirector这个好用
      

  5.   

    怎么会有乱码?不好意思:)
    思路大概是(我也好长时间没碰了:))
    JSP中通过这句话来调用Action<html:img page="/barChartAction.jspx"/>
    然后Action就从DB类用取得数据,在放到bean中,做jfreechart的设置.这样就可以生成图了.也就是把Action变成了图片。因为Action中有这样的设置:private static final String CONTENT_TYPE = "image/jpeg";那么它现在已经不是"text/html"了。
    你可以看到Action最后返回的是null。在Struts-config.xml中的配置也很简单:
    <action type="action.BarChartAction" path="/barChartAction" />就可以了。这个例子在servlet中也可以实现。只不过是把Action改成servlet而已。
      

  6.   

    jerrywh() :
        惭愧啊,以前没用过struts,看来我得先找点struts的书看看才行,
        能简单指点一下struts吗?