我已经构建了一个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性能,因为将创建许多图表。
答案 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以获取更多详细信息。