如何在Stripes Framework的Web浏览器中显示JFreeChart

rob*_*bie 4 java stripes web-applications jfreechart

情况就是这样:我的'metrics.jsp'页面提交了一些创建图表所需的变量.'ProjectActionBean.java'调用了一些创建JFreeChart的其他java类.我可以在弹出窗口中显示图表,但我希望它显示在原始浏览器窗口中.

JFreeChart placeChart = ChartFactory.createBarChart(
                                    "ChartName",
                "",             //x-axis label
                "",             //y-axis label
                dataset,
                PlotOrientation.VERTICAL,
                false,          //legend
                true,           //tooltype
                false);         //generate urls
        ChartFrame frame = new ChartFrame(name, placeChart);
        frame.pack();
        frame.setVisible(true);
Run Code Online (Sandbox Code Playgroud)

Car*_*icz 5

我写了这样的应用程序,所以我可以向你保证这是可行的:)

首先,你需要摆脱任何GUI.您只是在服务器上没有GUI.这意味着你ChartFrame frame被抛弃了.我创建图表的主要例程如下:

  private void createChart(XYPlot plot, String fileName, String caption) throws IOException {
      JFreeChart chart = new JFreeChart(caption, plot);
      chart.addSubtitle(this.subtitle);
      if (plot.getRangeAxis() instanceof LogarithmicAxis) {
         chart.addSubtitle(1, new TextTitle("(logarithmische Skala)"));
      }
      File file = new File(fileName);
      file.delete();
      ChartUtilities.saveChartAsPNG(file, chart, CHART_WIDTH, CHART_HEIGHT);
   }
Run Code Online (Sandbox Code Playgroud)

这将创建一个可以<img>从网页中提供的文件.或者(但更高级),您可以使用ChartUtilities创建一个流,您可以提供该流以响应对图像URL的请求.

需要的另一个神奇之处就是告诉Java你在没有GUI的情况下运行图形代码.您需要设置环境变量

-Djava.awt.headless=true
Run Code Online (Sandbox Code Playgroud)

对于像Tomcat这样的Web应用服务器,这将进入Tomcat启动脚本.


更新

好吧是啊不是'ChartUtilities.saveChartAsPNG();' 只需将图表保存到文件系统中?我希望用户能够输入变量,然后在浏览器中直接将图表显示回来.

只要您只有一个用户,将图像写入文件系统就可以适用于您描述的场景.事实上,这就是我的第一个版本的工作方式:<img>我的HTML响应页面中有4个标签,来自用户指定参数的表单; 那些用我的图像指出了4个文件的名字.只要在将答案返回给用户之前完成这些文件的编写,这就可以了.

当您有多个用户时会出现问题.他们最终可以查看其他用户指定的图表.将用户的ID或会话编码到图表文件名中有可能的解决方法,但这很快就会变得难看.有一种更好的方法,基于每个图像的按需动态生成,单独.

我不知道你对HTML/HTTP有多了解,所以我希望我不会厌倦你:

对于任何给定的HTTP请求,您只能返回单个数据流.通常,这是一个HTML页面,即文本流.如果您想在HTML页面中使用图像,则可以在HTML页面中插入<img>包含不同URL的链接,而您仍然只是返回一个充满文本的页面.浏览器然后继续并通过发射过在提到的URL的请求请求图像<img>标签.当您的图像只是文件系统中的文件时,这非常容易.如果您想要动态生成的图像(如图表),则必须考虑要生成的每种图像的URL,并将每个URL映射到知道如何生成此类图像的servlet.

我的应用程序在一个页面上有4个不同的图表,因此我的HTML页面有4个<img>标签,其中有4个不同的URL都映射到同一个图表生成servlet,但是URL中有一些参数告诉servlet需要什么类型的图表.收到请求后,servlet将执行JFreeChart魔术,然后它将用于ChartUtilities.writeChartAsPNG()将生成的图像转储到servlet的输出流.