報表引擎API開發入門— EJB程序數據源

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

1、 實現原理

FineReport報表的數據來源能夠是任何類型的數據,由於FineReport是經過AbstractTableData抽象類來讀取數據源的,所以用戶只要實現了AbstractTableData抽象類,也就能夠用自定義類型的程序數據集,FineReport報表引擎就可以讀取定義的數據源做爲報表數據源使用。AbstractTableData抽象類主要有5個方法,具體使用可參考報表引擎API開發入門—簡單程序數據集。EJB程序數據源準備數據使用方法init(),獲取到ejb的javaBean,從而保存數據到ArrayList中。數據庫

2、 實現步驟

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

相關文章
相關標籤/搜索