本文将详细介绍javaweb中采用struts2框架的jasperreports报表开发方法,数据源选取的是connection。模板选取的是编译后的模板(jasper格式文件)。
网上很多教程采用了jasperreports-3.x.x的api ,本文采用jarjasperreports-5.6.0.jar的api,两个版本的区别还是很大的,3.x.x版本的很多方法已经过时废弃了。
建议统一采用jarjasperreports-5.6.0.jar版本,因为生成报表的这些工具目前都有,jar包也齐全。3.x.x版的开发工具有,但是配套的jar包只能一个一个找了,另外很多方法已经过时了。
jasperreports的数据源可以有多种,list,JavaBean,connection等,为了不跟后台service层和dao层等关联起来,我们采用connection作为数据源。(因为后台如果用到了hibernate等框架,list,JavaBean等获取数据源就要做大量工作:写JavaBean,写映射文件等;采用connection数据源的话我们可以把sql语句写在模板中,在action中只是传map格式的参数和connection连接就可以了)
action中需要的HttpServletResponse对象和ServletContext对象可以通过实现ServletResponseAware和ServletContextAware接口来得到。更多方法可以参照此链接
jasperreports类里面的路径处理很纠结,为了方便期间统一使用servletContext的getRealPath方法来处理。
选择编译后的模版,可以减轻服务器负载,另外在action中编译的话,很容易因为编译器版本和产生报表工具版本不一致导致编译期间出错。jdt-compiler-3.1.1.jar和jasperreports-5.6.0.jar是匹配的。另外jaspersoft和ireport里面可以很方便的编译。(下面的实例代码pdf方法中中包含了编译)
一、利用struts2,action中不配置result,当然action中对应方法就不用返回值了,利用JRExporter对象的exportReport()输出到浏览器端。
1.开发jrxml格式的报表文件,可以用jaspersoft-studio或者ireport开发。将其放入我们web项目的WebRoot目录下。
2.将jrxml格式的文件编译为jasper格式的文件。
3.给jasper格式的文件填充数据并生成jrprint格式文件或流(不可以生成别的文件格式,jrprint格式的文件可以序列化)。比如:使用JasperFillManager.fillReport生成jrprint格式的文件。
4.利用JRExporter接口的具体实现类HtmlExporter、JRPdfExporter、JRXlsExporter等导出类将jrprint格式的文件生成html、pdf、xls格式的文件,并且导出到response的OutputStream流,从而输出到浏览器页面上。(当然也可以用JasperExportManager来代替前面的JRExporter实现类,不过该类只能处理3中格式(pdf、html、xml)的文件,要处理其他格式就要用具体的JRExporter具体实现类)
以上流程可参考下图(图片来源于网络)
开发流程中涉及的JasperReports相关类
二、利用struts2,action中不配置result,action中对应方法无返回值,在action中直接调用HttpServletResponse类的OutputStream类对象进行输出,从而输出到浏览器端。
1.开发jrxml格式的报表文件,可以用jaspersof