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

你可能感兴趣的:(html,Blog)