![](/img/trans.png)
[英]struts2 - java.lang.IllegalStateException occurs intermittently while action calls result stream to download PDF file
[英]In jsp, generating pdf I get a java.lang.IllegalStateException: STREAM
我被要求在现有的Web应用程序中创建报告(不是我自己的,并且我无权访问其代码)。 我认为JasperReports是最简单的,因为周围有很多很好的例子...
我已经在下面编写了示例,但是浏览器显示了一个空白页面,没有pdf显示。 但是,如果刷新浏览器页面,有时会显示pdf。
<%@ page import="java.io.*"%>
<%@ page import="javax.servlet.*"%>
<%@ page import="java.sql.Connection"%>
<%@ page import="java.sql.DriverManager"%>
<%@ page import="java.util.HashMap"%>
<%@ page import="java.util.Map"%>
<%@ page import="javax.servlet.ServletException"%>
<%@ page import="javax.servlet.ServletOutputStream"%>
<%@ page import="net.sf.jasperreports.engine.*"%>
<%@ page contentType="application/pdf" %>
<%
Connection conn = null;
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
conn = DriverManager.getConnection("jdbc:sqlserver://[server][\instance]:1433;databaseName=[databasename];integratedSecurity=True");
} catch (Exception ex) {
ex.printStackTrace();
}
File reportFile = new File(application.getRealPath("/bespoke/rapport/Planning.jasper"));//your report_name.jasper file
Map parameters = new HashMap();
byte[] bytes = JasperRunManager.runReportToPdf(reportFile.getPath(), parameters, conn);
response.setContentType("application/pdf");
response.setContentLength(bytes.length);
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write(bytes, 0, bytes.length);
outputStream.flush();
outputStream.close();
%>
我得到的确切错误是:
java.lang.IllegalStateException: STREAM
at org.mortbay.jetty.Response.getWriter(Response.java:616) ~[jetty-6.1.24.jar:6.1.24]
at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:122) ~[servlet-api-2.5-20081211.jar:na]
at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:187) ~[jsp-2.1-glassfish-2.1.v20091210.jar:na]
at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:180) ~[jsp-2.1-glassfish-2.1.v20091210.jar:na]
现在,我知道问题出在代码的最后几位。
问题是,当我不允许向原始程序中添加类时,该如何解决?
我只能添加.jasper文件, 天哪 ,这是一个简单的.jsp页面。
再说一次,我知道将代码添加到jsp是极其糟糕的形式,但是我被困在这里...
昨天在JSP中创建和返回Excel文件时遇到类似的错误。 您需要删除关闭(%>)和打开(<%)jsp标记之间的所有空格。
代替
<%@ page contentType="application/pdf" %>
<%
Connection conn = null;
做了
<%@ page contentType="application/pdf" %><%
Connection conn = null;
如果您有空间,那么JSP会调用response.getOutputStream()来创建JspWriter,因为您需要自己调用response.getOutputStream()来返回二进制文件,所以您不需要它。
将我的代码更改为以下内容:
<%@ page language="java" import="net.sf.jasperreports.engine.*,net.sf.jasperreports.engine.export.*" %>
<%@ page import="org.apache.commons.lang.time.*" %>
<%@ page import="java.sql.*,java.io.*" %>
<%
String filename = request.getParameter("filename");
String reporttype = request.getParameter("reporttype");
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection conn = DriverManager.getConnection("jdbc:sqlserver://[servername]\\[instancename];databaseName=[databasename][:portnumber(remove when dynamic port is used)];integratedSecurity=True");
System.out.println("Connection Established");
String path = application.getRealPath("/");
JasperPrint jasperPrint = JasperFillManager.fillReport(path + "/" + filename, null, conn);
System.out.println("Report Created...");
OutputStream ouputStream = response.getOutputStream();
JRExporter exporter = null;
if( "pdf".equalsIgnoreCase(reporttype) )
{
response.setContentType("application/pdf");
exporter = new JRPdfExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, ouputStream);
}
else if( "html".equalsIgnoreCase(reporttype) )
{
exporter = new JRHtmlExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, ouputStream);
}
else if( "xls".equalsIgnoreCase(reporttype) )
{
response.setContentType("application/xls");
response.setHeader("Content-Disposition", "inline; filename=\"file.xls\"");
exporter = new JRXlsExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, ouputStream);
}
try
{
exporter.exportReport();
}
catch (JRException e)
{
throw new ServletException(e);
}
finally
{
if (ouputStream != null)
{
try
{
ouputStream.close();
}
catch (IOException ex)
{
}
}
}
%>
悲伤,就一定要做到这样,但至少它的伎俩....
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.