在servlet中动态生成JFreeChart

时间:2009-08-10 15:55:16

标签: java jsp servlets jfreechart

我正在尝试使用JFreeChart动态生成图形,这是用户选择的一些复选框的结果,但我无法弄清楚如何最好地将生成的数据集转换为图表形式(我的代码可以生成这些图表,但需要生成pngs)并进入JSP视图。目前,我只能考虑将数据集发送到JSP,但不能想到从那里做什么...我如何做到这一点:用户将表单提交给servlet,servlet生成数据集,从数据集生成的图表,pngs从图表和最后的pngs派遣到jsp?或者沿着这些方向发展。

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,然后JSP在img标记中调用servlet的doGet方法,该标记使用存储的数据集早期在字段中生成一个png,然后由JSP在HTML中显示。

2 个答案:

答案 0 :(得分:5)

我建议你使用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=""/>

答案 1 :(得分:4)

让您的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重新加载图像。