咱們前面講了幾個數據源,今天咱們來說一下EJB數據源,這篇講完咱們數據源這部分就講完了。數據鏈接不須要直接訪問數據庫,而是使用EJB作爲數據源。FR經過定義程序數據集使用EJB的相關類獲取到EJB數據源,而後轉爲咱們裏面的二維表做爲報表數據源使用,進行展現。例如以下獲取到ejb數據所作的模板。
java
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服務器,預覽模板就能夠成功訪問到模板了!this