【问题标题】:display jfreecharts using servlets使用 servlet 显示 jfreecharts
【发布时间】:2011-09-27 21:01:21
【问题描述】:

我有一个场景,我需要显示图表(使用 jfreecharts 生成)将其转换为 png 图像,然后使用 servlet 显示它们。

当图表代码扩展 ApplicationFrame 或 Jframe 时,我在使用 servlet 显示它时看到以下异常:

java.awt.HeadlessException: 没有设置 X11 DISPLAY 变量,但该程序执行了需要它的操作。 在 java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:159) 在 java.awt.Window.(Window.java:317) 在 java.awt.Frame.(Frame.java:419) 在 javax.swing.JFrame.(JFrame.java:194)

我阅读了几个地方,这似乎是因为 ApplicationFrame 和 JFrame 会导致此错误。

如果我只传递图表对象,则会抛出一个

java.lang.IllegalArgumentException:空“图表”参数。 org.jfree.chart.ChartUtilities.writeChartAsPNG(ChartUtilities.java:181) org.jfree.chart.ChartUtilities.writeChartAsPNG(ChartUtilities.java:136)

有什么解决办法吗?

【问题讨论】:

    标签: java servlets jfreechart


    【解决方案1】:

    ChartUtilities是正确的选择;也支持流。一种方法需要Using Headless Mode in the Java SE Platform,但我也让它与 VNC 一起使用。

    附录:这是一个相关论坛thread

    【讨论】:

    • 感谢您提供的这些信息,我至少能够超越这个例外,转移到另一个例外
    • 不客气;如有需要,请随时提出新问题。
    • 很抱歉重新打开它,但即使在将属性 java.awt.headless 设置为 true 之后,我仍然再次看到此异常。还有更多线索或想法吗?
    • 我记得必须在 servlet 容器的配置文件之一中设置属性。你用的是哪个容器?
    • 我尝试在 java servlet 代码中设置它 System.setProperty("java.awt.headless", "true");你认为如果我在 catalina.sh 文件中设置它会更好吗?
    【解决方案2】:

    我会以简单的方式向您解释,因为我遇到了与新手一样的问题。

    步骤

    1. 创建一个小服务程序
    2. 在 doPost 中创建输出流
    3. 将内容类型设置为 text/png
    4. 创建数据集
    5. 为数据集设置值
    6. 使用 ChartFqactory 创建 jfreechart 实例并调用 createchart(您要使用的图表)。
    7. 最后使用 ChartUtilities 调用 WriteChartAsPNG 并传递 Jfreechart 实例、输出流、宽度、高度。

    完成:

    下面的示例

     package polo;
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartUtilities;
    import org.jfree.chart.JFreeChart;
    import org.jfree.data.general.DefaultPieDataset;
    
    
    /**
     * Servlet implementation class PieChartDemo1Serv
     */
    public class PieServ extends HttpServlet implements useme {
        private static final long serialVersionUID = 1L;
    
        /**
         * @see HttpServlet#HttpServlet()
         */
        public PieServ() {
            super();
            // TODO Auto-generated constructor stub
        }
    
        /**
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
        doPost(request, response);
        }
    
        /**
         * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
    
            response.setContentType("image/png");   
    
            ServletOutputStream out = response.getOutputStream();
    
            DefaultPieDataset pieDataset = new DefaultPieDataset();
    
            pieDataset.setValue("In-Network ", .80);
    
            pieDataset.setValue("Out-of-Network ", .20);
    
    
    
            JFreeChart chart = ChartFactory.createPieChart("", pieDataset, true, true, false);
    
    ChartUtilities.writeChartAsPNG(out, chart, 202, 182);
        System.out.println("done23");
    
        }
    
    
    }
    

    现在我知道你还有什么。研究 Pieplots/Legends 来设置边框和格式。你可以做更多的事情。

    【讨论】:

      猜你喜欢
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 2012-07-07
      • 2013-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多