如何将图表从我的servlet转发到jp?

时间:2014-10-21 12:39:04

标签: jsp servlets jfreechart requestdispatcher

我已经构建了一个servlet,它向数据库发出一些查询信息,然后将它们转发到jsp页面。

除了这些信息之外,现在我想要在servlet中创建一个已创建的图表作为请求。

Servlet代码:

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

 . More Servlet code..
 .
 .
 . 
 case "Charts": {

            String QueryStatus = "select distinct NodeStatus from nodes;";

            Operations oper = new Operations();


            ArrayList<?> ListStatus = oper.getList(QueryStatus);              



            request.setAttribute("ListStatus", ListStatus);

直到这里一切正常,但是一旦我添加以下代码:

            JFreeChart Chart = null;
            BACENGQueryDatabases DataChart = new BACENGQueryDatabases();
            Chart = DataChart.GetChart("select Name, StNode from controls;");

            if (Chart != null) {
                int width = 500;
                int height = 350;
                final ChartRenderingInfo info = new ChartRenderingInfo(new    StandardEntityCollection());
                response.setContentType("image/png");
                OutputStream out = response.getOutputStream();
                ChartUtilities.writeChartAsPNG(out, Chart, width, height, info);
            }

图表已打印,但没有其他内容。 RequestDispatcher是截断的。

          RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/Charts.jsp"); //Set page to redirect data
            rd.forward(request, response);// Forward data to the next page
            break;
        }

有没有办法转发图表,就像我正在使用(request.setAttribute(“ListStatus”,ListStatus);)在同一个jsp页面上使用。

我拒绝使用将图表打印到文件然后在jsp上使用它,因为I / O性能,因为将创建许多图表。

1 个答案:

答案 0 :(得分:2)

单个响应只能有一种内容类型。它可以是普通的HTML页面(type = text/html),也可以是图表(type = image/png),但不能同时使用两者。

当你转发到JSP时,我认为你想要构建一个包含图表的HTML页面(实际上是一个png图像)。您将图像包含在带有<img>标记的HTML文件中。此时您有两种可能性:

  • 一个简单而经典的<img>,其中源是一个URL。浏览器会在您提供的网址上发出第二个请求,然后直接发送图片。简单而强大,但需要2个请求。
  • 基础64嵌入图像。 src属性包含 base64编码的图像,类似于

    src="data:image/png;base64,__base64 encoded image__"
    

    您保存了一个请求,但如果您的图片很大,则编码会使大小增加30%到40%。并非所有浏览器都能正确理解它。您应该查看其他帖子Embedding Base64 Images以获取更多详细信息。