最近用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做数据源,毕竟可以手动关闭数据库连接。