历史版本1 :EJB程序数据源 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:
数据连接不需要直接访问数据库,而是使用EJB做为数据源。FR通过定义程序数据集使用EJB的相关类获取到EJB数据源,然后转为我们里面的二维表作为报表数据源使用,进行展示。例如如下获取到ejb数据所做的模板。

1. 实现原理编辑

FineReport报表的数据来源可以是任何类型的数据,因为FineReport是通过AbstractTableData抽象类来读取数据源的,因此用户只要实现了AbstractTableData抽象类,也就可以用自定义类型的程序数据集,FineReport报表引擎就能够读取定义的数据源作为报表数据源使用。AbstractTableData抽象类主要有5个方法,具体使用可参考简单程序数据集实现原理文档。EJB程序数据源准备数据使用方法init(),获取到ejb的javaBean,从而保存数据到ArrayList中。

2. 实现步骤编辑

2.1 定义程序数据源
定义DataModelDemo这个类代码如下:
  1. package com.fr.data;  
  2. import javax.naming.*;  
  3. import javax.ejb.*;  
  4. import java.rmi.*;  
  5. import java.util.*;  
  6. import com.fr.data.AbstractTableData;  
  7. import examples.ejb.ejb20.basic.beanManaged.*;  
  8. public class DataModelDemo extends AbstractTableData {  
  9.     private String[] columnNames;  
  10.     private ArrayList valueList = null;  
  11.     public DataModelDemo() {  
  12.         String[] columnNames = { "Name""Score" };  
  13.         this.columnNames = columnNames;  
  14.     }  
  15.     // 实现其他四个方法  
  16.     public int getColumnCount() {  
  17.         return columnNames.length;  
  18.     }  
  19.     public String getColumnName(int columnIndex) {  
  20.         return columnNames[columnIndex];  
  21.     }  
  22.     public int getRowCount() {  
  23.         init();  
  24.         return valueList.size();  
  25.     }  
  26.     public Object getValueAt(int rowIndex, int columnIndex) {  
  27.         init();  
  28.         return ((Object[]) valueList.get(rowIndex))[columnIndex];  
  29.     }  
  30.     // 准备数据  
  31.     public void init() {  
  32.         // 确保只被执行一次  
  33.         if (valueList != null) {  
  34.             return;  
  35.         }  
  36.         // 保存得到的结果集  
  37.         valueList = new ArrayList();  
  38.         Context ctx = null;  
  39.         Account ac = null;  
  40.         AccountHome home = null;  
  41.         try {  
  42.             // Contact the AccountBean container (the "AccountHome") through  
  43.             // JNDI.  
  44.             ctx = new InitialContext();  
  45.             home = (AccountHome) ctx  
  46.                     .lookup("java:/comp/env/BeanManagedAccountEJB");  
  47.             double balanceGreaterThan = 100;  
  48.             Collection col = home.findBigAccounts(balanceGreaterThan);  
  49.             if (col != null) {  
  50.                 // 用对象保存数据  
  51.                 Object[] objArray = null;  
  52.                 Iterator iter = col.iterator();  
  53.                 while (iter.hasNext()) {  
  54.                     Account bigAccount = (Account) iter.next();  
  55.                     objArray = new Object[2];  
  56.                     objArray[0] = bigAccount.getPrimaryKey();  
  57.                     objArray[1] = new Double(bigAccount.balance());  
  58.                     // 在valueList中加入这一行数据  
  59.                     valueList.add(objArray);  
  60.                 }  
  61.             }  
  62.         } catch (Exception ex) {  
  63.             ex.printStackTrace();  
  64.         }  
  65.     }  
  66. }  
注:使用之前需要先导入ejb的jar包
另:最新的代码链接fine-help
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服务器,预览模板就可以成功访问到模板了!