12.6 整合Struts 2和JasperReports开发报表
Struts 2提供了JasperReports插件支持,借助于该插件,Struts 2可以非常方便和容易地使用JasperReports来生成报表。
12.6.1 安装JasperReports插件
JasperReports插件位于struts-2.0.11.1下的lib目录下。只需将该插件复制到Web应用下的WEB-INF\lib目录下就可以了。但是发现该插件下的“struts-plugin.xml”配置同JFreeChart插件有类似问题,如下代码所示。
<! DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="jasperreports-default"> <result-types> <result-type name="jasper" class="org.apache.struts2.views. jasperreports.JasperReportsResult"/> </result-types> </package> </struts>
从“struts-plugin.xml”配置文件中可以看出,其定义了一个包jasperreports-default,但是该包没有去继承struts-default。所以这里手动修改使得该jasperreports-default包继承Struts 2原有的默认包struts-default,代码如下所示。
<struts> <package name="jasperreports-default" extends="struts-default"> <result-types> <result-type name="jasper" class="org.apache.struts2.views. jasperreports.JasperReportsResult"/> </result-types> </package> </struts>
修改完成后,重新将该插件解压出的文件夹打包成JAR,并将该其复制到Web应用下的WEB-INF\lib目录中。
12.6.2 创建生成报表的Action
插件安装完成后,开始添加Action用来生成报表,在该Action中可以添加一个get×××的方法,通过该方法返回一个集合。经过Action配置后,该集合中的数据将被填充到报表中。
首先添加一个User类,该类是一个普通的JavaBean。该类中包含3个属性,添加其构造函数以及各属性的setter和getter方法,代码如下所示。
package net.hncu.bean; public class User { // username属性 private String username; // password属性 private String password; // sex属性 private String sex; // 构造函数 public User(String username, String password, String sex) { super(); this.username = username; this.password = password; this.sex = sex; } // 属性的setter和getter方法 public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
在Action中添加一个getUserList()方法,在该方法中新建一个ArrayList实例,并向其添加数据,代码如下所示。
package net.hncu.action; import java.util.ArrayList; import java.util.List; import net.hncu.bean.User; import com.opensymphony.xwork2.ActionSupport; public class ReportAction extends ActionSupport{ //返回User集合 public List getUserList() { //新建ArrayList List users = new ArrayList(); //往ArrayList中添加User users.add(new User("张三", "1234", "男")); users.add(new User("李四", "1234", "男")); users.add(new User("王五", "1234", "男")); return users; } public String execute() throws Exception { return SUCCESS; } }
12.6.3 设计报表设计文件
使用iReport工具设计报表设计文件。为了能显示Action中的User,需要增加3个文本字段,并配置文本字段的name属性与User类中属性相对应。
首先找到“Document structure”视图窗口。在该视图窗口中选择“add”→“Field”选项,打开文本字段添加对话框。通过该对话框配置文本字段的名称以及数据类型,如图12.44所示。
添加完成文本字段后,可以将其直接拖曳到设计面板中,如图12.45所示。
图12.44 添加文本字段
图12.45 设计报表
编译该报表设计文件,将生成的jasper格式文件复制到Web应用中。
12.6.4 配置Action
配置该Action非常简单,只需为该Action指定一个类型为jasper的Result。同时可以为该Result指定3个参数:location、format和dataSource,分别用来指定jasper格式文件所在路径、生成报表格式以及报表使用数据源,代码如下所示。
<? xml version="1.0" encoding="UTF-8" ? > <! DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <! -- 自己的包继承jasperreports-default --> <package name="struts2" extends="jasperreports-default"> <! -- 定义login的Action,其实现类为net.hncu.action.ReportAction--> <action name="showReport" class="net.hncu.action.ReportAction"> <! -- 定义处理结果与视图资源之间的关系 --> <result name="success" type="jasper"> <! -- 指定报表设计文件所在路径 --> <param name="location">jasper\struts_report.jasper</param> <! -- 指定生成报表格式 --> <param name="format">HTML</param> <! -- 指定报表使用数据源--> <param name="dataSource">userList</param> </result> </action> </package> </struts>
12.6.5 生成JasperReports报表
配置完该Action后,就可以生成报表了。打开浏览器,运行showReport.action。这时可以看到生成报表,如图12.46所示。
图12.46 显示报表