Posted on 2015-09-01 09:46
FineReport——報表技術領跑者 閱讀(111)
評論(0) 編輯 收藏
我們前面講了幾個數據源,今天我們來講一下EJB數據源,這篇講完我們數據源這部分就講完了。數據連接不需要直接訪問數據庫,而是使用EJB做為數據源。FR通過定義程序數據集使用EJB的相關類獲取到EJB數據源,然后轉為我們里面的二維表作為報表數據源使用,進行展示。例如如下獲取到ejb數據所做的模板。

一、 實現原理
FineReport報表的數據來源可以是任何類型的數據,因為FineReport是通過AbstractTableData抽象類來讀取數據源的,因此用戶只要實現了AbstractTableData抽象類,也就可以用自定義類型的程序數據集,FineReport報表引擎就能夠讀取定義的數據源作為報表數據源使用。AbstractTableData抽象類主要有5個方法,具體使用可參考報表引擎API開發入門—簡單程序數據集。EJB程序數據源準備數據使用方法init(),獲取到ejb的javaBean,從而保存數據到ArrayList中。
二、 實現步驟
2.1 定義程序數據源
定義DataModelDemo這個類代碼如下:
package com.fr.data;
import javax.naming.*;
import javax.ejb.*;
import java.rmi.*;
import java.util.*;
import com.fr.data.AbstractTableData;
import examples.ejb.ejb20.basic.beanManaged.*;
public class DataModelDemo extends AbstractTableData {
private String[] columnNames;
private ArrayList valueList = null;
public DataModelDemo() {
String[] columnNames = { "Name", "Score" };
this.columnNames = columnNames;
}
// 實現其他四個方法
public int getColumnCount() {
return columnNames.length;
}
public String getColumnName(int columnIndex) {
return columnNames[columnIndex];
}
public int getRowCount() {
init();
return valueList.size();
}
public Object getValueAt(int rowIndex, int columnIndex) {
init();
return ((Object[]) valueList.get(rowIndex))[columnIndex];
}
// 準備數據
public void init() {
// 確保只被執行一次
if (valueList != null) {
return;
}
// 保存得到的結果集
valueList = new ArrayList();
Context ctx = null;
Account ac = null;
AccountHome home = null;
try {
// Contact the AccountBean container (the "AccountHome") through
// JNDI.
ctx = new InitialContext();
home = (AccountHome) ctx
.lookup("java:/comp/env/BeanManagedAccountEJB");
double balanceGreaterThan = 100;
Collection col = home.findBigAccounts(balanceGreaterThan);
if (col != null) {
// 用對象保存數據
Object[] objArray = null;
Iterator iter = col.iterator();
while (iter.hasNext()) {
Account bigAccount = (Account) iter.next();
objArray = new Object[2];
objArray[0] = bigAccount.getPrimaryKey();
objArray[1] = new Double(bigAccount.balance());
// 在valueList中加入這一行數據
valueList.add(objArray);
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
注:使用之前需要先導入ejb的jar包
2.2 編譯程序數據源
將編譯后的DataModelDemo.class放到項目的WEB-INF下面的classes目錄下,因為DataModelDemo.java屬于包com.fr.data,所以DataModelDemo.class需要放到classes\com\fr\data目錄下。
2.3 配置程序數據源
新建報表,在報表數據集中新建程序數據源,選擇我們定義好的程序數據集,如下圖,名字可以自定義,如Pro。

2.4 使用程序數據源
配置好程序數據源后便可以使用定義的Pro程序數據集了,與其他類型的數據集使用方法是相同的,可以通過拖拽方法實現單元格數據列綁定。如下圖

保存模板到ejb項目環境下,啟動Examples Server服務器,預覽模板就可以成功訪問到模板了!