2014-09-22 2 views
0

Я интегрирую JasperReports в моем проекте, но я новичок в отчете Jasper, поэтому я написал сервлет, который будет компилировать, заполнять отчет и экспортировать в pdf. После этого я должен отправить outputstreem в jsp и отобразить PDF на стороне клиента.Как отобразить 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

возможно дубликат [Как отображать отчеты на стороне клиента JSP?] (Http://stackoverflow.com/questions/25908004/how-to-display-the-reports-on-client-side- jsp) –

+0

проверить это http://stackoverflow.com/questions/2123514/java-lang-illegalstateexception-cannot-forward-after-response-has-been-committe – Killer

+0

@AlexK да это было хорошо, но я хочу отобразить его в jsp, делая выше метод его загрузки. – Raghu

ответ

0

Поскольку ваш подход не работает, вы можете попробовать альтернативный вариант. Сначала перейдите к вашему представлению (JSP), а затем вызовите контроллер для создания PDF-файла и отображения там. Предположим, что 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); 

В качестве альтернативы вы можете также дать полный путь вашего созданного файла и пропустить всей части сервлета. Но это может подвергнуть вашу структуру каталогов клиенту, которого вы бы хотели избежать.

Кроме того, поскольку JasperReport также может создавать «поток» без создания фактического файла на сервере, вы также можете использовать его. Это создаст файл в клиентском браузере и вам не придется беспокоиться об очистке вашего сервера. Смотрите [здесь] (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> 
+0

Это прекрасно, но в проекте он должен быть динамичным. – Raghu

+0

У этого есть другая проблема также, здесь он отлично работает для тега '', но он не работает для '

' – Raghu

+0

, вы можете использовать скрытое поле формы для передачи параметра, который вы хотите в случае форм. В случае href вы можете использовать 'PdfView? Param = value', где вы можете передать значение со своей веб-страницы. – ares

Смежные вопросы