struts2 + hibernate3 + jasper-report 5.0 —得到空白报告
我创建了一个应用程序,它使用jasper report 5.0,struts2和hibernate打印出一个报告。 jasper报告使用hql。 该应用程序工作正常,但问题是,当我触发struts动作时,我在浏览器中得到空白报告 ,但当我在netbeans中预览报告时,我正在获取带有数据的报告。
任何人都可以告诉我一些解决方案。
当报告单独运行时
通过struts2 + hibernate生成相同报告时的空白报告
我的代码如下所示
在struts.xml
/Reports_HSE/sample.jasper myList PDF
HibernateClass.java
public class HibernateClass { private List myList; Session session; SessionFactory sessionFactory; public String getpdf() { String dest = ServletActionContext.getServletContext().getRealPath("/Reports_HSE/sample.jasper"); session = createSession(); Map parameterMap = new HashMap(); parameterMap.put( JRHibernateQueryExecuterFactory.PARAMETER_HIBERNATE_SESSION, session); try { System.out.println("Filling report..."); JasperFillManager.fillReportToFile(dest, parameterMap); System.out.println("Done!"); return "success"; } catch (JRException e) { System.out.println("There was an error filling the report."); e.printStackTrace(); return "error"; } } public List getMyList() { return myList; } private Session createSession() { SessionFactory sessionFactory = new Configuration().configure() .buildSessionFactory(); return sessionFactory.openSession(); } }
sample.jrxml
的结果
JasperFillManager.fillReportToFile(dest, parameterMap);
是带文件名的String。 该文件包含jrPrint对象。
如果你不使用这个文件,怎么能看到执行报告的结果?
我只是建议你应该去
JasperPrint fill(java.lang.String sourceFileName, java.util.Map params)
然后,处理JasperPrint对象的返回引用。 您还可以检查是否所有数据都存在于其中。根据文档, JasperPrint
– 此类的实例表示面向页面的文档,可以查看,打印或导出为其他格式。填写报表设计时数据,引擎生成此类的实例,这些实例可以通过网络传输,以序列化forms存储在磁盘上或导出为各种其他格式,如PDF,HTML,XLS,CSV或XML。
我遇到了同样的问题,所以我删除了Struts2-JasperReports-Plugin jar并自己编写了导出代码。 这很简单!
public void exportReport() { try { ServletOutputStream outputStream = ServletActionContext.getResponse().getOutputStream(); Map parameters = new HashMap<>(); parameters.put("id","1"); //Get the parameters and report according to your application byte[] bytes = JasperRunManager.runReportToPdf(jasperReport, parameters, myList); //Setting the response as a downloadable attachment ServletActionContext.getResponse().setContentType("application/pdf"); ServletActionContext.getResponse().setHeader("Content-Disposition: attachment", "inline; filename=report.pdf"); outputStream.write(bytes, 0, bytes.length); outputStream.flush(); outputStream.close(); } catch(Exception e) { addActionError("Unable to generate report"); } }
导出到XLS的工作方式非常相似。
编辑:从连接对象更改为数据源
- 强制hibernate在不改变映射的情况下急切地加载多个关联
- 在使用FlushMode.AUTO调用session.close()时,Hibernate会刷新我更新的持久对象吗?
- 为什么我得到org.hibernate.id.IdentifierGenerationException?
- 没有节点的数据类型:org.hibernate.hql.internal.ast.tree.IdentNode HQL
- Hibernate DetachedCriteria多个结果导致java
- hibernate没有创建表但没有错误消息
- Hibernate 3.6.10不会通过OneToMany JoinTable级联删除
- Hibernate – > ArrayList不能转换为Set
- 使用Hibernate 4的Integrator模式和Spring的dependency injection