我构建了一个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 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性能,因为将创建许多图表。
单个响应只能具有一种内容类型。它要么是普通的HTML页面(类型= text/html
(要么是图表(类型=image/png
(,但不能两者兼而有之。
当你转发到一个JSP时,我假设你想建立一个包含图表(实际上是png图像(的HTML页面。您将图像包含在带有 <img>
标记的 HTML 文件中。此时您有两种可能性:
- 一个简单而经典的
<img>
,其中源是 URL。浏览器将在您提供的网址上发出第二个请求,然后您直接发送图像。简单而强大,但需要 2 个请求。 -
Base 64 嵌入映像。
src
属性包含 base64 编码的图像,类似于src="data:image/png;base64,__base64 encoded image__"
您保存了一个请求,但如果图像很大,则编码的大小将增加 30% 到 40%。而且并非所有浏览器都能正确理解它。您应该查看另一篇文章 嵌入 Base64 图像 了解更多细节。