Posted on 2007-04-13 22:31
马达+斯加 阅读(609)
评论(0) 编辑 收藏 所属分类:
Java 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。