一.帶查詢功能的報表展示
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下載源碼