使用现有数据库连接展现报表组

需求背景

这段时间常常有客户会有这样的问题:在我们的应用中已经有现成的数据库Connection了,如何使用这个connection通过bean方式发布报表组呢?

问题分析

针对这个需求,客户在实际操作的时候无一例外的遇到了数据源连接不上的问题,所以这个问题就是我们今天解决的重点,首先我们要看一下客户的实现源码:

<%@ page contentType=“text/html;charset=GBK” %>

<%@ taglib uri=“/WEB-INF/runqianReport4.tld” prefix=“report” %>

<%@ page import=“com.runqian.report4.usermodel.*”%>

<%@ page import=“com.runqian.report4.util.ReportUtils2″ %>

<%@ page import=“com.runqian.base4.util.DBTypes” %>

<%@ page import=“java.sql.*”%>

<%@ page import=“java.util.*”%>

<%@ page import=“runqian.ConnectDemo”%>

<html>

<body topmargin=0 leftmargin=0 rightmargin=0 bottomMargin=0>

<%

Connection con = null;

try{

//获取请求报表组文件名

request.setCharacterEncoding( “GBK” );

String report = request.getParameter( “rpg” );

report = “group.rpg”;

StringBuffer param=new StringBuffer();

//保证报表名称的完整性

int iTmp = 0;

if( (iTmp = report.lastIndexOf(“.rpg”)) <= 0 ){

report = report + “.rpg”;

iTmp = 0;

}

Context context = new Context();

//自定义数据源

con = ConnectDemo.getConnection();

context.setDefDataSourceName(“demo”);

context.setConnection(“demo”, con);

DataSourceConfig dsoc = new DataSourceConfig(DBTypes.UNKNOWN, true, “GBK”, “GBK”, false);//数据库类型(DBTypes.UNKNOWN)

context.setDataSourceConfig(“demo”, dsoc);

context.setDefDataSourceName(“demo”);

ReportGroup rg = ReportUtils2.readReportGroup(report, context);

Enumeration paramNames = request.getParameterNames();

if(paramNames!=null){

while(paramNames.hasMoreElements()){

String paramName = (String) paramNames.nextElement();

String paramValue=request.getParameter(paramName);

if(paramValue!=null){

//把参数拼成name=value;name2=value2;…..的形式

param.append(paramName).append(“=”).append(paramValue).append(“;”);

}

}

}

request.setAttribute(“group”,rg);

//request.setAttribute(“contextName1″,context);

%>

<table id=rpt align=center><tr><td>

<table align=center>

<tr><td>

<report:group srcType=“bean”

beanName=“group”

params=<%=param.toString() %>

needPrint=“no”

needSaveAsExcel=“no”

needSaveAsPdf=“no”

needSaveAsWord=“no”

funcBarLocation=“”

needPrint=“no”

/>

</td></tr>

</table>

<%}catch(Exception e){

e.printStackTrace();

}finally{

con.close();

}

%>

</body>

</html>

访问一下这个页面,问题出现了,如下图:

这样实现的确有问题,但是问题到底出在哪呢?

经过分析我们发现,报表组中因为不存在类似单独报表的beanName这样的标签,所以在报表发布的时候无法找到当前上下文,也就无法取得上面设置的数据源了。如果能有一个上下文根,我们将数据源放入其中,那么在任何需要的时候就都能取得了。其实润乾是有这样的函数的。

解决步骤

我们将上述程序中的Context context = new Context();修改为:Context context = Context.getInitCtx(); 即可。

查看API看一下这个函数的具体含义:

所以,它正是我们所需要的。

最后,我们看一下,修改后页面展示的效果: