前次,我曾經介紹過可以通過使用JRBeanCollectionDataSource()返回一個JRDataSource,當時javabean 的數據類型都是原始類型,不曾碰到過使用集合類的復合javabean。這次考慮仍然使用javabean 來構造數據源,由于對ireport的datasource的處理機制不是很熟悉,經過很多次嘗試后才摸索出一個往子報表插入特定數據源的辦法(不是傳遞父報表的數據源,而是將父報表的一個變量當成數據源傳遞給子報表!)
DEMO:
準備工作:
一、程序準備:
1、 創建復合javabean :MainVO.java:(getter和setter方法自寫)
package com.test; import java.util.List; public class MainVO { private String title; private String time; private List<SubVO> subList; } |
2、 創建子表javabean:SubVO.java(getter和setter方法自寫)
package com.test; public class SubVO { private String name; |
3、 創建JRAbstractBeanDataSourceProvider:TestSubReport.java
package com.test; public class TestSubReport extends JRAbstractBeanDataSourceProvider { public TestSubReport() { super(MainVO.class); } public JRDataSource create(JasperReport arg0) throws JRException { /** *測試數據,在使用中,不需要繼承JRAbstractBeanDataSourceProvider, *只需要把集合類封裝到JRBeanCollectionDataSource中就可以了 **/ List<MainVO> mainList = new ArrayList<MainVO>(); List<SubVO> list = new ArrayList<SubVO>(); MainVO vo; /**測試數據自寫*/ …… return new JRBeanCollectionDataSource(mainList); } |
4、 創建外部測試類:TestMain.java:
public static void main(String[] args) { String filename = "bin/SubReport.jasper"; String outFileName = "bin/Out.html"; /**測試數據mainList自寫*/ try { JasperPrint print = JasperFillManager.fillReport(filename, new HashMap(),new JRBeanCollectionDataSource(mainList)); JRExporter exporter = new JRHtmlExporter(); exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, outFileName); exporter.setParameter(JRExporterParameter.JASPER_PRINT, print); exporter.exportReport(); } catch (JRException e) { e.printStackTrace(); } } |
5、 創建Scriptlet:reportScriptlet.java
注意: 如果你從父報表傳給子報表的數據源是個集合類型,且不需要任何的數據處理,這步可以省略,但需要注意我在第二部分的第7步驟的提示。
該類是用來進行類型轉換的,要想讓jasperreports識別數據源就必須把集合類封裝到JRDataSource中。由于父報表把數據源傳遞給子報表是在afterDetailEval()方法之后,因此只需要重寫該方法:
package com.test; public class reportScriptlet extends JRAbstractScriptlet { /**其余方法省略*/ @Override public void afterDetailEval() throws JRScriptletException { System.out.println("afterDetailEval..."); List subList = (List)getFieldValue("subList"); JRDataSource jr = new JRBeanCollectionDataSource(subList); /** *該值是在父報表中定義的一個變量Variables, *類型為net.sf.jasperreports.engine.JRDataSource *(需要手動填寫Class Type) **/ setVariableValue("other", jr); } } |
該Scriptlet供父報表使用
二、報表準備
由于ireport的漢化很不完整,這里就使用英文的界面做demo(有興趣漢化的,可以編輯位于ireport.jar包的it.businesslogic.ireport.locale下的Ireport_zh_CN.properties)。
1、 創建父報表:SubReport.jrxml,通過菜單欄:Data -->Connections /Datasources -->new選擇JRDataSourceProvider定義如圖:
Test 成功后(前提是先在ireport的classpath中設置工程編譯文件夾路徑)save。
2、 設置另一個數據源(給子報表用)在這里我選擇了使用Custom JRDataSource
使用Custom JRDataSource這里我必須在項目中編寫一個額外的類用于測試:
package com.test; public class CRDSFactory{ public static JRDataSource createDatasource(){ List<SubVO> list = new ArrayList<SubVO> (); /**測試數據自寫*/ …… return new JRBeanCollectionDataSource(list); } } |
Test 成功后 save。
3、 注冊字段Fileld
利用菜單中的Data --> Report Query -->DataSource Provider 獲取字段,然后全選獲取到的字段點擊確認注冊。
4、 添加變量Variables
該變量用途是作為父報表傳遞給子報表的數據源,所以類型為JRDataSource
如圖:
5、 創建子報表: SubReport_subreport0.jrxml,(名字由系統生成) 點擊工具欄中的”SubReport”圖標,并確定好子報表的位置,利用系統的wizard一步一步設置,注意在第2步設置”Connection/Datasource ”時最好選擇”no connection or datasource”,因為我們的datasource是父報表中的一個變量)
6、 將ireport的Files視窗的其他報表文件關閉(大概需要這樣,前幾次因為沒關閉出了點問題,不清楚什么原因)如果看不到Files視窗,可以通過菜單的View --> Docking panes -->Files 回顯。單獨選擇剛才為該子報表而設置的數據源“custds”,通過剛才的Report Query -->JavaBean Data Source讀取子報表相關的javabean屬性。選擇后點ok將其注冊到Fields中。如圖:
7、 打開父報表,在設計窗口的子報表上右鍵,選擇Properties -->SubReport,設置由父報表傳遞給子報表的數據源:
提示:如果你略過了第一部分的第5步,這里的“ $V{other} ”要改成“ new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($V{other})”
8、 依次編譯(使用動態連接)子報表、父報表(注意數據源的對應關系),如果能通過父報表看到子報表的內容被填充,則說明測試成功了!如果不成功,檢查剛才設置是否有遺漏的地方,最好重新創建子報表,有時并不是我們設置問題,ireport目前還不是很穩定,在編譯和保存數據時很容易出錯,有時連子報表都不認-_-!!
9、
效果圖:(沒有修飾,確實很難看…)
注意事項:
? 熟悉jaspereports的以手動編輯代碼為主, ireport為輔,使用ireport時有時也必須手動編輯jasperreport,特別是在編譯出錯的時候。
? 不能把父報表的一個變量同時傳遞給多個子報表,不然可能只能顯示一個或什么都不顯示,如果需要這么做,請定義多個變量。
? 子報表的添加不要用舊報表,即使你的舊報表是剛才使用的子報表。
? 如果子報表還要嵌套子報表的話,可以通過為子報表編寫一個Scriptlet實現。
不過要清楚的是子報表有可能不執行afterDetailEval()和beforeDetailEval()(比如使用jdbc連 接,這也許跟子報表的數據源選擇有關),最好先測試,具體原因希望達人告知!
? 在使用ireport進行開發時,當修改了某個類時,就需要重啟ireport才能看到修改的效果,即使是使用ireport的Scriptlet編輯器也一樣。
? 不是越高版本越好用,主要是缺少使用文檔,連javadoc
嚴重: IOException while loading persisted sessions: java.io.EOFException java.io.EOFException at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2281) at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2750) at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:780) at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280) at org.apache.catalina.util.CustomObjectInputStream.<init>(CustomObjectInputStream.java:58) at org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:362) at org.apache.catalina.session.StandardManager.load(StandardManager.java:321) at org.apache.catalina.session.StandardManager.start(StandardManager.java:637) at org.apache.catalina.core.ContainerBase.setManager(ContainerBase.java:438) at org.apache.catalina.core.StandardContext.start(StandardContext.java:4271) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525) at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:926) at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:889) at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492) at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1149) at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311) at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053) at org.apache.catalina.core.StandardHost.start(StandardHost.java:719) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443) at org.apache.catalina.core.StandardService.start(StandardService.java:516) at org.apache.catalina.core.StandardServer.start(StandardServer.java:710) at org.apache.catalina.startup.Catalina.start(Catalina.java:578) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413) 2008-10-21 15:18:18 org.apache.catalina.session.StandardManager start 嚴重: Exception loading sessions from persistent storage java.io.EOFException at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2281) at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2750) at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:780) at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280) at org.apache.catalina.util.CustomObjectInputStream.<init>(CustomObjectInputStream.java:58) at org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:362) at org.apache.catalina.session.StandardManager.load(StandardManager.java:321) at org.apache.catalina.session.StandardManager.start(StandardManager.java:637) at org.apache.catalina.core.ContainerBase.setManager(ContainerBase.java:438) at org.apache.catalina.core.StandardContext.start(StandardContext.java:4271) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525) at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:926) at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:889) at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492) at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1149) at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311) at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053) at org.apache.catalina.core.StandardHost.start(StandardHost.java:719) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443) at org.apache.catalina.core.StandardService.start(StandardService.java:516) at org.apache.catalina.core.StandardServer.start(StandardServer.java:710) at org.apache.catalina.startup.Catalina.start(Catalina.java:578) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413) ================================================================================== 出現原因:tomcat對保存硬盤的session讀取失敗 解決方法:打開TOMCAT的安裝目錄,在WORK文件夾找到當前項目文件夾,把里面的session.ser刪除即可。 |
10g 10.2.1.0
select * from dba_roles;
CONNECT 創建session角色
RESOURCE 創建資源角色,Create table 等等
DBA 數據庫管理員角色
SELECT_CATALOG_ROLE 查看數據字典角色
EXECUTE_CATALOG_ROLE 執行數據字典中部分函數的角色
DELETE_CATALOG_ROLE 刪除sys.adu$記錄的角色
EXP_FULL_DATABASE 全庫導出角色
IMP_FULL_DATABASE 全庫導入角色
RECOVERY_CATALOG_OWNER 備份目錄的擁有者 RMAN使用
GATHER_SYSTEM_STATISTICS
LOGSTDBY_ADMINISTRATOR
AQ_ADMINISTRATOR_ROLE 高級隊列管理員角色
AQ_USER_ROLE 高級隊列使用者角色
GLOBAL_AQ_USER_ROLE
SCHEDULER_ADMIN 調度管理者角色
HS_ADMIN_ROLE
AUTHENTICATEDUSER
OEM_ADVISOR
OEM_MONITOR
WM_ADMIN_ROLE
JAVAUSERPRIV
JAVAIDPRIV
JAVASYSPRIV
JAVADEBUGPRIV
EJBCLIENT
JAVA_ADMIN
JAVA_DEPLOY
CTXAPP
XDBADMIN
XDBWEBSERVICES
OLAP_DBA
OLAP_USER
MGMT_USER
Mysql
************************************
當前列 ClassName ColumnType DisplaySize TypeName
0: java.lang.Integer ColumnType:4 11 INTEGER
1: java.lang.Integer ColumnType:-6 4 TINYINT
2: java.lang.String ColumnType:12 0 UNKNOWN
3: java.lang.Boolean ColumnType:-7 1 TINYINT
4: java.lang.Integer ColumnType:5 6 SMALLINT
5: java.lang.Integer ColumnType:4 9 MEDIUMINT
6: java.lang.Integer ColumnType:4 11 INTEGER
7: java.lang.Long ColumnType:-5 20 BIGINT
8: java.lang.Double ColumnType:8 22 DOUBLE
9: java.lang.Double ColumnType:8 22 DOUBLE
10: java.lang.Float ColumnType:7 12 FLOAT
11: java.lang.String ColumnType:12 11 UNKNOWN
12: java.lang.String ColumnType:12 11 UNKNOWN
13: java.lang.String ColumnType:1 300 CHAR
14: java.lang.String ColumnType:12 300 VARCHAR
15: java.sql.Date ColumnType:91 10 DATE
16: java.sql.Time ColumnType:92 8 TIME
17: java.sql.Date ColumnType:91 4 YEAR
18: java.sql.Timestamp ColumnType:93 19 TIMESTAMP
19: java.sql.Timestamp ColumnType:93 19 DATETIME
20: [B ColumnType:-3 255 TINYBLOB
21: [B ColumnType:-4 65535 BLOB
22: [B ColumnType:-4 16777215 MEDIUMBLOB
23: [B ColumnType:-4 -1 BLOB
24: java.lang.String ColumnType:12 255 TINYBLOB
25: java.lang.String ColumnType:-1 65535 TEXT
26: java.lang.String ColumnType:-1 16777215 MEDIUMBLOB
27: java.lang.String ColumnType:-1 -1 TEXT
28: java.lang.String ColumnType:1 3 CHAR
29: java.lang.String ColumnType:1 3 CHAR