A friendly place for programming greenhorns!
Big Moose Saloon
Search
|
Java FAQ
|
Recent Topics
Register / Login
Win a copy of
The Mikado Method
this week in the
Agile and other Processes
forum!
JavaRanch
»
Java Forums
»
Frameworks
»
Struts
Author
Urgent! Strange problem when calling jasper report in STRUTS
Michael Zohner
Greenhorn
Joined: Nov 24, 2004
Posts: 9
posted
Mar 04, 2009 02:09:51
0
Urgent! Strange problem when calling jasper report from STRUTS
Hi,
I have a problem when calling a jasper report from Struts and I have no idea what I am doing wrong.
I get a "java.lang.IllegalStateException: Cannot forward after response has been committed" exception!
My code is below...
Action:
public ActionForward execute(final ActionMapping mapping, final ActionForm form, final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException { ... if (irForm.isExcelReport()){ return mapping.findForward(AbstractBaseReportBean.prepare ReportJrxml(getRatesAndMissingCurrencies(), JASPER_FILE, "EXCEL", request, response)); }
// I pass a list with one map to this "prepareReportJrxml" method
AbstractBaseReportBean:
public static String prepareReportJrxml(List reportData, final String compileFileName, final String _exportOption, final HttpServletRequest request, final HttpServletResponse response) throws JRException, IOException, ReportingException { HttpSession session = request.getSession(); ServletContext context = session.getServletContext(); ReportConfigUtil.compileReport(context, getCompileDir(), compileFileName); File reportFile = new File(ReportConfigUtil.getJasperFilePath(context, getCompileDir(), compileFileName + ".jasper")); JasperPrint jasperPrint = ReportConfigUtil.fillReport(reportFile, getReportParameters(), getJRBeanCollectionDataSource(reportData)); ExportOption option = ExportOption.valueOf(_exportOption); if(option == null){ option = getExportOption(); } if (option.equals(ExportOption.HTML)) { exportReportHtml(jasperPrint, response); } else if (option.equals(ExportOption.EXCEL)){ exportReportPlainXls(jasperPrint, response); } else if (option.equals(ExportOption.PDF)){ exportReportPdf(jasperPrint, request, response); } //FacesContext.getCurrentInstance().responseComplete (); return LimexGuiConstants.FWD_SUCCESS; }
exportReportPlainXls method:
protected static void exportReportPlainXls(JasperPrint jp, HttpServletResponse response) throws JRException, IOException { ByteArrayOutputStream xlsReport = new ByteArrayOutputStream(); JRAbstractExporter jasperXlsExportMgr = new JRXlsExporter(); jasperXlsExportMgr.setParameter(JRXlsExporterParam eter.JASPER_PRINT, jp); jasperXlsExportMgr.setParameter(JRXlsExporterParam eter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE); jasperXlsExportMgr.setParameter(JRXlsExporterParam eter.IS_WHITE_PAGE_BACKGROUND, java.lang.Boolean.FALSE); jasperXlsExportMgr.setParameter(JRXlsExporterParam eter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE); jasperXlsExportMgr.setParameter(JRXlsExporterParam eter.IS_DETECT_CELL_TYPE, Boolean.TRUE); jasperXlsExportMgr.setParameter(JRExporterParamete r.OUTPUT_STREAM, xlsReport); jasperXlsExportMgr.exportReport(); byte[] bytes = null; bytes = xlsReport.toByteArray(); response.setContentType("application/vnd.ms-excel"); response.setHeader("Pragma", "public"); response.setHeader("Cache-Control", "max-age=1000"); response.setHeader("content-Disposition", "attachment;filename="report.xls";"); response.setContentLength(bytes.length); ServletOutputStream outputStream = response.getOutputStream(); InputStream is = new ByteArrayInputStream(bytes); int iSize = 0; byte[] oBuff = new byte[1024]; while ((iSize = is.read(oBuff)) != -1) { outputStream.write(oBuff, 0, iSize); } outputStream.flush(); //outputStream.close(); }
at this point I get the error:
AbstractBaseReportBean:
//FacesContext.getCurrentInstance().responseComplete (); return LimexGuiConstants.FWD_SUCCESS;
I dont know how to eliminate this error.
I think, this is also the reason why no data will be passed to the
excel
sheet (I think).
Thanks a lot ! cheers
David Newton
Author
Rancher
Joined: Sep 29, 2008
Posts: 12617
I like...
posted
Mar 04, 2009 06:14:37
0
http://faq.javaranch.com/java/EaseUp
Actions that write their own response should return "null" (not an ActionForward) so the framework doesn't attempt to continue processing the request.
I agree. Here's the link:
http://ej-technologies/jprofiler
- if it wasn't for jprofiler, we would need to run our stuff on 16 servers instead of 3.
subject: Urgent! Strange problem when calling jasper report in STRUTS
Similar Threads
Exception while writing to output stream
how to trigger a servlet from JSF
Call report using JSF and Jasper Reports
HTML generated by backing bean
JasperReports in webapp (JSF2)
All times are in JavaRanch time: GMT-6 in summer, GMT-7 in winter