我正在我的项目中集成 JasperReports ,但我是Jasper Report的新手,所以我编写了一个servlet,它将编译,填写报告并导出为pdf。之后我必须将outputstreem发送到jsp并在客户端显示pdf。
我这样做了。
<a href="VehicleReports">Vehicle Report</a>
并且在doPost()
方法中我写了这样的内容。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Connection con=null;
try {
response.setContentType("application/pdf");
con=VehicleDetails.getConnection();
InputStream inputStream = new FileInputStream ("E:/ReportFld/report4.jrxml");
Map parameters = new HashMap();
JasperDesign jasperDesign = JRXmlLoader.load(inputStream);
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
@SuppressWarnings("unchecked")
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, con);
JasperExportManager.exportReportToPdfFile(jasperPrint, "D:/reports/vehicle2_jasper.pdf");
int len = (int)new File("D:/reports/vehicle2_jasper.pdf").length();
response.setContentLength(len);
byte[] buf = new byte[len];
FileInputStream pdfin = new FileInputStream("D:/reports/vehicle2_jasper.pdf");
pdfin.read(buf);
pdfin.close();
OutputStream pdfout = response.getOutputStream();
pdfout.write(buf,0,len);
pdfout.flush();
request.getRequestDispatcher("/vehicleReport.jsp").forward(request, response);
}catch(Exception e){
e.printStackTrace();
}finally{
try {
con.close();
}catch (SQLException e) {
e.printStackTrace();
}
}
}
但是我觉得,响应不是发送到/vehicleReport.jsp
文件,而是生成的pdf正在下载。而且我在控制台中收到错误,
java.lang.IllegalStateException: Cannot forward after response has been committed
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:348)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:338)
at com.reports.VehicleReports.doGet(VehicleReports.java:78)
如何解决这个问题,任何人都可以帮助我吗?
答案 0 :(得分:0)
由于您的方法不起作用,您可以尝试另一种方法。 首先进入您的视图(JSP),然后调用控制器生成PDF并在那里显示。假设您的servlet的URL模式是PdfView,那么您可以编写。
<a href="PdfView">View Pdf</a>
或者更好地将pdf嵌入到iframe
中<iframe src="PdfView" width="100%" height="600"></iframe>
从控制器中删除
行request.getRequestDispatcher("/vehicleReport.jsp").forward(request, response);
或者,您也可以提供生成文件的完整路径并跳过整个servlet部分。但是这可能会将您的目录结构暴露给客户端,而您希望避免这种情况。
此外,由于JasperReport也可以创建'stream'而无需在服务器中创建实际文件,因此您也可以使用它。这将在客户端浏览器上创建文件,而不必担心清理服务器。见[here](http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/JasperExportManager.html#exportToPdfStream(java.io.InputStream,java.io.OutputStream))
JasperExportManager.exportReportToPdfStream(jasperPrint, outputStream);
根据您上次评论完成工作的JSP代码。在这种情况下,一点jquery非常有用。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$('#form').submit(function(){
var action = "VehicleReports?vehicleModel=";
var input = $('#input').val();
action = action+input;
alert(action);
$('#frame').attr("src",action);
return false;
});
});
</script>
</head>
<body>
<form action="" method="get" id="form">
<input type="text" id="input"/>
<input type="submit" value="submit" />
</form>
<iframe src="" width="100%" height="600" id="frame"></iframe>
</body>
</html>