程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 使用BIRT和Eclipse從數據庫中提取信息

使用BIRT和Eclipse從數據庫中提取信息

編輯:關於JAVA

業務報告和分析是一個復雜的過程,在想要生成一個看起來很專業的報告時,總是很難獲得完美的結果。更難的是定期使用新的或更新的數據重復該練習。Business Intelligence and Reporting Tools (BIRT) 是一組用於 Eclipse 的插件,它允許從數據庫從提取信息,分析該信息,然後生成用於報告的總結、圖表和分析。

開始之前

如果擁有收集或生成數據的程序,並且需要使用各種報告分析的數據,則本教程可以幫助您更好地了解如何使用 Business Intelligence and Reporting Tools (BIRT)。本教程假定您基本上了解 Eclipse 和 Apache Derby。測試數據庫是通過在 Apache Geronimo 上部署示例應用程序實現的。

關於本教程

在本教程中,通過使用 BIRT 和 Eclipse 的 Rich Client Platform (RCP) 技術創建和開發報告,將學習如何在 J2EE 應用程序中使用 BIRT。您將安裝 BIRT 並創建將涉及的第一個報告,從 Derby 數據庫中獲得其數據,並構建後續報告,這些報告從不同的角度分析來自相同數據集的數據。我們將創建一個示例應用程序,收集來自銀行事務的數據。出納員和銀行管理人員將使用 Web 浏覽器輸入事務。該事務包括職員的頭銜、保證金或取款金額和日期。最終結果是可以在任何時間從幾個角度在線分析數據。因此,通讀本教程,您將成為“銀行管理員”,並將使用 BIRT 查看和分析銀行中執行的事務。

前提條件

需要使用以下工具。注意,本教程是使用 Microsoft® Windows® 機器編寫的。不過,在另一台機器上編寫所帶來的細節上的不同應該很少。

Eclipse 和 BIRT —— 本教程使用 BIRT RCP Report Designer V1.0.1。此版本使用 RCP。BIRT RCP build 提供了使用 BIRT 所需的一切事情,其中包括 BIRT V1.0.1、Java 2 JDK V1.4.2、Eclipse Platform Runtime Binary V3.1、GEF Runtime V3.1 和 EMF V2.1.0。您只需要解壓縮下載文件並走開即可。可以從 the BIRT Release Build page 下載 BIRT RCP Report Designer。

BIRT Report Engine —— 需要使 BIRT Report Engine 能夠查看 BIRT 報告。

Geronimo —— 本教程使用 Geronimo M5 來部署示例應用程序和用來查看報告的嵌入式 BIRT 報告對象。

Java —— BIRT、Geronimo 和示例應用程序都需要 Java 技術。此外,示例應用程序需要用於將要創建的 servlet 的 J2EE。本教程使用 Java V1.4.2_09 和 J2EE V1.4。不過,這些工具的任何更高版本也應該能夠勝任。下載合集式的 Java technology bundle。

Derby —— 下載 Derby 並確保已將接收的 .jars 添加到 CLASSPATH 中。

DB2 Drivers —— 本教程使用 IBM DB2® universal drivers 來連接到 Derby。

Ant —— 需要使用 Ant 來構建示例應用程序,因為它簡化了用於 Geronimo 的 WAR 文件的構建過程。

概述

這一節將對您將從本教程中學到哪些內容進行高度概括。

BIRT 報告

傳統報告允許允許企業以圖形形式顯示其他人可讀的數據。BIRT 有助於自動化在部署好的 J2EE 應用程序中創建報告的過程。在本教程中,將學習如何創建一個將使用您的應用程序部署的報告。

示例應用程序

當客戶來到銀行進行取款或匯款時,該事務通常由銀行職員執行。本教程的示例應用程序是一個用戶界面 (UI),該界面將接收事務細節信息,並將它們存儲到一個 Derby 數據庫中。記錄的事務細節信息包括事務日期、事務標題、職員編號、事務類型、取款或匯款數量,等等。

分析數據

當示例應用程序獲取信息並將它們存儲到數據庫中時,數據處於其最原始的形式,沒有能以某種有意義的方式進行查看的可靠組織形式。您開發的 BIRT 將用於分析此數據。

所介紹的每種類型的報告都允許您查看並隨後分析數據庫中包含的數據。

將 BIRT 對象嵌如應用程序

一旦已經完成 BIRT 報告和示例應用程序,就可以將 BIRT 對象嵌入應用程序中。這將使您 —— 銀行管理人員 —— 樂於查看發生在銀行中的事務的趨勢。您將獲得一些知識,這些知識使您作出向更好趨勢更改的決定,並提高銀行的生產效率和性能。

Derby:設置

在這一節中,將創建並初始化具有 BIRT 中要使用的測試數據的 Derby 數據庫。您將通過 Geronimo 的網絡服務器使用 Geronimo 中的內置 Derby 數據庫。在 Geronimo 上部署應用程序時,將使用此數據庫,因此使用內置數據庫是有一定道理的。

設置用於 Derby 的 Geronimo

因為將在用於 BIRT 的 Geronimo 中使用內置 Derby 數據庫,所以需要正確的驅動程序。

有一些 .jars 需要添加到 Geronimo 中:IBM DB2 JDBC Universal Drivers。現在您應該已擁有這兩個文件(請參閱 前提條件)。解壓縮從 IBM 獲得的 .zip 文件。從 lib 目錄中獲得兩個 .jar 文件:db2jcc.jar 和 db2jar_license_c.jar,並將它們放置在 Geronimo 安裝的 <geronimo-install-dir>/repository/org.apache.derby/jars 目錄中。

Geronimo 所需要的一切都已設置完畢!可通過打開控制台並鍵入以下內容來啟動 Geronimo:

java -jar <geronimo-install-dir>/bin/server.jar

運行在 Geronimo 上的 Derby 網絡服務器現在已經准備就緒並將用於偵聽。接下來將連接到網絡服務器來創建和初始化數據庫。

創建 Derby 數據庫

在網絡服務器開始運行之後,將准備創建數據庫。請打開一個控制台並鍵入以下內容:

java org.apache.derby.tools.ij

這將激活 Derby ij 工具,將您帶到 ij 提示符下。可通過在 ij 提示符下鍵入以下內容來創建數據庫:

connect 'jdbc:derby:net://localhost:1527/BANK;\
   create=true:user=bankuser;password=bankpass;';

這將連接到運行在 Geronimo 之上的 Derby 網絡服務器以及新的 BANK 數據庫。現在能夠連接到數據庫並從 BIRT 內部引用它。

現在我們將創建並初始化表。

創建並初始化事務表

事務表將存儲有關銀行中所執行業務的所有信息。可通過鍵入以下內容在 ij 提示符下創建事務表,如清單 1 中所示。

清單 1. 創建事務表

create table transactions
     (transactionid integer not null generated always as identity
(start with 1, increment by 1),
employeeid integer not null,
employeetitle varchar(50),
transactiondate varchar(10),
transactiontype varchar(50),
amount integer,
transactionSrc varchar(50),
transactionDst varchar(50));

剛才我們成功創建了事務表。然後將使用您的報告的測試數據填充它,以便在同一 ij 提示符下執行下一個查詢,如清單 2 所示。

清單 2. 將記錄插入事務表中

insert into transactions (employeeid, employeetitle, transactiondate,
              transactiontype, amount, transactionSrc,
              transactionDst) values
(201, 'LoanOff', '12-08-2005', 'D', 7845, 'Customer', '651232135'),
(203, 'Teller',  '12-08-2005', 'T', 7123, '453780785', '864513215'),
(204, 'Teller',  '12-08-2005', 'W', 3564, '684612312', 'Customer'),
(203, 'Teller',  '12-08-2005', 'D', 1546, 'Customer', '054537563'),
(202, 'SrTeller', '12-08-2005', 'D', 8769, 'Customer', '054537563'),
(203, 'Teller',  '12-09-2005', 'W', 9753, '754350324', 'Customer'),
(201, 'LoanOff', '12-09-2005', 'D', 6482, 'Customer', '878505456'),
(203, 'Teller',  '12-09-2005', 'D', 4657, 'Customer', '040740075'),
(204, 'Teller',  '12-09-2005', 'T', 3542, '192837247', '075663333'),
(203, 'Teller',  '12-09-2005', 'D', 4075, 'Customer', '054537563'),
(202, 'SrTeller', '12-09-2005', 'W',  23, '153057753', 'Customer'),
(203, 'Teller',  '12-09-2005', 'D',  1, 'Customer', '871532404'),
(203, 'Teller',  '12-10-2005', 'D', 4687, 'Customer', '975434231'),
(204, 'Teller',  '12-10-2005', 'T', 4578, '456213546', '075275705'),
(201, 'LoanOff', '12-10-2005', 'D', 9946, 'Customer', '054537563'),
(203, 'Teller',  '12-10-2005', 'W', 1572, '468734234', 'Customer'),
(203, 'Teller',  '12-10-2005', 'D', 999, 'Customer', '345357477'),
(202, 'SrTeller', '12-11-2005', 'D', 2457, 'Customer', '875725075'),
(204, 'Teller',  '12-11-2005', 'W', 7974, '643024563', 'Customer'),
(204, 'Teller',  '12-11-2005', 'T', 500, '23049834', '23049234');

在事務表中應該有 20 條將用作測試數據的記錄。

接下來將介紹 BIRT RCP Report Designer 並分析此數據。

安裝並介紹 BIRT RCP Report Designer

在這一節中,將通過創建您的第一個 BIRT 項目並了解 BIRT 中可用的各種視圖來介紹 BIRT RCP Report Designer。

您的第一個 BIRT 項目

如果還沒有下載並解壓 BIRT,那麼現在就去做它(請參閱 前提條件)。

啟動 BIRT 非常簡單,只需單擊解壓文件時獲得的 BIRT.exe 文件的即可。您應該看到 BIRT 的啟動,如圖 1 中所示。

圖 1. BIRT RCP Report Designer

這就是每次啟動 BIRT 時它看起來的樣子。

現在讓我們來創建您的第一個報告。單擊 File > New Report,將它命名為 bank1.rptdesign。接下來選擇將創建的報告類型:Blank Report,然後單擊 Finish。對於活動報告,BIRT 的外觀將發生變化,會有幾個顯示選項的視圖。參見圖 2。

圖 2. 一份空報告

在初始化您的第一份報告之後,現在將了解 BIRT 中的視圖。

BIRT 中的視圖

BIRT 中有幾個有趣的視圖,其中包括:

Palette調色板使您很容易地將各種報告對象拖放到報告中。Data Explorer

Data Source —— 數據源是將在報告中使用的一些數據庫。本教程將使用一個數據源。

Data Set —— 使用 SQL 查詢數據源,您將獲得將用於報告的數據。

Report Parameter —— 可以使用問號來參數化數據集中用來查詢數據源的 SQL。報告參數用於填充 SQL 中的參數。

Outline提綱顯示了報告中對象的分層結構。您可以使用提綱快速查找報告中將要修改的對象。Property Editor報告中的每個對象都有屬性。例如,標題可以有多個屬性,其中包括字體、粗細度、對齊方式,等等。在這裡可以設置和修改這些屬性。Problems

如果報告出了問題,可以在這裡找到細節信息。

顯示一個空報告的主編輯器視圖(默認為 layout 視圖)

Layout —— 報告您當前所見內容的視圖,如圖 2 中所示。

Preview —— 此選項卡顯示了報告目前看起來的樣子。目前報告是空的,因此該選項卡將顯示一些類似 Report Header、下劃線和粗體字體等選項。您可以很快選定這些選項。

Code —— 報告中所具有的任何代碼或 BIRT 腳本 (JavaScript)。

Cheat Sheets顯示如何在報告中完成某些操作。您不會使用到此視圖,因此可以忽略它。

現在完成了對使用 BIRT RPC Report Designer 時可以使用的視圖的介紹。接下來將創建一個允許填充報告的數據源。

連接到數據源

在這裡將創建一個稱為數據源 的連接,該連接將連接到 Derby: Setting up 中創建的 Derby 數據庫。您還將在數據源上使用 SQL 創建一個數據集。

創建一個新的數據源

在開始查詢數據庫之前,BIRT 要求設置一個數據源。該操作是通過使用 Data Explorer 視圖來完成的:

定位到此 Data Explorer 視圖並單擊 Data Sources。

右擊 Data Sources 並選擇 New Data Source。

在所呈現的列表中選擇 JDBC Data Source。

單擊 Next。

單擊 Manage Drivers 按鈕。

確保 JAR Files 選項卡被選定,並單擊 Add。

查找在 前提條件 中下載的 DB2 驅動程序 jar,選擇第一個 jar 文件 db2jcc.jar,並單擊 Open。

db2jcc.jar 應該出現在 jar 的列表中。再次執行步驟 6 和步驟 7,但這次是添加 db2jcc_license_c.jar 文件。

現在已經實現了將 DB2 驅動程序添加到 BIRT 中的前提條件。單擊 OK。

確保已選定 com.ibm.db2.jcc.DB2Driver (v2.6) 作為 Driver 類。

使用此類作為 Database URL: jdbc:derby:net://localhost:1527/BANK;。

用戶名應該是 bankuser。

口令應該是 bankpass(參見圖 3)。

單擊 Test Connection 按鈕。這確保您可以連接到通過在 Geronimo 上運行的 Derby 網絡服務器創建的 BANK 數據庫。

單擊 Finish。

圖 3. 創建一個數據

太棒了!現在您有了一個數據源,讓我們來創建一個數據集,保存將要分析的報告數據。

在數據源中創建一個數據集

您將使用數據集中查詢的結果來獲得報告中的數據。右擊 Data Sets,然後選擇 New Data Set。一些選項將被顯示,如圖 4 中所示。

圖 4. 用於創建數據集的選項

單擊 Finish。現在應該彈出另一個窗口:Edit Data Set --moneyPerEmployee。使用以下 SQL 替換右邊文本框中的 SQL:

select employeeid, sum(AMOUNT) as totalAmt
from TRANSACTIONS
group by employeeid

單擊 OK。現在數據集已可以用於報告中。通過單擊 Data Explorer 視圖中新創建的數據集旁的 + 符號展開 moneyPerEmployee 數據集。Data Explorer 視圖應該如圖 5 所示。

圖 5. 完成的數據集

讓我們再創建一個數據集。再次右擊 Data Set 對象並選擇 New Data Set,就像以前一樣。這一次,除了將名稱更改為 transactionTypePerDate 之外,仍然選擇同樣的選項。此外,要使用以下內容替換右邊文本框中的 SQL:

select transactiondate, transactiontype, sum(AMOUNT) as totalAmt
from TRANSACTIONS
group by transactiondate, transactiontype

現在應該有兩個數據集,下一節中將使用它們創建一個自定義報告。

棘手的部分處理完了。接下來,我們的重點是基於 BANK 數據庫中的數據創建報告。

設計一個自定義報告

在這一節中,將使用兩個圖表來創建一個自定義報告,這兩個圖表有助於以圖表形式顯示 BANK 數據庫中的數據,因此,銀行管理人員可以更好地分析銀行中發生的事務。

可用的報告類型

有兩種報告類型:清單和圖表。這些類型中又有幾個流派(條形圖、餅圖,等等)。不過,大多數類型都非常類似。兩種主要類型中最難的是圖表,在圖表中,最難的是使用級數並席鍵 (series grouping key) 創建圖表。因此,您將重點創建兩個圖表 —— 一個使用級數並席鍵,而另一個則不。級數並席鍵是將類似的對象沿 X 軸組合在一起的一種方法。例如,請參閱 transactionTypePerDate 數據集的結果,如清單 3 中所示。

清單 3. 來自 transactionTypePerDate 數據集的示例結果

TRANSDATE  TYPE TOTALAMT
12-08-2005 D   18160
12-08-2005 T   7123
12-08-2005 W   92384
12-09-2005 D   15215
12-09-2005 T   3542
12-09-2005 W   9776
12-10-2005 D   15632
12-10-2005 T   4578
12-10-2005 W   1572
12-11-2005 D   2457
12-11-2005 T   500
12-11-2005 W   7974

如果想在單個圖表中顯示某一給定日期處理的所有三種類型的事務量,那麼沿 X 軸方向將有三個級數(每種事務類型一個)和四個點(每天一個)。在上述情況下,級數並席鍵是 TYPE。

還可以使用幾個 BIRT 對象將表和其他對象添加到銀行報告中。在下一節中將了解這些內容。

可用的項

有幾個項可以使用 Palette 插入報告中:

標簽 —— 靜態文本

文本 —— 具有可選的表達式的動態 HTML 文本/純文本

數據 —— 用於插入數據集或表達式結果中

圖像 —— 插入一幅圖像(該圖像可以是一個 URL,比如 HTML)

網格 —— 允許使用列/行布局來顯示項

列表 —— 使用靈活的方式顯示來自數據集的結果列表

表 —— 類似於列表,但以列的形式出現

圖表 —— 插入一個曲線圖

這樣,就可以通過添加您可能想要的其他任何數據項來整理您的報告了。

接下來,將開始定義報告。

為報告創建一個標題

讓我們從標題開始創建您的報告:

定位到 Palette 視圖,並將一個 Label 拖動到空報告的頂部。

雙擊剛才拖動的標簽,並鍵入 BANK OF MARS THE PLANET。

通過定位到 Property Editor 視圖,讓我們將帶點爵士樂特征的音樂添加到文本中。在左邊的文本框中,確保 General 被選定。

單擊 Bold (B) 按鈕。

將 Size 更改為 X-Large。

單擊 Center 按鈕。

將背景色更改為淺藍色。

參見圖 6 查看預覽結果(選擇主窗口中的預覽選項卡)。

圖 6. 報告標題

接下來將在 BIRT 中創建您的第一個圖表。

構造一個圖表

第一個圖表將使用已創建的 moneyPerEmployee 數據集。讓我們開始吧:

定位到 Palette 視圖,並將 Chart 拖動到 Layout View 的主報告中。

選擇 Bar chart 並選擇最右邊的子類型,然後單擊 OK。

在新窗口中,將條形圖的標題更改為 Money Transacted per Employee,然後單擊 Next。

選擇 moneyPerEmployee 數據集,然後單擊 Next。

查找文本 X-Axis Title,將它修改為 Employee ID,然後單擊 Next。

查找文本 Y-Axis Title 並將它修改為 Amount。

將 "Amount" 放在最頂端的文本框中,然後單擊 Next。

在最頂端的文本框 (Data Definitions) 中輸入 row["EMPLOYEEID"],然後單擊 Next。

在 Data Definitions 文本框中輸入 row["TOTALAMT"],然後單擊 OK。

單擊 Preview 選項卡,然後將您的圖表與圖 7 中所示圖表進行比較。

圖 7. 示例圖表輸出

瞧!您已經完成了第一個圖表。接下來將創建允許您擁有一個以上級別(顏色)的另一個圖表!

構造另一個圖表

第二個圖表將使用已創建的 transactionTypePerDate 數據集。讓我們開始吧:

定位到 Palette 視圖,並將 Chart 拖動到恰好位於第一個圖表下方的 Layout View 的主報告中。

選擇 Line 圖表並選擇最右邊的子類型,然後單擊 OK。

在新窗口中,將條形圖的標題更改為 Transacted Money per Day per Transaction Type,然後單擊 Next。

選擇 transactionTypePerDate 數據集,然後單擊 Next。

查找文本 X-Axis Title 並將它修改為 Date,然後單擊 Next。

查找文本 Y-Axis Title 並將它修改為 Amount。

替換最底部文本框中的的 row["TRANSACTIONTYPE"](這是前面介紹的 Series Group Key),然後單擊 Next。

在最頂部的文本框 (Data Definitions) 中輸入 row["TRANSACTIONDATE"],然後單擊 Next。

在 Data Definitions 文本框中輸入 row["TOTALAMT"],然後單擊 OK。

再次單擊 Preview 選項卡,並將您的圖表與圖 8 中所示圖表進行比較。

圖 8. 使用級數並席鍵的示例圖表輸出

這就完成了報告的創建。接下來,將創建一個示例應用程序,將用該程序輸入更多的數據到 Derby 數據庫中。這之後,會將 BIRT 對象嵌入 Java 應用程序中,並能在線查看報告。

示例應用程序

這一節將構建示例應用程序。該程序由 servlet 組成,該 servlet 采用銀行職員輸入的數據,並將此信息存儲在整個教程中都將使用的 Derby 數據庫中。

事務詳細信息

示例應用程序包含一個銀行職員用來輸入關於事務的信息的表單:

Employee ID —— 職員的 ID

Employee Title —— 職員的頭銜

Transaction Date —— 事務的日期

Transaction Type —— 事務的類型(Withdrawal、Deposit 或 Transfer)

Amount —— 事務所涉及的錢數

Transaction Source —— 事務的源(存款的客戶,存款和轉帳的數額)

Transaction Destination —— 事務的目的地(取款的客戶,存款和轉帳的數額)

接下來,將構建用來將事務細節信息插入 Derby 中的用戶界面。

構建 servlet:用戶界面

該 servlet 采用銀行職員輸入的事務數據,並將這些數據保存到 BANK 數據庫中。現在將開始構建示例應用程序。創建一個 BankingServlet.java 文件,並將它存儲在以下位置(以單獨某個應用程序目錄為根目錄):./src/servlets/BankingServlet.java。定義該用戶界面,如清單 4 中所示。

清單 4. 使用 servlet 開發用戶界面

package servlets;
import java.io.*;
import java.util.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class BankingServlet extends HttpServlet {
public static final String form = 
"<form method='post'>\n" +
"Employee ID:<br>\n" +
"<input name='empID' size='25'><br>\n" +
"Employee Title:<br>\n" +
     "<input name='empTitle' size='25'><br>\n" +
"Transaction Date (MM-DD-YYYY):<br>\n" +
     "<input name='transDate' size='25'><br>\n" +
"Transaction Type--Deposit (D), " +
       "Withdrawal (W), Transfer (T):<br>\n" +
"<input name='transType' size='25'><br>\n" +
     "Amount:<br>\n" +
"<input name='amount' size='25'><br>\n" +
     "Transaction Source (Enter Customer, or the account #):<br>\n"+
"<input name='transSrc' size='25'><br>\n" +
     "Transaction Destination (Enter Customer, " +
"or the account #):<br>\n" +
     "<input name='transDst' size='25'><br>\n" +
     "<input type='submit' value='Submit'>\n";
   public void doGet(HttpServletRequest request,
            HttpServletResponse response)
     throws ServletException, IOException {
     response.setContentType("text/html");
     response.setBufferSize(8192);
     PrintWriter out = response.getWriter();
   out.println("<html>" +
           "<head><title>Enter a Transaction</title></head>" +
"<body>" +
           "<h1>Enter a Transaction</h1>\n" +
           form +
           "</form></body></html>");
     out.close();
   }

   public String getServletInfo() {
     return "Enter a transaction!";
   }
}

一些重要的主項用粗體顯示 —— 即用來從銀行職員那裡獲得信息的表單,在第二段粗體代碼塊處,HTML 被寫入浏覽器。該表單看起來應該類似於圖 9。

圖 9. 表單

構建 servlet:將數據存儲到 BANK 數據庫中

現在通過擴展 servlet 來添加一個 doPost() 函數,該函數通過 POST 獲得從表單提交的數據,然後處理它,並將它存儲在 BANK 數據庫中。

繼續定義 BankingServlet.java 文件,如清單 5 中所示。

清單 5. 檢索 POST 請求

...
         "</form></body></html>");
     out.close();
   }

   public void doPost(HttpServletRequest request,
             HttpServletResponse response)
     throws ServletException, IOException {
     response.setContentType("text/html");
     response.setBufferSize(8192);
     PrintWriter out = response.getWriter();
     out.println("<html>" +
           "<head><title>Enter a Transaction</title></head>" +
"<body>" +
           "<h1>Enter a Transaction</h1>\n");
   String empID_str = request.getParameter("empID");
     String empTitle = request.getParameter("empTitle");
     String transDate = request.getParameter("transDate");
     String transType = request.getParameter("transType");
     String amount_str = request.getParameter("amount");
     String transSrc = request.getParameter("transSrc");
     String transDst = request.getParameter("transDst");
...

doPost() 方法(如清單 5 中所示)通過從所接收 POST 請求獲得所有參數開始著手。接下來,將采用此數據驗證已經輸入的職員 ID,並將此信息存儲到數據庫中。參見清單 6。

清單 6. 處理 POST 請求,並將它存儲到數據庫中

...
     String transSrc = request.getParameter("transSrc");
     String transDst = request.getParameter("transDst");
     boolean result = false;
   if ((empID_str != null) && (empID_str.length() > 0)) {
int empID = Integer.parseInt(empID_str);
int amount = Integer.parseInt(amount_str);
Driver driver = null;
try {
       driver = (Driver)
           (com.ibm.db2.jcc.DB2Driver.class).newInstance();
} catch(Exception e) {
         throw new IllegalArgumentException("Unable to load, " +
           "instantiate, or register driver " + driver +
           ": "+e.getMessage());
       }

       try {
       Properties prop = new Properties();
         prop.put("user", "bankuser");
         prop.put("password", "bankpass");
         Connection conn = driver.
           connect("jdbc:derby:net://localhost:1527/BANK;",
               prop);
String sql = "insert into transactions "+
           "(employeeid, employeetitle, transactiondate, "+
           "transactiontype, amount, transactionSrc, "+
"transactionDst) values "+
           "(?, ?, ?, ?, ?, ?, ?)";

PreparedStatement statement = 
           conn.prepareStatement(sql);
         statement.setInt(1, empID);
         statement.setString(2, empTitle);
         statement.setString(3, transDate);
         statement.setString(4, transType);
         statement.setInt(5, amount);
         statement.setString(6, transSrc);
         statement.setString(7, transDst);
         statement.execute();
         result = true;
...

如果輸入的是一個有效職員 ID,則使用 BIRT 中設置的 Driver 建立到 BANK 數據庫的連接。然後創建一個可參數化的 INSERT SQL 語句,來自 POST 請求的數據將變成參數。最後執行 SQL 語句,並將 result 設置為 true(以前為 false),指示數據庫事務中沒有發生錯誤/異常。最後一段將通過捕獲所有異常開始。參見清單 7。

清單 7. 使用 servlet 開發用戶界面

...
         statement.execute();
         result = true;
       } catch(Throwable e) {
         result = false;
         e.printStackTrace();
         System.out.println(e.getMessage());
         System.out.println("Error executing query");
         out.println("Error in SQL!<br>");
       }
     }
   if(result)
       out.println("Transaction entered!<br>" + form);
     else
       out.println("Invalid, try again!<br>" + form);
     out.println("</form></body></html>");
     out.close();
   }

   public String getServletInfo() {
... 

注意,如果拋出異常,則 result 仍然為 false。然後事務成功或失敗的通知會出現屏幕上,這之後出現的是一個表單,以便銀行職員可以立刻輸入另一個事務。

至此結束了 servlet。其余小節將重點介紹如何在 Geronimo 上部署和構建應用程序。

Geronimo 細節說明:geronimo-web.xml

Geronimo 在部署應用程序時需要幾樣小東西。在這裡,只有兩個促進 Geronimo 上的應用程序部署的文件需要創建,這兩個文件是:geronimo-web.xml (Geronimo-specific) 和 web.xml (J2EE-specific)。將它們都存儲在 ./WEB-INF/ directory 中。定義 geronimo-web.xml,如清單 8 中所示。

清單 8. 定義 geronimo-web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app
   xmlns="http://geronimo.apache.org/xml/ns/j2ee/web-1.0"
   xmlns:sec="http://geronimo.apache.org/xml/ns/security-1.0"
   configId="com/ibm/eclipse/birtDemo">

  <dependency>
   <uri>org.apache.derby/jars/db2jcc.jar</uri>
</dependency>
<dependency>
   <uri>org.apache.derby/jars/db2jcc_license_c.jar</uri>
  </dependency>

  <context-root>/birtDemo</context-root>
  <context-priority-classloader>false</context-priority-classloader>
</web-app>

configId 是與 Geronimo 中的應用程序有關的 ID。接下來根據依賴關系指定兩個添加到 Geronimo 儲存庫的 .jar 文件,以便 Geronimo 可以使用應用程序動態加載它們。這些 jar 是一些 DB2 驅動程序。最後,指定在 Geronimo 上的什麼地方可以查看應用程序 birtDemo(在這裡該位置是 http://localhost:8080/birtDemo)。

接下來將定義 web.xml 文件。

J2EE 細節說明:web.xml

web.xml 文件定義一些標准 J2EE 屬性。定義 web.xml 文件,如清單 9 中所示。

清單 9. 定義 web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/
ns/j2ee/web-app_2_4.xsd"
      version="2.4">
  <servlet>
<display-name>BankingServlet</display-name>
   <servlet-name>BankingServlet</servlet-name>
<servlet-class>servlets.BankingServlet</servlet-class>
   </servlet>

  <servlet-mapping>
<servlet-name>BankingServlet</servlet-name>
   <url-pattern>/transaction.html</url-pattern>
</servlet-mapping>

</web-app>

servlet 標記將二進制 BankingServlet 文件與 Geronimo 在 servlet-mapping 標記中使用的名稱關聯起來。servlet-mapping 標記指定放置 servlet 的位置,因此如果浏覽器指向該位置,則 servlet 將被激活(在這裡,該位置是 http://localhost:8080/birtDemo/transaction.html)。

下一步將使用 Ant 構建應用程序。

使用 Ant 構建應用程序

要構建應用程序,則需要定義一個 build.xml 文件並將它存儲到根目錄下,如果清單 10 中所示。

清單 10. 定義 build.xml

<?xml version="1.0"?>
<project name="build" default="war" basedir=".">
  <property name="java.home" value="c:/j2sdk1.4.2_09"/>
<property name="j2ee.home" value="c:/Sun/AppServer"/>
<property name="src.dir" value="src"/>
<property name="dest.dir" value="bin"/>

  <target name="compile">
   <mkdir dir="${dest.dir}"/>
   <javac srcdir="${src.dir}" destdir="${dest.dir}">
<classpath path="${java.home}/lib/tools.jar"/>
    <classpath path="${j2ee.home}/lib/j2ee.jar"/>
</javac>
  </target>
  <target name="war" depends="compile">
<war destfile="birtDemo.war" webxml="WEB-INF/web.xml">
    <zipfileset file="WEB-INF/geronimo-web.xml" prefix="WEB-INF"/>
<classes dir="${dest.dir}"/>
   </war>
</target>
</project>

第一個目標標記 compile 編譯 servlet,並將它存儲到第二個目標標記 war 的適當位置。第二個標記將使用 web.xml、geronimo-web.xml 和已編譯好的 servlet 文件,並將它們保存在一個 web 歸檔 (WAR) 文件 birtDemo.war 中,准備在 Geronimo 上部署它。

在 Geronimo 上部署和測試應用程序

要知道應用程序是否已經為用於 BIRT 對象做好准備,則需要在 Geronimo 上部署並測試它。可鍵入以下內容在 Geronimo 上部署應用程序:

java -jar <geronimo-install-dir>/bin/deployer.jar
    --user system --password manager deploy birtDemo.war

現在已經在 Geronimo 上部署好了應用程序,接下來要打開一個 Web 浏覽器,使其指向 http://localhost:8080/birtDemo/transaction.html。浏覽器現在看起來應該如 圖 9 所示。

在表單中輸入信息,如圖 10 中所示。

圖 10. 輸入一個新事務

單擊 Submit。如果一切順利,您將得到以下浏覽器輸出,如圖 11 中所示。

圖 11. 某一成功事務的示例浏覽器輸出

該應用程序是有效的,所以現在讓我們導入 BIRT 對象並在線分析一些數據。

查看 Geronimo 中的 BIRT 報告

這一節將復習如何查看 Geronimo 中的報告。首先將在 Geronimo 上部署 BIRT 觀察器以及 .rpt 設計文件(BIRT 文件)。然後將直接從 Geronimo 查看此 BIRT 報告。

將 BIRT 觀察器和示例應用程序進行打包

將 BIRT 觀察器和示例應用程序打包到 .war 文件中,將 BIRT 觀察器嵌套在應用程序中。這還允許您在任意時間在銀行職員添加事務時在線查看報告。

跟隨以下步驟打包 BIRT 觀察器和應用程序:

定位到 < BIRT Report Engine-install-dir >。

創建一個新目錄,合並目錄,並將 birt.war 復制到此目錄中。

輸入此目錄並通過鍵入以下內容來取消 birt.war 的歸檔:jar -xf birt.war(這是必需的,因為 "Web Viewer Example" 中有一個 bug)。

刪除 birt.war 文件。

將 birtDemo.war 應用程序文件復制到 < BIRT Report Engine-install-dir > /merge 目錄中。

通過鍵入 jar -xf birtDemo.war 取消對 birtDemo.war 的歸檔。

刪除 birtDemo.war。

合並以下兩個文件:WEB-INF/web.xml 和 WEB-INF/web-template.xml。復制 WEB-INF/web.xml 的內容(屬於應用程序),並替換 WEB-INF/web-template.xml 中的 @generate@ 語句(參見清單 11)。

刪除原有的 web.xml 文件,並將 web-template.xml 更改為 web.xml。

將報告文件 bank1.rptdesign 從 < BIRT-install-dir > /workspace/bank1.rptdesign 復制到 < BIRT Report Engine-install-dir > /merge。

最後,通過鍵入 jar -cf birtDemo.war * 對已合並的 Web 應用程序進行 Web 歸檔。

清單 11. 將 web.xml 追加到 web-template.xml 末尾

...
  <servlet-mapping>
<servlet-name>ViewerServlet</servlet-name>
   <url-pattern>/toolbar</url-pattern>
  </servlet-mapping>

  <servlet>
<display-name>BankingServlet</display-name>
   <servlet-name>BankingServlet</servlet-name>
<servlet-class>servlets.BankingServlet</servlet-class>
</servlet>
<servlet-mapping>
   <servlet-name>BankingServlet</servlet-name>
   <url-pattern>/transaction.html</url-pattern>
</servlet-mapping>
</web-app>

接下來,將重新部署應用程序,並測試它。

在 Geronimo 上部署 combined .war 文件

現在已使查看器和應用程序在一個 .war 文件中。接下來需要重新部署應用程序,替換 Geronimo 中原有的應用程序。鍵入以下內容來重新部署新創建的、已合並的 .war 文件:

java -jar <geronimo-install-dir>bin/deployer.jar
    --user system --p password manager
    redeploy birtDemo.war com/ibm/eclipse/birtDemo

合並的應用程序已安裝在 Geronimo 上並准備測試。

查看嵌入在應用程序中的 BIRT 報告

現在到了激動人心的部分,您將在 Geronimo 上測試嵌入的 BIRT 報告。將浏覽器指向以下 URL:

http://localhost:8080/birtDemo/frameset?__report=bank1.rptdesign

這將提出您的報告,正如 BIRT RCP Report Designer 中所做的那樣。如果想要 PDF 格式而不是 HTML 格式的輸出,則將浏覽器指向上述 URL:

&__format=pdf

參見圖 12,那裡有一個報告的屏幕截圖。

圖 12. 查看 Geronimo 中的報告

很酷,不是嗎?您可以在任何您希望的時間查看報告。只需將浏覽器指向它們即可,銀行將做什麼無關緊要。

接下來,將嘗試將更多的事務添加到系統中,並在線查看這些更改。

添加更多的事務並觀察存在哪些不同

通過利用創建的用戶界面添加一些新的記錄,讓我們查看一下在線報告是否真的有用。將浏覽器指向事務頁面 (http://localhost:8080/birtDemo/transaction.html)。

在不創建新的日期的情況下添加新的記錄。此外,添加 2005 年 12 月 10 日的一筆 $50,000 的取款,並在生成報告時驗證那一日發生的更改。輸入新的記錄,如圖 13 所示。

圖 13. 添加 12-10-2005 的一筆 $50,000 的取款

單擊 Submit。退回到報告所在的浏覽器,並按住 shift 單擊浏覽器上的 reload 按鈕。此操作將刷新報告,不管浏覽器的緩存數據和保存數據如何。新報告看起來應該如圖 14 所示。

圖 14. 查看 BIRT 報告中數據庫發生的更改

結束語

祝賀您! 您已經成功地掌握了如何使用為 Eclipse 開發的 Business Intelligence 和 Reporting Tools,並將它與 Derby 數據庫集成在一起。然後您將新的 BIRT 對象嵌套在示例應用程序中,所有部署都是在 Geronimo 應用服務器上進行的。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved