我已经写了一个这样的应用程序,所以我可以向你保证它是可行的:)
首先,您需要摆脱任何 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);
}
<img>
这将创建一个文件,您可以从您的网页中将其用作一个文件。或者(但更高级),您可以使用 ChartUtilities 创建一个流,您可以提供该流以响应对图像 URL 的请求。
另一个需要的魔法是告诉 Java 您正在运行没有 GUI 的图形代码。你需要设置环境变量
-Djava.awt.headless=true
对于像 Tomcat 这样的 Web 应用服务器,这会进入 Tomcat 启动脚本。
更新
好吧是的不是'ChartUtilities.saveChartAsPNG();' 只是将图表保存到文件系统中?我希望用户能够输入变量,然后在浏览器中直接显示一个图表。
只要您只有一个用户,将图像写入文件系统就可以很好地满足您描述的场景。事实上,这就是我的第一个版本的工作方式:我<img>
的 HTML 响应页面中有 4 个标签来自用户指定参数的表单;那些用我的图像指出 4 个文件的名称的人。只要您在将答案返回给用户之前完成编写这些文件,就可以正常工作。
当您有多个用户时会出现问题。他们最终可以查看其他用户指定的图表。将用户的 ID 或会话编码到图表文件名中可能有一些解决方法,但这会变得非常难看。有一个更好的方法,基于每个图像的按需动态生成,单独。
我不知道你对 HTML/HTTP 了解多少,所以我希望我不会让你感到厌烦:
对于任何给定的 HTTP 请求,您只能返回一个数据流。通常,这是一个 HTML 页面,即文本流。如果您想在 HTML 页面中添加图像,则将<img>
具有不同 URL 的链接插入到 HTML 页面中,您仍然只是返回一个充满文本的页面。然后浏览器继续并通过触发对<img>
标签中提到的那些 URL 的请求来请求图像。当您的图像只是文件系统中的文件时,这非常容易。如果您想要动态生成的图像(例如图表),那么您必须为您想要生成的每种图像想出一个 URL,并将这些 URL 中的每一个映射到一个知道如何生成此类图像的 servlet。
我的应用程序在一个页面上有 4 个不同的图表,所以我的 HTML 页面有 4 个<img>
标签和 4 个不同的 URL,它们都映射到同一个图表生成 servlet,但是 URL 中有一些参数告诉 servlet 需要什么样的图表. 收到请求后,servlet 将执行 JFreeChart 魔术,然后将ChartUtilities.writeChartAsPNG()
生成的图像转储到 servlet 的输出流。