Web application 中使用Crystal Report(二)

 

无论Crystal report,还是Jasper Report,一到了Websphere Portal中总是要折腾一番才能出来的。

首先,CR的标签到了portlet中就出错了,“This method can be called after HTTP body”,好像是这个信息。

其次,如果使用 viewer.processHttpRequest() 也会出错。

再有,不能在Jsp中使用<portlet:defineObjects />,否则也会报错。

诸多问题,也没有深入去研究,最简单的解决办法就是使用普通的jsp文件来生成报表,然后用iframe将这个jsp包含在portlet中

顺便也谈谈Jasper Report吧,虽然也很容易使用,但是到了Portal里面也不同了。

以导出PDF文件为例子,一般的代码块如下:

HttpServletResponse httpServletResponse  =  (HttpServletResponse) portletResponse;
httpServletResponse.setContentType(
" application/pdf " );
S ervletOutputStream outputStream 
=  httpServletResponse.getOutputStream();

InputStream inputStream 
=   this .getServlet().getServletConfig().getServletContext().getResourceAsStream( " / rpt/Flights.jasper " );

JRBeanCollectionDataSource beanDataSource 
=   new  JRBeanCollectionDataSource(filghts);  // 'flights' is a pre-defined arraylist contains all records to be printed

// Export PDF file
JasperRunManager.runReportToPdfStream(inputStream, outputStream,  new  HashMap(), beanDataSource);
outputStream.flush();
outputStream.close();


这在普通web应用中没有任何问题,但是,到了portal里面,导出的PDF文件就打不开了,会出现“file is damaged”的提示信息。

如果把第3行换成:

FileOutputStream outputStream  =   new  FileOutputStream( new  File( " C:\\report.pdf " ));


导出的PDF就不会有问题。使用ultraedit比较了两个导出的PDF后发现,使用servletOutputStream的那个,在EOF后多出了一长串portal页面的HTML代码出来,难怪打不开了。

解决办法就是使用普通的servlet而不用portlet servlet。

你可能感兴趣的:(Web application 中使用Crystal Report(二))