想用jfreechart 做一个实时更新仪表盘图,不知道如何入手。静态的仪表盘图没有什么问题。向请教下各位给指点思路,谢谢。顺便问下,我如何将jfreechart生成的图标以流的形式输出到前台,目前我所实现的是生成图片,之后JSP通过访问图片路径来显示的,这样觉如果做实时更新成功的话会生成很多图片,这问题就大了。麻烦知道的,做过的告诉下,最好 有个小小的例子,谢谢。

解决方案 »

  1.   

    jfreechart提供了一个实现了HttpSessionBindingListener的类ChartDeleter,
    里面有个valueUnbound方法,这个方法是在session执行remove的时候被自动执行,
    所以我们只需要在页面刚进入的时候调用
    session.removeAttribute("JFreeChart_Deleter");这样会删除当前session之前生成的图表。还有一种方法是用流输出的方式,直接,即:
    注释掉上面的try中的代码,加入如下代码
    ChartUtilities.writeChartAsJPEG(response.getOutputStream(),chart,500,300);
    然后在显示页面引入该jsp或者servlet
        <img src="<%=request.getContextPath()%>/servlet">
      

  2.   

    创建柱状图 
    1 引入jFreechart的包 
    jcommon-1.0.15.jar
    jfreechart-1.0.12.jar
    jfreechart-1.0.12-experimental.jar2 在web.xml中加入 
        <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>
    3 在jsp或者servlet或者action中写 
         // 创建一个柱状图
        DefaultCategoryDataset dataSet = new DefaultCategoryDataset();
        // 数据装入
        for(int i=0;i<list.size();i++)
        {
            Item item =(Item)list.get(i);
            dataSet.setValue(Item.getRating(), "testName", Item.getTime());
        }
        JFreeChart chart = ChartFactory.createBarChart("统计图","ratings", "time", dataSet, PlotOrientation.VERTICAL,false, true, false);
        try{
            String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, session);
            String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename;
            request.setAttribute("graphURL",graphURL);    } catch (Exception e){
        }
    4 在页面引入 
        <img src="<%= request.getAttribute("graphURL") %>">
    这种方式会生成临时图片文件,默认是不对其进行清理的,所以要手工进行处理
    对于临时文件的清除,jfreechart提供了一个实现了HttpSessionBindingListener的类ChartDeleter,
    里面有个valueUnbound方法,这个方法是在session执行remove的时候被自动执行,
    所以我们只需要在页面刚进入的时候调用
    session.removeAttribute("JFreeChart_Deleter");这样会删除当前session之前生成的图表。还有一种方法是用流输出的方式,直接,即:
    注释掉上面的try中的代码,加入如下代码
    ChartUtilities.writeChartAsJPEG(response.getOutputStream(),chart,500,300);
    然后在显示页面引入该jsp或者servlet
        <img src="<%=request.getContextPath()%>/servlet">