【发布时间】:2010-01-15 11:28:16
【问题描述】:
我正在使用 struts 创建一个项目,但在使用 Jasper IReports 时遇到问题。我想将一些信息导出到 pdf 文件中,并且我不断收到 java.lang.IllegalStateException: getOutputStream() has been call...当页面已经打开 PrintWriter 时在我的代码中打开 ServletOutputStream 导致的异常。
代码在模型里(所以不在jsp里,是在java文件里),如下:
public void handle(HttpServletResponse res, Connection connection, String path)throws Exception{
ServletOutputStream out = null;
try {
JasperDesign jasperDesign = JRXmlLoader.load(path);
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
byte[] bytes = JasperRunManager.runReportToPdf(jasperReport, null, connection);
res.setContentType("application/pdf");
res.setContentLength(bytes.length);
out = res.getOutputStream();
out.write(bytes, 0, bytes.length);
} catch (Exception e) {
e.printStackTrace();
} finally {
out.flush();
out.close();
}
我检查了连接、路径和 HttpServletResponse,一切正常。
我是 Jasper Reports 以及将内容编码为 PDF 的新手,因此您可以正确地假设我对我在这里所做的事情有一个最小的了解,显然我的代码是从某个地方复制/粘贴的通过网络。
我尝试使用 PrintWriter 而不是 OutputStream,将字节转换为字符串并使用 PrintWriter.append(String) 方法(allthought is not String is CharSequence),但它不会将数据提取到 PDF 中。
我也尝试获取 PrintWriter,关闭它以打开 OutputStream(不起作用)或刷新它(两者都没有)。
任何关于使用任何可以在 pdf 中显示数据的解决方案的帮助都会很棒。 非常感谢!
【问题讨论】:
-
谁在打开 PrintWriter?
-
JSP 文件在启动时尝试打开 PrintWriter。因此,当我通过 ActionMapping.findforward 将控件发送到 jsp 文件时,JSP 打开 PrintWriter 并开始显示 JSP。我通过我的 findforward 不去任何地方解决了这个问题。所以没有要加载的 JSP 文件(没有要加载的内容),并且 PDF 代码(通过 OutputStream)在不加载 jsp 文件的情况下进入页面,因此,不加载 PrintWriter。
标签: java servlets outputstream printwriter