一.带查询功能的报表展示
1. 首先从官网下载IRport和JasperReports
Jasperreport下载地址:http://sourceforge.net/projects/jasperreports/files/jasperreports/
Ireport下载地址:http://community.jaspersoft.com/project/ireport-designer/releases
注意:Jasperreport的版本要大于等于Ireport的版本不然会报错
本人使用IReport5.1+jasperReports5.5.6
2. 报表开发
首先使用IReport工具开发.jrxml(网上有很多该工具的使用教程)
多说一句:使用Ireport绑定数据源时,由于使用的数据库不同所以需要加入不同的数据库驱动包,具体是拷贝相应的数据库驱动包反到Ireport安装目录\platform9\lib下即可。
3. 报表编译(编译成. Jasper文件)
3.1.使用Ireport工具编译
设计好报表之后点击preview就会在报表文件夹生成相应的.jasper文件
3.2使用代码编译(在下载的Jasperreport包中\demo\samples\webapp有详细的源码)
3.2.1在eclipse中新建一个web工程
3.2.2导入jar包:新手可以将Jasperreport包中disc和Lib下的包全部导入
我的工程目录
3.2.3将制作好的.jrxml放入相应的工程目录下
3.2.4在web.xml还需要配置一个servlet(用于取数据的在下载的Jasperreport包中\demo\samples\webapp下的web.xml中有源码)
<span style="white-space:pre"> </span><servlet>
<servlet-name>Xml4SwfServlet</servlet-name>
<servlet-class>net.sf.jasperreports.j2ee.servlets.Xml4SwfServlet</servlet-class>
</servlet>
<span style="white-space:pre"> </span><servlet-mapping>
<servlet-name>Xml4SwfServlet</servlet-name>
<url-pattern>/servlets/xml4swf</url-pattern>
</servlet-mapping>
3.2.5新建一个Servlet(核心代码如下)
ServletContext context =this.getServletConfig().getServletContext();
asperCompileManager.compileReportToFile(context.getRealPath("/reports/WebappReport.jrxml"));
4.编译好之后就可以填充数据了(废话不说,直接上代码)
展示页面代码(.jsp)
<div class="content" id="flashView">
<object class="flashSize">
<param name="movie" value="flash/jasperreports-flash-4.5.0.swf" />
<param name="FlashVars"
value="jrpxml=servlets/xml4swf?jrprint=<%=request.getSession().getId() + "_jrprint"%>;<%=new SimpleDateFormat("HH:mm:ss").format(new Date())
.replaceAll(":", "")%>" />
<embed
src="<%=request.getContextPath()%>/flash/jasperreports-flash-4.5.0.swf"
<strong>FlashVars="jrpxml=servlets/xml4swf?jrprint=<%=request.getSession().getId() + "_jrprint"%>;<%=new SimpleDateFormat("HH:mm:ss").format(new Date())
.replaceAll(":", "")%>"</strong>
class="flashSize">
</embed>
</object>
</div>
注意上面加粗部分了吗,主要是为了解决谷歌浏览器中报表查询结果不显示问题
上面代码主要是在.jsp页面中嵌套.swf显示,整个页面的样式,需要根据需求自己添加
页面提交代码(这里我是用的ajax异步提交)
$("#select").click(function(){
//组json串(这样在项目中只需建一个Servlet就可以实现多个查询报表)
//Jasperkey:编译后.jasper的文件名
//paramentrs:参数列表 name:查询条件名称相当于Sql中where子句。(该名//称必须和Ireport设计的查询条件名称相对应)
//Value:查询条件的值(需要动态改变的) type:查询条件值的数据类型
//01:String ,02:int,03:日期(无时分秒),04(有时分秒)
var params = {"jasper" : [ {"jasperkey" : "Test"} ], "parameters" : [ {"name" : "bind_id", "value" : $("#bind_id").val(),"type" : "02"} ] };//如果有多个查询条件只需要添加 <span style="font-family: Arial, Helvetica, sans-serif;">parameters 后面的值</span>
//将json序列化
var paramsString = JSON.stringify(params);
//异步提交表单数据
$.ajax({
url : "SelectServlet",
type : "post",
data : paramsString,
datatype : "json",
contentType : "application/x-www-form-urlencoded; charset=utf-8",
success : function(data) {
$("#flashView").html(data);
},
});
});
后台servlet代码(解析json部分)-->必须导入解析json用到的jar包
String jasperkey = "";//获取.jasper文件名称
String acceptjson = "";// 获取json
String temp = "";//遍历获取的json串
//获取前台提交的json数据
BufferedReader br = new BufferedReader(new InputStreamReader(
(ServletInputStream) request.getInputStream(), "utf-8"));
StringBuffer sb = new StringBuffer();
//从缓冲区中遍历json串
while ((temp = br.readLine()) != null) {
sb.append(temp);
}
br.close();
acceptjson = sb.toString();
Map parameters = new HashMap();// 需要查询的参数
if (!"".equals(acceptjson) && acceptjson !=null) {
JSONObject jo = JSONObject.fromObject(acceptjson); // 将acceptjson转换成json对象
JSONArray jasper = jo.getJSONArray("jasper");// 获取jasper
JSONObject jasperObject = JSONObject.fromObject(jasper.get(0));
jasperkey = (String) jasperObject.get("jasperkey");// 获取.jasper
// 获取查询的参数
JSONArray parameter = jo.getJSONArray("parameters");
for (int i = 0; i < parameter.size(); i++) {
JSONObject parameterObject = JSONObject.fromObject(parameter
.get(i));
if((String)parameterObject.get("value")==null || "".equals((String)parameterObject.get("value"))){
continue;
}else{
String type=(String)parameterObject.get("type");//获取数据类型
//01:String 02 :int 03::日期(无时分秒) 04:日期(有时分秒)i
if("01".equals(type)){//传过来的类型是String
parameters.put(parameterObject.get("name"),(String)parameterObject.get("value"));
}else if("02".equals(type)){//传过来的是int类型
parameters.put(parameterObject.get("name"),Integer.parseInt((String) parameterObject.get("value")));
}else if("03".equals(type)){//传过来的日期没有时分秒
Format f = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = (Date) f.parseObject((String)parameterObject.get("name"));
parameters.put(parameterObject.get("name"),date);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else if("04".equals(type)){传过来的日期有时分秒
Format f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
Date date = (Date) f.parseObject((String)parameterObject.get("name"));
parameters.put(parameterObject.get("name"),date);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
下面是往报表中填充数据代码
PrintWriter out = response.getWriter();
try {
String reportFileName = context.getRealPath("/reports/" + jasperkey
+ ".jasper");
File reportFile = new File(reportFileName);
if (!reportFile.exists())
throw new JRRuntimeException(
"File WebappReport.jasper not found. The report design must be compiled first.");
JasperPrint jasperPrint = JasperFillManager.fillReport(
reportFileName, parameters, BaseDao.getConnection());//BaseDao.getConnection():得到conn
request.getSession().setAttribute(request.getSession().getId() + "_jrprint",jasperPrint);
BaseDao.closeResource();//关闭数据库连接
} catch (JRException e) {
e.printStackTrace();
}
//返回.swf内容用于局部刷新页面
String bb = "jrprint="+request.getSession().getId()+"_jrprint;"+new SimpleDateFormat("HH:mm:ss").format(new Date()).replaceAll(":", "");
String falshVale = "<object class=\"flashSize\">"+
"<param name=\"movie\" value=\"flash/jasperreports-flash-4.5.0.swf\"/>"+
"<param name=\"FlashVars\" value=\"jrpxml=servlets/xml4swf?"+bb+"\" class=\"flashSize\"/>"+
"<embed src=\"flash/jasperreports-flash-4.5.0.swf\""+
"FlashVars=\"jrpxml=servlets/xml4swf?"+bb+"\" class=\"flashSize\"></embed></object>";
out.write(falshVale);
}
5.接下来需要改一下jasperreports.jar中的源代码(解决多用户登录查询到的结果可能一致问题和第一次加载jsp页面没有得到session报错问题)
首先修改net.sf.jasperreports.j2ee.servlets包下BaseHttpServlet,java 大概在源码中55行左右
String jasperPrintSessionAttr = request.getParameter(JASPER_PRINT_REQUEST_PARAMETER);
//获取页面传过来的值,并截取日期前面的部分
jasperPrintSessionAttr = jasperPrintSessionAttr.split(";")[0];
修改net.sf.jasperreports.j2ee.servlets包下XmlServlet.java 大概在源码65行左右
List jasperPrintList = BaseHttpServlet.getJasperPrintList(request);
//当第一次加载页面是jasperPrintList为空直接返回
if (jasperPrintList == null)
{
return;
}
至此一个简单实现flash报表查询的功能实现了
如果需要源码的朋友可以去http://download.csdn.net/detail/jorbiee/7484635下载源码