數(shù)據(jù)源的結(jié)構(gòu)數(shù)據(jù)容器。同時生成報告,Jasper報表引擎獲得來自數(shù)據(jù)源的數(shù)據(jù)。數(shù)據(jù)可以從數(shù)據(jù)庫,XML文件,對象數(shù)組和集合中的對象來獲得。我們將在本章填充報告所看到的fillReportXXX()方法,預(yù)計將收到該報告的數(shù)據(jù)源其以填充,在net.sf.jasperreports.engine.JRDataSource對象或一個java.sql.Connection中的形式(當(dāng)報表數(shù)據(jù)在關(guān)系數(shù)據(jù)庫中找到)。
JRDataSource接口只有兩個方法,這應(yīng)該被實(shí)現(xiàn):
從數(shù)據(jù)源中檢索數(shù)據(jù)的唯一方法是通過使用報表字段。有一個JRDataSource接口的幾個默認(rèn)的實(shí)現(xiàn),根據(jù)不同的數(shù)據(jù)源中的記錄被獲得的方式。
下表總結(jié)了數(shù)據(jù)源和它們的實(shí)現(xiàn)類。
Datasource | Implementation Class |
---|---|
JDBC | net.sf.jasperreports.engine.JRResultSetDataSource |
JavaBean | net.sf.jasperreports.engine.data.JRBeanCollectionDataSource, net.sf.jasperreports.engine.data.JRBeanArrayDataSource |
Map-based | net.sf.jasperreports.engine.data.JRMapArrayDataSource, net.sf.jasperreports.engine.data.JRMapCollectionDataSource |
TableModel | net.sf.jasperreports.engine.data.JRTableModelDataSource |
XML | net.sf.jasperreports.engine.data.JRXmlDataSource |
CSV | net.sf.jasperreports.engine.data.JRCsvDataSource |
XLS | net.sf.jasperreports.engine.data.JRXlsDataSource |
Empty | net.sf.jasperreports.engine.JREmptyDataSource |
JRResultSetDataSource類關(guān)聯(lián)入一個java.sql.ResultSet對象。這是當(dāng)報表數(shù)據(jù)從關(guān)系數(shù)據(jù)庫中提取最常用的數(shù)據(jù)源實(shí)現(xiàn)。如果ajava.sql.Connection傳遞給引擎來代替,它首先執(zhí)行相關(guān)的查詢,并將該返回java.sql.ResultSet中的對象在一個JRResultSetDataSource實(shí)例。
JRBeanArrayDataSource類和JRBeanCollectionDataSource表示實(shí)現(xiàn),可以分別包裝的JavaBean對象的數(shù)組或集合。數(shù)組或集合中的每個對象都將被視為對這種類型的數(shù)據(jù)源中的一個記錄。一個特定的JavaBean屬性和相應(yīng)的報表字段之間的映射是通過命名約定進(jìn)行。報表字段的名稱必須是相同的所指定的JavaBeans的規(guī)范JavaBean屬性的名稱。
在本教程中的所有例子中,我們使用JRBeanCollectionDataSource。
如果父級應(yīng)用程序已經(jīng)存儲在內(nèi)存中的java.util.Map對象提供的申報數(shù)據(jù)的實(shí)現(xiàn)類JRMapArrayDataSource和JRMapCollectionDataSource非常有用。被包裝的數(shù)組或集合中的每個映射對象被認(rèn)為是數(shù)據(jù)源中的一個虛擬的記錄,每個報表字段的值從映射中使用報表字段名作為鍵提取。
在許多客戶端應(yīng)用程序,數(shù)據(jù)以表格形式顯示。在許多應(yīng)用中常見的需求是允許用戶打印該表格形式的報告。實(shí)現(xiàn)類JRTableModelDataSource使生成的表格格式的Swing應(yīng)用程序報告的任務(wù)。這個類封裝了一個javax.swing.table.TableModel對象。列在包裝的TableModel對象可以通過他們的名字或他們的基于0索引來訪問。
類JRXmlDataSource是基于DOM,它使用XPath表達(dá)式來選擇XML文檔數(shù)據(jù)的數(shù)據(jù)源的實(shí)現(xiàn)。 XML數(shù)據(jù)源中的記錄是通過XPath表達(dá)式選擇的節(jié)點(diǎn)元素表示。字段值是由每個記錄使用由字段描述(JRXML<fieldDescription>元素)所提供的XPath表達(dá)式檢索。
XPath是用于導(dǎo)航XML文檔的屬性和元素的語言。有關(guān)XPath更多信息可以在這里找到http://www.w3.org/TR/xpath.
JRCsvDataSource 代表了從結(jié)構(gòu)化文本文件中檢索其數(shù)據(jù)的數(shù)據(jù)源的實(shí)現(xiàn),通常為CSV。字段值是正在使用他們的列索引檢索。
JRXlsDataSource 代表其檢索的Excel文件的數(shù)據(jù)的數(shù)據(jù)源的實(shí)現(xiàn)。報表字段映射為這個數(shù)據(jù)源的實(shí)現(xiàn)也是基于字段列索引。
類JREmptyDataSource,模擬與內(nèi)部虛擬空的記錄給定數(shù)量的數(shù)據(jù)源。它是由用戶界面的工具來提供基本的報表預(yù)覽功能,或在特殊報告模板,或用于測試和調(diào)試目的。
net.sf.jasperreports.engine.JRRewindableDataSource擴(kuò)展的基本JRDataSourceinterface。它增加了只有一個方法為MoveFirst()到接口。這種方法的目的是將光標(biāo)移動到數(shù)據(jù)源中的第一個元素。
與放置在帶內(nèi)子報表不允許拆分由于isSplitAllowed=“false”的設(shè)定,并且沒有足夠的空間,在當(dāng)前頁上對要呈現(xiàn)的子報表工作時,重繞的數(shù)據(jù)源是有用的。
以上所有數(shù)據(jù)源的實(shí)現(xiàn)是可回退除JRResultSetDataSource,因為它不支持移動記錄指針回來。這對只有當(dāng)該數(shù)據(jù)源是用它傳遞給子報表之前手動換一個java.sql.ResultSet中的一個問題。這是沒有問題,如果SQL查詢駐留在子報表模板,該引擎將在下一個頁面上重新啟動子報表時,再次執(zhí)行它。
JasperReports庫有一個接口net.sf.jasperreports.engine.JRDataSourceProvider。這有助于創(chuàng)建和處理數(shù)據(jù)源對象。當(dāng)創(chuàng)建使用GUI工具報表模板,則需要自定義報表的數(shù)據(jù)源的特殊工具。JRDataSourceProvider是為了堵塞自定義數(shù)據(jù)源到設(shè)計工具的標(biāo)準(zhǔn)方法。自定義實(shí)現(xiàn)該接口應(yīng)實(shí)現(xiàn)以下方法,使創(chuàng)建和配置數(shù)據(jù)源對象和方法,上面列出數(shù)據(jù)源如果可能的話,里面可用的報表字段:
public boolean supportsGetFieldsOperation(); public JRField[] getFields(JasperReport report) throws JRException, UnsupportedOperationException; public JRDataSource create(JasperReport report) throws JRException; public void dispose(JRDataSource dataSource) throws JRException;