使用现有数据库连接展现报表组
需求背景
这段时间常常有客户会有这样的问题:在我们的应用中已经有现成的数据库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=leftmargin=rightmargin=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看一下这个函数的具体含义:
所以,它正是我们所需要的。
最后,我们看一下,修改后页面展示的效果: