zoukankan      html  css  js  c++  java
  • 报表引擎API开发入门— EJB程序数据源

    我们前面讲了几个数据源,今天我们来讲一下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需要放到classescomfrdata目录下。
    2.3 配置程序数据源
    新建报表,在报表数据集中新建程序数据源,选择我们定义好的程序数据集,如下图,名字可以自定义,如Pro。

    2.4 使用程序数据源
    配置好程序数据源后便可以使用定义的Pro程序数据集了,与其他类型的数据集使用方法是相同的,可以通过拖拽方法实现单元格数据列绑定。如下图

    保存模板到ejb项目环境下,启动Examples Server服务器,预览模板就可以成功访问到模板了!

  • 相关阅读:
    Python requests“Max retries exceeded with url” error
    命令行链接mongo、redis、mysql
    python 删除字典某个key(键)及对应值
    python标准模块(二)
    python标准模块(一)
    格式化输出
    LeetCode----1. Two Sum
    文件操作(初阶)
    python函数基础
    python3内置函数
  • 原文地址:https://www.cnblogs.com/liang123/p/6325073.html
Copyright © 2011-2022 走看看