当前位置: 代码迷 >> ASP >> 改建struts2-jasperreport-plugin-2.1.6支持多数据源
  详细解决方案

改建struts2-jasperreport-plugin-2.1.6支持多数据源

热度:877   发布时间:2012-10-29 10:03:53.0
改造struts2-jasperreport-plugin-2.1.6支持多数据源

#改造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?

  相关解决方案