【51CTO.com独家特稿】一、在Java应用程序中打印报告
如今,在应用程序开发过程中报告模块经常变得越来越庞大和复杂。当客户们意识到报告提供给他们的优点时,他们往往要求报告模块提供给他们更多的信息。报告模块的开发就是在这样一种“事后回想”的环境下成为应用程序的一个重要的组成部分。另一方面,报告模块往往是在应用程序开发的后期附加上去的而不是在初始开发阶段就被纳入考虑并被实现。
最近,我在开发一些基于Apache POI库的应用程序,其中大量地使用到XLS文件的报告输出。我很快意识到:这些报告模块能够绑定大量极有价值的开发资源以便于将来之用。当客户端要求输出PDF格式时,最初的对于iText API的研究使我偶然发现了JasperReports。最后,我确信,JasperReports一定会极大地影响到我们小组开发报告的方法。
在实现JasperReports之前,创建每一种报告都要求基于Apache POI库开发一个定制报告类。这种方法要耗费大量宝贵的开发时间来创建报告的许多方面,例如单元格特定的格式化,风格及填充方法等。而如今,JasperReports能够帮助我们的开发小组夺回宝贵的开发时间,却仍然能够实现与原先同样的报告,因为这个工具嵌入式地使用了Apache POI库。
引入JasperReports的一个重要优点是,可以通过单个报告模板生产出若干种格式的报告。这意味着,针对于XLS格式输出创建的模板还能够用来生成PDF文件,甚至是CSV,HTML或XML文件。
二、JasperReports如何帮助开发者?
JasperReports使开发者能够快速而容易地创建出以多种格式输出的报告。开发者还能够在设计或运行时刻使用JasperReports引擎编译报告模板,从而允许生成动态的报告格式。而且,开发者还能够把来自于许多种数据源的数据导入到这些报告中。如今,开发者再也不必依赖于Apache POI来创建定制报告类或者使用iText库来格式化报告和确定报告风格,从而使他们专注于报告的数据检索。最终,通过在应用程序开发中使用JasperReports,开发者实现了极有价值的灵活性并节约了开发时间。
JasperReports所使用的XML报告模板提供了布局和描述信息,这些信息用于格式化结果报告以及域、变量和参数等参考内容。借助于某种第三方GUI(例如iReport)再加上极少的开发者协助,即使是非开发人员也能够创建这些模板。这样以来,开发者就不必自己去实现报告布局及描述内容。
总之,JasperReports能够使开发者专注于开发他们的报告模块部分,从而使之不必再编写定制的报告生成代码。在整个报告模块中,开发者的角色被缩减到模板编译、数据源实现和报告创建等几个方面。
三、创建和编译XML报告模板
JasperReports要求使用一种定义布局、描述及数据域的报告设计。可以使用net.sf.jasperreports.engine.design.JasperDesign对象来构建这种设计;这样以来,开发者能够动态地创建报告设计或通过由一个XML报告模板创建一个net.sf.jasperreports.engine.design.JasperDesign实例的方式来创建报告设计。除非一个应用程序特别要求使用一种动态的布局;否则,一般推荐使用一个编译的XML报告模板。这种XML模板通常以一个.jrxml文件扩展名保存并且使用net.sf.jasperreports.engine.JasperCompileManager进行编译。
这个JasperReports XML模板中包括了相应于
另外,从这个sampleReport.jrxml文件中还可以看出,有些元素(例如
其中,
注意,我们可以使用JasperReports Ant任务(作为一个Ant构建的部分)在运行时刻或构建时刻编译XML模板。
在运行时刻编译报告需要把该报告加载到一个JasperDesign对象并且使用创建的实例作为到JasperCompileManager.compileReport(JasperDesign design)方法的参数—这个方法返回一个JasperReport实例。作为选择,XML模板还能够被传递给JasperCompileManager.compileToFileReport(String sourceFileName)方法,这个方法能够创建一个在整个程序中使用的编译的报告文件(.jasper)。
使用JasperReports Ant任务在构建时刻编译报告要求把相应的任务定义添加到build.xml文件,还要添加一个相应的使用这个任务的目标(见源码文件中的列表2)。使用该Ant任务能够在destdir任务中创建一个编译的(.jasper)文件并且通过把true值传递给目标的keepjava属性以便保存Java源文件。本文相应的源码中包括了一个说明如何使用Ant任务的更为详细的示例。
四、使用数据源填充JasperReports
大多数报告都使用数据库作为数据源,但是JasperReports能够使用任何可用的数据源。这些数据源被作为参数传递给一个net.sf.jasperreports.engine.JasperFillManagerfillReportXXX()方法。这些方法实现了对两种类型的数据源的支持—net.sf.jasperreports.engine.JRDataSource和java.sql.Connection。注意,本文源码文件中包含了两种示例:扩展JRDataSource的静态数据源示例和实现JDBC连接的动态数据源的示例。
其中,StaticDataSource类的实例必须要实现net.sf.jasperreports.engine.JRDataSource接口,从而支持它填充报告数据—这是通过调用JasperFillManager.fillReport(JaperReportreport,Map parameters,JRDataSource dataSource)方法来实现的。StaticDataSource中另外两个需要实现的方法getFieldValue(JRField jrField)和next()(它们都由JRDataSource接口提供)负责把数据由数据源传递到JasperReport。StaticDataSource所使用的数据源是一个静态二维数组(每一个数组项相应于一个玩滚球的人的名字及其在三场游戏中的得分,见源文件中的列表3)。当处理包含此数据源的fillReport()方法并且在报告中遇到一个详细节(detail section,报告结构的一部分)时,要调用next()方法。如果在数据数组中还存在另一个元素,则在StaticDataSource中的这个方法实现(见列表4)将返回true;而如果不再有其它数据,则返回false。如果这个方法返回true,那么在详细节中遇到的域元素将激活对StaticDataSource中的getFieldValue(JRField jrField)方法的调用。在StaticDataSource中的这个方法(见列表5)将返回被映射的数据域名相应的值(相应于数据数组的当前索引)。当到达详细节的结尾部分时,再次调用next()方法;这一过程将重复执行,直到next()方法返回false为止。
JDBCDataSourceExample(见列表6)例子中实现了一个fillReport()方法,该方法接受一个java.sql.Connection参数。通过把一个
| 共2页: 1 [2] 下一页 | ||
|
|
|||
| · 51CTO主编推荐经典专题 · RAID——磁盘阵列基础 · 充电计划之热门IT认证.. · 51CTO技术自测 挑战自.. · CISSP认证成长之路 · AMD Phenom三核处理器.. · 国际文档格式标准开战 · 2007年互联网大会 |
· 我是黑客我怕谁——讲.. · ARP攻击防范与解决方案 · Solaris 10 配置管理 · Solaris基础知识入门 · RIP路由协议专栏 · MPLS路由协议专栏 · OSPF路由协议专栏 · 思科路由器产品 |
||
|
|||
| · Java基础教程 · VPN技术 · ARP攻击防范与解决方案 · SQL Server 2005全解 · SOA 面向服务架构 · SQL Server 2005全解 · Java编程开发手册 · RAID——磁盘阵列基础 |
· 三层交换技术专题 · SQL Server入门到精通 · Windows Server 2003企.. · Windows远程桌面应用 · C#技术开发指南 · VPN技术 · Solaris 10 配置管理 · C#技术开发指南 |
||
|
|||
| · ARP攻击防范与解决方案 · VPN技术 · SQL Server 2005全解 · Java基础教程 · SQL Server入门到精通 · SQL Server 2005全解 · SOA 面向服务架构 · Java编程开发手册 |
· C#技术开发指南 · 三层交换技术专题 · C#技术开发指南 · Windows远程桌面应用 · RAID——磁盘阵列基础 · Windows Server 2003企.. · 邮件服务器专题 · wimax技术与趋势 |
||
| ·DB2 Viper快速入门 ·DB2 9数据库的镜像分割与.. |
·将XML应用程序从DB2 8.x.. ·DB2 9中的pureXML:如何.. |
| ·服务器中的“傻瓜机”在.. ·盖茨也喜欢登录Youtube看.. |
· · |
| ·拯救系统管理员 ·美国选民:我为什么选布什 |
·VMware公司中文命名挑战赛 ·我们真缺乏创新吗? |
| ·J0ker的CISSP之路:复习-.. ·J0ker的CISSP之路:复习-I.. |
·9月第3周安全回顾 内网安.. ·教你几招识别和防御Web网.. |
| · NGN:下一代网络 · 网络访问中断大排查 · FTTx光纤接入 |
· 教你使用Anti ARP Sniff.. · 网络嗅探教程:使用Snif.. · 常见病毒手工清除方法大.. |
| · C++是垃圾语言?! · 2007年IT界七大抄袭事件 · Java实用开发全集 |
· 解析Ajax开发框架 走进A.. · 基于Google Maps与Ajax.. · 基于Google Maps与Ajax.. |
| · 热门 IT 培训认证官方资.. · Ubuntu 中文开源频道 · Solaris基础知识入门 |
· 费力不讨好 数据中心主.. · AMD Phenom三核处理器解.. · 51CTO主编推荐经典专题 |
| · 甲骨文Oracle 11g正式发.. · Oracle数据库开发之PL/S.. · Oracle数据库开发基础教.. |
· 存储2006,一个并购的大.. · IDC宣布浪潮蝉联存储市.. · 双机热备技术 |