0

我已经构建了一个 servlet,它对数据库进行一些查询,获取一些信息并将其转发到 jsp 页面。

除了这些信息之外,现在我想在请求中包含一个已在 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 性能,因为将创建许多图表。

4

1 回答 1

2

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

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

  • 一个简单而经典<img>的来源是一个 URL。浏览器将在您提供的 url发出第二个请求,然后您直接发送图像。简单而健壮,但需要 2 个请求。
  • base 64 嵌入图像。该src属性包含base64 编码的图像,类似于

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

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

于 2014-10-21T14:02:08.807 回答