#改造struts2-jasperreport-plugin-2.1.6支持多数据源
目前官方发布的struts2-jasperreport-plugin-2.1.6插件仅支持java的数据源类型:Map,Iterable,isArray为true即各种Array、List,Enumeration,Iterator,将其无法识别的类型封装成Object[],最终转化为可迭代的List类型,具体可参加ValueStackDataSource的构造方法及MakeIterator的isIterable和convert方法,下图展示了jasperreport所支持的数据类型及ValueStackDataSource所处的位置:
由于图片无法上传,请参考同步blog:http://hi.baidu.com/fenglinquan/blog/item/bf851f2e651063594fc226e3.html
由此可见,为了使struts2-jasperreport-plugin-2.1.6插件支持多种数据源的唯一方法就是修改插件,修改思路如下:
在JasperReportsResult 的doExecute 方法中是通过ValueStackDataSource stackDataSource = new ValueStackDataSource(stack, dataSource); 获取jasperreport所需要的数据源的,为了使其支持多数据源需在此之前做判断过滤,做法为:先从stack获取数据源,判断其是否为JRDataSource,若是转换成JRDataSource,否则,再采用ValueStackDataSource方式赋值给JRDataSource接口,修改代码如下:
....省略部分....
// Construct the data source for the report.
//<begin added by twolf,20090907<使其支持多数据源>
ValueStack stack = invocation.getStack();
//先从stack获取数据源,判断其是否为JRDataSource,若是转换成JRDataSource,否则,再采用ValueStackDataSource方式赋值给JRDataSource接口
//ValueStackDataSource stackDataSource = new ValueStackDataSource(stack, dataSource);
JRDataSource jrDataSource = null;
Object obj = stack.findValue(dataSource);
if(obj instanceof JRDataSource) {
jrDataSource = (JRDataSource) obj;
} else if(obj instanceof ResultSet) { //自动封装ResultSet为Jasperreport数据源JRResultSetDataSource
jrDataSource = new JRResultSetDataSource((ResultSet)obj);
} else {
jrDataSource = new ValueStackDataSource(stack, dataSource);
}
//end added by twolf,200907>
....省略部分....
try {
JasperReport jasperReport = (JasperReport) JRLoader.loadObject(systemId);
//<begin modified by twolf,20090907(修改为JRDataSource对象)
//jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, stackDataSource);
jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, jrDataSource);
//end modified by twolf,20090907>
} catch (JRException e) {
LOG.error("Error building report for uri " + systemId, e);
throw new ServletException(e.getMessage(), e);
}
....省略部分....
至此,jasperreport-plugin已具备支持各种数据源(ResultSet、ValueStackDataSource及任何JRDataSource)的能力。
源码下载地址:http://redsnow-fenglin.iteye.com/blog/508715
同步blog:http://hi.baidu.com/fenglinquan/blog/item/bf851f2e651063594fc226e3.html