【问题标题】:Dynamically generate JFreeChart in servlet在servlet中动态生成JFreeChart
【发布时间】:2009-08-10 15:55:16
【问题描述】:

由于用户选择了一些复选框,我正在尝试使用 JFreeChart 动态生成图表,但我无法弄清楚如何最好地将生成的数据集转换为图表形式(我有从这些生成图表的代码,但需要生成 png) 并进入 JSP 视图。目前,我只能考虑将数据集发送到 JSP,但想不出从那里做什么......我该如何做到:用户提交表单到 servlet,servlet 生成数据集,从数据集生成图表,来自图表的png,最后是发送到jsp的png?或者类似的东西。

public void doPost(HttpServletRequest request,
                   HttpServletResponse response)
                    throws IOException, ServletException{

    String[] metrics     = request.getParameterValues("metrics");
    String[] fileNames   = request.getParameterValues("files");

    List<CategoryDataset> results = new ArrayList<CategoryDataset>();
    DMCalc calculator = new DMCalc(metrics, fileNames);  
    calculator.calculateResults();
    results.add(calculator.getEditDistanceDataset());
    results.add(calculator.getSimilarityDataset());
    results.add(calculator.getTimeChartDataset());

    request.setAttribute("results", results);
    RequestDispatcher view = request.getRequestDispatcher("metricResult.jsp");

    view.forward(request, response);
}

更新:

通过让 doPost 方法从用户帖子生成数据集,然后可以将它们存储在字段中,随后 RequestDispatcher 将用户转发到 JSP,然后在 img 标签中调用 servlet 的 doGet 方法,该标签使用存储的数据集在字段的前面生成一个 png,然后由 JSP 中的 HTML 显示。

【问题讨论】:

  • 听起来您的解决方案会在两个用户同时使用您的页面时中断——在 servlet 类的字段中存储任何内容是不安全的!
  • 啊,好的 - 有没有办法达到同样的效果?
  • 简单的解决方案是 HttpSession 对象。做 HttpSession session = request.getSession();然后 session.setAttribute("results", results);在表单 servlet 中,以及在图表 servlet 中的 session.getAttribute("results")。

标签: java jsp servlets jfreechart


【解决方案1】:

我建议您使用ServletUtilities 类。它保存在 java tempdir 中,并在会话无效时进行清理。 :) 然后显示文件的另一个提示是使用 DisplayChart servlet 来获取图像。 这在 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>

这就是您使用 jstl 显示图像的方式:

<img src="<c:url value='/servlet/DisplayChart?'><c:param name='filename' value='${yourFileNameHERE}' /></c:url>" alt=""/>

【讨论】:

    【解决方案2】:

    让您的 JSP 文件包含一个标签,其中 src 属性是您的 servlet 的名称。然后,您只需让 servlet 返回 PNG 图表:

        OutputStream out = response.getOutputStream();
        response.setContentType("image/png");
        ChartUtilities.writeChartAsPNG(out, chart, width, height);
    

    JSP 页面实际上只用于输出 HTML 或其他文本数据。虽然您可以强制 JSP 输出 PNG,但这样做没有任何好处。

    听起来您想创建一个根据下拉菜单状态更改进行更新的动态页面。为此,您需要使用 Javascript 在菜单更改时触发,并更新 img 标签的 src 属性的值。然后浏览器将从您的 servlet 中重新加载带有新图表的图像。

    【讨论】:

    • 我该如何做到:用户提交表单到 servlet,servlet 生成数据集,从数据集生成图表,从图表生成 png,最后将 png 发送到 jsp?
    • 这个 servlet 只做一件事——创建图表的 PNG 图像。您仍然需要有一个单独的 JSP 页面来保存 标记。这不需要 RequestDispatcher。
    • 让我换一种说法——如果没有数据集,我无法显示 png,这些数据集必须由用户提交的表单生成。我可以制作一个只处理一件事的 servlet,生成一个 PNG,但由于它是由提交的表单生成的,我该如何为其提供数据集呢?
    • 您的基本问题是跨两个 HTTP 请求保存状态。您的表单将向浏览器返回 HTML —— 一个 HTTP 请求。此 HTML 将包含一个 标记,该标记会导致对图表的第二个 HTTP 请求。解决问题的一种方法是使用 HttpSession 对象。您在其中存储的任何内容都将可供创建图表的 servlet 使用。另一种解决方法是传递查询参数,例如.
    猜你喜欢
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 2020-04-22
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多