带参数模板的折叠报表实现
关于快逸折叠报表的实现已经有相关文章或例子进行过介绍,本文将在原有折叠报表的基础上,实现带有参数模板的折叠报表。
实现难点
我们原来制作的折叠报表是使用超链接传参数控制隐藏行实现的,每次要传递的参数放到form中保存,通过request传递给报表。
而参数模板的查询会跳转到servlet进行处理,其间会将原来放到request中的内容(参数和参数值等)一直保存,servlet处理后将request中的内容输出到url中,而且url不再变化,直到进行下一次查询。
这就导致了当通过参数模板查询数据后,再点击折叠报表必要的参数就无法通过request传递给报表了。
所以必须想办法将要传递的参数拼到现有不变的url中,可以先获取到现有的url,将需要传递的参数拼接到其中,然后再将拼好的串返回到url中。
实现步骤
通过超链接隐藏行做一张带有参数模板的折叠报表,发布后,点击查询可以看到折叠报表无法正常展开了。
我们来修改一下发布报表的jsp,js部分:
//获得当前浏览器url
var url = window.location.href;
var new_url;
//判断
if(url.indexOf(“show_groups=”)<0){//若url中不包含show_groups字样,说明报表无展开
frm.submit();//此时不改变url,使用原有方式提交表单
}else{//若url中包含show_groups字样,说明折叠报表有部分展开并进行了参数查询
new_url = url.substr(0,url.indexOf(“show_groups=”)+12)+groups+url.substr(url.indexOf(“&context_name=”),url.length);//拼接url
window.location.href=new_url;//将修改后url串返回浏览器,不进行表单提交
}
重新访问该报表,可以看到报表查询后可以正常展开折叠
部分主要代码:
<%
request.setCharacterEncoding( “GBK” );
Exception exp = null;
Context ctx = null;
String contextName = request.getParameter(“context_name”);
String raqFile = request.getParameter(“raq”);
String showGroups = “”;
session.setMaxInactiveInterval(-1);
try{
if(raqFile==null || “”.equals(raqFile)) throw new Exception(“未指定报表模版名!“);
// 没有context_name参数,说明页面第一次被访问,构建一个context
if(contextName==null || “”.equals(contextName)){
// 读取报表模版
ReportDefine rd = (ReportDefine)ReportUtils.read(application.getResourceAsStream(Context.getMainDir()+“/”+raqFile));
ctx = new Context();
// 因为要将context存在session中,所以名称最好加上一些随机值,此处省略…
contextName = “report_context”;
}
else{
ctx = (Context)session.getAttribute(contextName);
if(ctx==nullthrow new Exception(“找不到Context!“);
// 如果是数组参数,传入context 要用ArrayList类
showGroups = request.getParameter(“show_groups”);
String gs[] = showGroups.split(“,”);
ArrayList al = new ArrayList();
for(int i=0;i<gs.length;i++) al.add(gs[i]);
ctx.setParamValue(“show_groups”,al);
}
// 保存到session中,供下次使用
session.setAttribute(contextName,ctx);
// 保存到request中,传给报表
request.setAttribute(contextName,ctx);
}
catch(Exception e){
exp = e;
e.printStackTrace();
}
%>
<html>
<head>
<title>折叠报表例子2</title>
<script language=“javascript”>
// 参数是要折叠/展开的组名
function _changeShowGroup(group){
//alert(“B10内容:“+group);
var frm = document.tree_params;
var groups = frm.show_groups.value;
//alert(“frm.show_groups->”+groups);
// 重新组装参数…
var isInGroup = false;
var gs = groups.split(“,”);
groups = “”;
for(var i=0;i<gs.length;i++){
if(gs[i]!=group)
groups += gs[i]+“,”;
else
isInGroup = true;
}
if(!isInGroup) groups += group;
// 清除首尾多余的逗号
while(groups.substr(groups.length-1,1)==“,”) groups = groups.substring(0,groups.length-1);
while(groups.substr(0,1)==“,”) groups = groups.substring(1,groups.length);
//alert(“处理后groups:”+groups)
// 填值,提交
frm.show_groups.value = groups;
//获得当前浏览器url
var url = window.location.href;
var new_url;
//判断
if(url.indexOf(“show_groups=”)<0){//若url中不包含show_groups字样,说明报表无展开
frm.submit();//此时不改变url,使用原有方式提交表单
}else{//若url中包含show_groups字样,说明折叠报表有部分展开并进行了参数查询
new_url = url.substr(0,url.indexOf(“show_groups=”)+12)+groups+url.substr(url.indexOf(“&context_name=”),url.length);//拼接url
window.location.href=new_url;//将修改后url串返回浏览器,不进行表单提交
}
//alert(“放到form里的groups:”+frm.show_groups.value);
//frm.submit();
}
</script>
</head>
<body>
<form name=“tree_params” action=“” method=“post”>
<input type=“hidden” name=“context_name” value=“<%=contextName %>“>
<input type=“hidden” name=“show_groups” value=“<%=showGroups %>“>
</form>