struts2 + jsaperReport 支持多数据源

最近用struts2+jasperreport做整合,想用resultSet做为数据源,而struts2中只支持集合和Connection做数据源。

用的是struts2-jasperReports-plugin-2.1.8.jar

通过查看源代码 真正起作用的是JasperReportsResult这个类

找到 protected void doExecute(String finalLocation, ActionInvocation invocation) throws Exception 方法

ValueStack stack = invocation.getStack();
ValueStackDataSource stackDataSource = null;

  Connection conn = (Connection) stack.findValue(connection);//从配置文件中读取connection属性
 if (conn == null)
         stackDataSource = new ValueStackDataSource(stack, dataSource);

修改以上代码

ValueStack stack = invocation.getStack();
ValueStackDataSource stackDataSource = null;

JRDataSource jrDataSource = null;//支持多数据源 
        //添加支持多数据源
        Connection conn = (Connection) stack.findValue(connection);//从配置文件中读取connection属性
        if (conn == null) {   //如果配置文件中没有Connection属性
            // stackDataSource = new ValueStackDataSource(stack, dataSource);
            
            Object obj = stack.findValue(dataSource);   //从配置文件中读取dataSource属性
            if (obj instanceof JRDataSource) {
                jrDataSource= (JRDataSource) obj;
            } else if (obj instanceof ResultSet) { // 自动封装ResultSet为Jasperreport数据源JRResultSetDataSource    
                jrDataSource= new JRResultSetDataSource((ResultSet) obj);
            } else {// 如果dataSource是集合和其它配置不做处理
                jrDataSource= new ValueStackDataSource(stack, dataSource);
            }
        }

byte[] output;
        JasperPrint jasperPrint;

        // Fill the report and produce a print object
        try {
            JasperReport jasperReport = (JasperReport) JRLoader.loadObject(systemId);
            if (conn == null){
                //jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, stackDataSource);   //注释掉源代码
                 jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, jrDataSource);
            }
            else{
                jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, conn);
            }
        } catch (JRException e) {
            LOG.error("Error building report for uri " + systemId, e);
            throw new ServletException(e.getMessage(), e);
        }


<action name="pdf" class="com.focustar.action.ReportAction">
                <result name="attend" type="jasper">
                    <param name="location">/jasper/attend.jasper</param>
                      <param name="dataSource">resultSet</param>
                      <param name="reportParameters">reportPams</param>
                      <param name="format">PDF</param>
                </result>
 </action>

调试之后没问题,但后来发现用resultset做数据源时,强行关闭Connection对象的时候报错。

把resultSet交给jsaperReport的时候,resultSet的关闭处理不知道是怎么做的同时Connection对象也无法关闭,这是个要命的问题。

想用数据库连接池,等数据库连接池自动回收Connection,也不太好。

最后还是舍弃了用resultSet做数据源,改用list做数据源,毕竟可以手动关闭数据库连接。




你可能感兴趣的:(struts2,jasperReport)