报表知识库
我要提问

如何使用Spring配置文件内的数据源发布报表

J2EE开发中配置数据库连接池的方式有很多种,多数情况下只要在应用服务器上配置数据库连接池就能满足需求,但是也有不少客户会使用一些中间件配置数据库连接池的方式,比如Spring,此时若采取通常的配置方法,发现润乾报表发布时不能正常展现了,报数据源连接的问题。本文介绍润乾报表如何读取Spring配置文件中的数据源发布报表。

实现思路:

在Jsp内读取Spring内数据源配置,创建报表运行上下文环境Context,然后生成ReportDefine对象,最后采用defineBean方式发布报表。

具体的实现步骤如下:

第一步:设计报表

这里使用mysql数据库为例做报表,数据源名称为”mysqlCon”,设计完报表如下所示:

1.png

第二步:读取Spring配置文件内的数据源工具类及工具类配置

1、 编写读取Spring配置文件内的数据源工具类

为避免每一个jsp运行报表时,在Jsp内都要用大段重复的代码获取数据源生成报表运行的上下文环境(Context),这里采用将生成Context的代码放在公共类中,每次Jsp发布报表的时候,只需将该类在Jsp内引入即可。

工具类代码如下:

import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.runqian.report4.model.ReportDefine;
import com.runqian.report4.model.engine.ExtCellSet;
import com.runqian.report4.usermodel.Context;
import com.runqian.report4.usermodel.DataSourceConfig;
import com.runqian.report4.util.ReportUtils;

public class CalReportUtils{
public static Context getContext(){
//读取spring配置文件,生成Spring上下文环境
ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{”applicationContext.xml”});
//通过getBean方式获取到Spring配置文件内的数据源,其中”mysqlDataSource”为//Spring内数据库连接池的Bean名称。
DataSource ds = (DataSource)ctx.getBean(”mysqlDataSource”);
Connection connection = null ;
try {
//通过DataSource获取到数据库连接对象connection
connection = ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
//设置报表运算使用的授权文件,这里是固定格式。
String license = “F:/runqianWindowServer.lic”;
ExtCellSet.setLicenseFileName(license);
//创建报表运行时的上下文环境,这里引入类时要注意,应该是润乾包内的Context
Context ct = new Context();
//设置报表设计时使用的数据源名称
ct.setDefDataSourceName(”mysqlCon”);
//设置报表运行的数据库连接
ct.setConnection(”mysqlCon”,connection);
//数据源配置
DataSourceConfig dsoc = new DataSourceConfig(10, true, “GBK”, “GBK”, false);
ct.setDataSourceConfig(”mysqlCon”, dsoc);
//返回报表运行的上下文环境对象ct
return ct;
}
}

2、工具类配置

将编写好的工具类放在应用的Web-inf/classes下,重启应用服务器,使其加载在classpath中。

第三步:defineBean方式发布报表的Jsp文件

这里要采用defineBean的方式发布报表,下面是具体的Jsp例子:

<%@ page language=”java” import=”java.util.*” pageEncoding=”GBK”%>
<%@ taglib uri=”/WEB-INF/runqianReport4.tld” prefix=”report” %>
<%@ page import=”com.runqian.report4.usermodel.Context” %>
//引入报表运行上下文环境工具类
<%@page import=”com.runqian.jolei.common.CalReportUtils”%>
<%@ page import=”java.io.*”%>
<%@ page import=”java.util.*”%>
<%@ page import=”com.runqian.report4.model.ReportDefine” %>
<%@ page import=”com.runqian.report4.util.ReportUtils” %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+”://”+request.getServerName()+”:”+request.getServerPort()+path+”/”;
%>
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
<html>
<head>
<base href=”<%=basePath%>”>
<title>获取Spring数据源方式发布报表</title>
</head>
<body>
<%
//通过工具类获取一个context对象,从而创建出报表运行所需环境
Context ctx = CalReportUtils.getContext();
//报表路径,可相对应用根目录
String reportFilePath = “E:/aaaa.raq”;
InputStream file;
ReportDefine rd = null;
try {
//使用流的方式将报表读入
file = new FileInputStream(reportFilePath);
//使用报表工具类读取报表流,生成ReportDefine报表对象
rd = (ReportDefine)ReportUtils.read( file );
} catch (Exception e) {
e.printStackTrace();
}

request.setAttribute(”reportBean”,rd);
request.setAttribute( “myContext”, ctx );
%>
<table align=center>
<tr><td>
<!-defineBean方式发布报表标签使用,srcType指定为defineBean,beanName指定为request中的名称reportBean,contextName指定为request中的myContext。到此就可以正常发布展现报表了–>
<report:html name=”report1″ srcType=”defineBean” beanName=”reportBean” contextName=”myContext”/>
</td></tr>
</table>
</body>
</html>

发布报表后的显示结果

2.png

到此可以看到,尽管没有在应用服务器上配置数据库连接池,一样可以读取Spring内的数据源配置成功发布报表。

总结:润乾报表中配置数据库连接池的方式有很多种,是能够支持不同客户需求的。本文介绍的发布方式只是其中的一种,比如另外的方式还可以在severlet中实现等。