2009年9月29日

          前次,我曾經介紹過可以通過使用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定義如圖:

          利用復合的javabean構造基于jasperreports的子報表(轉) - 涸轍之魚 - 涸轍之魚

                                 Test 成功后(前提是先在ireport的classpath中設置工程編譯文件夾路徑)save。

          2、 設置另一個數據源(給子報表用)在這里我選擇了使用Custom JRDataSource

          利用復合的javabean構造基于jasperreports的子報表(轉) - 涸轍之魚 - 涸轍之魚

                              使用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 獲取字段,然后全選獲取到的字段點擊確認注冊。

          利用復合的javabean構造基于jasperreports的子報表(轉) - 涸轍之魚 - 涸轍之魚

               

          4、 添加變量Variables

          該變量用途是作為父報表傳遞給子報表的數據源,所以類型為JRDataSource

                              如圖:

          利用復合的javabean構造基于jasperreports的子報表(轉) - 涸轍之魚 - 涸轍之魚

          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中。如圖:

          利用復合的javabean構造基于jasperreports的子報表(轉) - 涸轍之魚 - 涸轍之魚

          7、 打開父報表,在設計窗口的子報表上右鍵,選擇Properties -->SubReport,設置由父報表傳遞給子報表的數據源:

                   

          利用復合的javabean構造基于jasperreports的子報表(轉) - 涸轍之魚 - 涸轍之魚

                            提示:如果你略過了第一部分的第5步,這里的“ $V{other} ”要改成“ new  net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($V{other})”

          8、 依次編譯(使用動態連接)子報表、父報表(注意數據源的對應關系),如果能通過父報表看到子報表的內容被填充,則說明測試成功了!如果不成功,檢查剛才設置是否有遺漏的地方,最好重新創建子報表,有時并不是我們設置問題,ireport目前還不是很穩定,在編譯和保存數據時很容易出錯,有時連子報表都不認-_-!!

          9、

                             效果圖:(沒有修飾,確實很難看…)

                    

          利用復合的javabean構造基于jasperreports的子報表(轉) - 涸轍之魚 - 涸轍之魚

                           注意事項:

          ?        熟悉jaspereports的以手動編輯代碼為主, ireport為輔,使用ireport時有時也必須手動編輯jasperreport,特別是在編譯出錯的時候。

          ?       不能把父報表的一個變量同時傳遞給多個子報表,不然可能只能顯示一個或什么都不顯示,如果需要這么做,請定義多個變量。

          ?      子報表的添加不要用舊報表,即使你的舊報表是剛才使用的子報表。

          ?      如果子報表還要嵌套子報表的話,可以通過為子報表編寫一個Scriptlet實現。

                                              不過要清楚的是子報表有可能不執行afterDetailEval()和beforeDetailEval()(比如使用jdbc連 接,這也許跟子報表的數據源選擇有關),最好先測試,具體原因希望達人告知!

          ?     在使用ireport進行開發時,當修改了某個類時,就需要重啟ireport才能看到修改的效果,即使是使用ireport的Scriptlet編輯器也一樣。

          ?     不是越高版本越好用,主要是缺少使用文檔,連javadoc

          posted @ 2009-09-29 09:01 caihaibo 閱讀(1435) | 評論 (0)編輯 收藏
            2009年8月18日
          查看被鎖的表

          select   p.spid,a.serial#, c.object_name,b.session_id,b.oracle_username,b.os_user_name   from   v$process   p,v$session   a,   v$locked_object   b,all_objects   c   where   p.addr=a.paddr   and   a.process=b.process   and   c.object_id=b.object_id  




          查看連接的進程

          SELECT sid, serial#, username, osuser FROM v$session;




          殺掉進程

          alter   system     kill   session   'sid,serial#';
          posted @ 2009-08-18 15:22 caihaibo 閱讀(261) | 評論 (0)編輯 收藏
            2009年8月17日
          修改bin下的catalina.bat中的java_home
          posted @ 2009-08-17 14:26 caihaibo 閱讀(211) | 評論 (0)編輯 收藏
            2009年8月3日

           

          嚴重: 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刪除即可。

          posted @ 2009-08-03 09:25 caihaibo 閱讀(383) | 評論 (0)編輯 收藏
            2009年7月31日
          Preferences->General -> Editors -> Text Editors
          posted @ 2009-07-31 09:50 caihaibo 閱讀(654) | 評論 (0)編輯 收藏
          internet選項——常規——設置——Internet·臨時文件 (檢查網頁的較新版本)選中每次訪問網頁時
          posted @ 2009-07-31 09:44 caihaibo 閱讀(429) | 評論 (0)編輯 收藏
            2008年12月11日

          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                     

           

          posted @ 2008-12-11 16:12 caihaibo 閱讀(1648) | 評論 (0)編輯 收藏
            2008年12月9日

          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

          posted @ 2008-12-09 18:57 caihaibo 閱讀(377) | 評論 (0)編輯 收藏
          mysql安裝出現cannot start the service 錯誤 有可能是因為以前安裝的文件夾還存在,刪除以前安裝的文件夾,再安裝ok
          posted @ 2008-12-09 18:53 caihaibo 閱讀(2041) | 評論 (0)編輯 收藏
            2008年12月4日
          你的系統是否最近出現過下圖所示的情況呢?


          =800) window.open('http://www.91kb.cn/attachment/Mon_0811/7_3836_d3527d6e31ec185.jpg');" src="http://www.91kb.cn/attachment/Mon_0811/7_3836_d3527d6e31ec185.jpg" onload="if(this.width>'800')this.width='800';" border=0>

          =800) window.open('http://www.91kb.cn/attachment/Mon_0811/7_3836_b04e7433c85c56a.jpg');" src="http://www.91kb.cn/attachment/Mon_0811/7_3836_b04e7433c85c56a.jpg" onload="if(this.width>'800')this.width='800';" border=0>

          殺毒查不出來,系統還原,重裝系統均無效,什么原因?原來罪魁禍首是因為系統漏洞所致.
          1024日,微軟系統爆出2008年最大的安全漏洞(MS08-067),影響包括Windows XP SP3Windows 2000Windows Server 2003Windows Vista等幾乎所有主流操作系統。黑客可以利用此漏洞發動大規模遠程攻擊,實際效果可與“沖擊波”、“震蕩波”等病毒類似。
          本人前兩天也深受其害,不能上網,后來打上這個補丁后解決問題.現將解決方法公布如下:
          1.去微軟下載MS08-067的安全更新,地址:http://www.microsoft.com/downloads/details.aspx?familyid=0D5F9B6E-9265-44B9-A376-2067B73D6A03&displaylang=zh-cn (:盜版軟件也可以下,不會受微軟黑屏影響,本人電腦就是用此方法解決好的)


            2.利用第三方軟件,如瑞星卡卡,360安全衛士,QQ醫生等下載系統漏洞補丁.只用下載MS08-067的即可.
          posted @ 2008-12-04 21:13 caihaibo 閱讀(700) | 評論 (0)編輯 收藏
          僅列出標題  下一頁
          主站蜘蛛池模板: 万源市| 辉南县| 金湖县| 姜堰市| 平谷区| 德兴市| 北海市| 正镶白旗| 若羌县| 宣武区| 嘉义县| 高阳县| 措美县| 炉霍县| 苍溪县| 广东省| 静安区| 柏乡县| 西吉县| 兖州市| 五华县| 三河市| 团风县| 朔州市| 舞钢市| 固原市| 寿宁县| 荣昌县| 中宁县| 榆树市| 清远市| 六盘水市| 辽阳市| 永安市| 汉阴县| 阿瓦提县| 寿光市| 连江县| 东阳市| 青阳县| 巴林右旗|