在实际的Web项目开发中,往往需要在视图界面中生成各种文件格式的报表文件以供有数据分析需求的客户查看。有一定工作经验的读者往往也知道同类型的报表生成软件工具又很多,其中最著名的是JasperReports工具。Struts2中也对该报表工具提供了很好的支持。因此有包含大量数据需要操作或查看的Web项目开发中,就可以将两者结合起来。形成可以查看数据的报表视图文件。本小节将具体介绍如何使用Struts2和JasperReports报表工具生成特定的报表视图文件。
技术要点
本节代码还是和前几小节使用相同示例来说明JasperReports在Struts2中使用方式。
JasperReports在Web项目中基本使用方式。
struts.xml中设置使用JasperReports的Action配置定义。
使用JasperReports的Action如何利用JasperReports模板jrxml文件来生成jasper文件。
演示代码
显示数据的JasperReports模板jrxml文件代码(笔者仅将重点部分代码罗列给读者阅读):
- <!-------文件名:jasper_template.jrxml----->
- ………
- <reportFont name="宋体" isDefault="true" fontName="宋体" size="12" pdfFontName="STSong-Light" pdfEncoding="UniGB-UCS2-H" isPdfEmbedded="true"/>
- <field name="material" class="java.lang.String"/>
- <field name="bid" class="java.lang.Double"/>
- <field name="mount" class="java.lang.Integer"/>
- ………
- <columnHeader>
- <band height="20">
- <staticText>
- <reportElement x="0" y="0" width="150" height="20"/>
- <textElement textAlignment="Center" >
- <font isUnderline="false"/>
- </textElement>
- <text><![CDATA[材料名 ]]></text>
- </staticText>
- <staticText>
- <reportElement x="150" y="0" width="150" height="20"/>
- <textElement textAlignment="Center">
- <font isUnderline="false"/>
- </textElement>
- <text><![CDATA[材料价格(单位:元) ]]></text>
- </staticText>
- <staticText>
- <reportElement x="300" y="0" width="150" height="20"/>
- <textElement textAlignment="Center">
- <font isUnderline="false"/>
- </textElement>
- <text><![CDATA[材料库存量(单位:个) ]]></text>
- </staticText>
- </band>
- </columnHeader>
- <detail>
- <band height="15">
- <textField isBlankWhenNull="true" hyperlinkType="None">
- <reportElement x="0" y="0" width="150" height="15"/>
- <textElement textAlignment="Center"/>
- <textFieldExpression class="java.lang.String"><![CDATA[$F{material}]]></textFieldExpression>
- </textField>
- <textField isBlankWhenNull="true" hyperlinkType="None">
- <reportElement x="150" y="0" width="150" height="15"/>
- <textElement textAlignment="Center"/>
- <textFieldExpression class="java.lang.Double"><![CDATA[$F{bid}]]></textFieldExpression>
- </textField>
- <textField isBlankWhenNull="true" hyperlinkType="None">
- <reportElement x="300" y="0" width="150" height="15"/>
- <textElement textAlignment="Center"/>
- <textFieldExpression class="java.lang.Integer"><![CDATA[$F{mount}]]></textFieldExpression>
- </textField>
- </band>
- </detail>
- ………
配置文件对Action的配置内容:
- <!-----------------------文件名:struts.xml----------->
- ………
- <!-- 设置使用JasperReports的Action -->
- <package name="C06.3"
- extends="struts-default,jasperreports-default">
- <action name="PDF" class="action.JasperAction">
- <!-- result类型设置为jasper -->
- <result name="success" type="jasper">
- <!-- 编译后的jasper文件路径 -->
- <param name="location">
- /jasperreports/compiled_jasper_template.jasper
- </param>
- <!-- 视图界面中显示的数据的数据源 -->
- <param name="dataSource">mList</param>
- <!-- 报表生成格式 -->
- <param name="format">PDF</param>
- </result>
- </action>
- </package>
- ………
将JasperReports模板文件编译成jasper文件的Action代码:
- <!------------文件名:JasperAction.java----->
- public class JasperAction extends ActionSupport {
- private List mList;
- ………
- public String execute() throws Exception {
- ………
- //读取jasper_template.jrxml文件,将其编译成.jasper文件,以供Action调用将数据显示在视图界面中
- try {
- String reportSource;
- reportSource = ServletActionContext.getServletContext().getRealPath("/jasperreports/jasper_template.jrxml");
- File parent = new File(reportSource).getParentFile();
- JasperCompileManager.compileReportToFile(reportSource, new File(parent, "compiled_jasper_template.jasper")
- .getAbsolutePath());
- } catch (Exception e) {
- e.printStackTrace();
- return ERROR;
- }
- ………
- }
生成PDF格式报表文件的视图界面如图6.3。
图6.3 使用jasper生成的PDF报表文件效果图
代码解释
(1)使用JasperReports工具时候,在Web项目的/WEB-INF/lib文件夹下必须导入jasperreports-3.0.1.jar工具包,这样在JAVA代码中才能使用相关JasperReports的操作类。如果需要让JasperReports支持中文字符编码集,则还需要导入jasperreports-3.0.1.jar、itext-1.4.jar两个支持中文字符编码的jar包。除此之外要在Struts2中和JasperReports结合使用还要导入struts2-jasperreports-plugin-2.0.11.2.jar这个包。
(2)JasperReports要对报表的格式或者数据内容进行定义。一般都是使用后缀名为jrxml的模板文件。其实该模板文件就是一个xml文件,其中使用的标签都是由JasperReports的dtd文件来定义(关于dtd文件概念请见第二章)。
由示例代码可以知道,该xml文件支持定义JAVA变量。而“<![CDATA[]]>”中的字符内容都是可以在视图界面上显示的静态文字。除此之外还可以用“$F”来定义各个需要显示的动态数据字段。用“$V”来显示变量值。当然还有其他显示格式,读者可参考相关JasperReports文档来使用。
如果要让视图文件显示中文字符,在该jrxml模板文件头部分需要声明如下:
- <reportFont name="宋体" isDefault="true" fontName="宋体" size="12" pdfFontName="STSong-Light" pdfEncoding="UniGB-UCS2-H" isPdfEmbedded="true"/>
这样就可以在生成的报表文件中显示中文字符或数据。
在一般情况下,编辑和修改jrxml模板文件可以使用1个著名的可视化工具iReport。这样就没必要手工的在jrxml文件中进行修改,尤其是要显示大量数据的报表中。手工修改jrxml文件是件很累人又效率很低的工作。有关iReport工具的具体介绍读者也可自行参阅相关资料。因为不是本书重点,这里只是稍微涉及到。
(3)在Struts2配置文件中,笔者定义使用JasperReports的Action配置。请参看代码,首先package扩展的文件除了“struts-default”之外还要有“jasperreports-default”,两者用“,”相隔。这是因为struts2使用JasperReports时候调用的jar包是之前所说的“struts2-jasperreports-plugin-2.0.11.2.jar”这个包。在该包中对于JasperReports的result配置文件是包中的struts-plugin.xml文件。其中用到的package名字就是“jasperreports-default”。因此要用到JasperReports的Action,它的result类型必定设为“jasper”。这样只有在package中声明了“jasperreports-default”,用到相关jasper类型的result时候才会生效,导航到相应的视图文件。否则不声明的话,则不会找到相应的视图文件。在界面上就会报错。
(4)在jasper类型的result中,还可以定义一些相关的参数。这些参数中location是显示经过编译后生成的后缀名为jasper的文件存放路径。也可以理解为JasperReports的视图文件显示的URL。而dataSource则是定义报表视图文件中显示的数据是取自哪个数据源的。示例里的mList就是在Action代码中的mList属性。在Action的execute方法中和前几小节相同都把材料数据作为mList元素统一组合起来放入mList数据集合中。因此示例中报表视图文件显示的数据就是mList中包含的数据。由图6.3显示的数据也可以看出的确如此。format是定义报表生成的格式,因为JasperReports不仅可以生成PDF格式的还可以生成XLS(显示微软excel文件)、CSV、XML、HTML等格式的报表文件。在jasper类型的result中默认缺省的格式是PDF格式。除了这些参数还有parse、contentDisposition等属性,因为实际开发中用处不大,这里笔者也不介绍了。
(5)在使用JasperReports的Action代码中,参阅代码可知主要是调用了JasperReports的jasperreports-3.0.1.jar工具包中的JasperCompileManager类来将jrxml模板文件编译成jasper文件。这里的jasper文件其实可以理解为Servlet或JSP文件。报表视图文件正是使用该文件才将jrxml文件中定义的数据显示格式、动态数据和静态文本都经过编译后显示在视图界面中。
在示例的Action代码中,JasperCompileManager类使用compileReportToFile方法将jrxml文件编译成jasper文件。这里使用了相关的JAVA输入输出方法。将编译后生成的jasper文件和jrxml文件放置在同一目录下。
注意:compileReportToFile方法中,两个参数一个是jrxml文件存放的实际目录路径,另外一个是将要生成的jasper文件存放的实际目录路径。这里不是两个文件的相对路径,而是它们的绝对路径。
本文转载自:http://www.iteye.com/topic/493792