一、引子:前期試驗工作
1.直接在jasperreports-1.3.0-project工程中運行,ant編譯"demo\samples\webapp"的build.xml,可以直接看到由webapp中的.jrxml文件定義的報表格式,但是無法顯示數據源的數據;
2.上述ant編譯"demo\samples\webapp"的build.xml時,也出現了"-Xlint:unchecked"?和"-?Xlint:deprecation"的版本兼容問題的錯誤,在build.xml中加入編譯參數后,沒什么變化,依然只是能看到.jrxml文件定義的報表格式,無法顯示數據;
3.運行<target?name="viewDesign">時出錯,提示:
viewDesign:
?????
![[java]](http://www.javaresearch.org/faces/60.gif)
?net.sf.jasperreports.engine.JRException:?java.io.FileNotFoundException:?reports\WebappReport.jasper
?????
![[java]](http://www.javaresearch.org/faces/60.gif)
?at?net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:75)
查看了一下"webapp\reports"目錄,果然沒有編譯好的WebappReport.jasper文件,那么是操作問題導致編譯出錯無法把.jrxml編譯成.jasper,還是程序本身就沒有調用編譯設計文件的代碼?
4.查看build.xml文件中<target?name="viewDesign">運行的net.sf.jasperreports.view.JasperDesignViewer類的源代碼,以及看build.xml中提供的參數,發現JasperDesignViewer類只是根據傳入的.jrxml或者.jasper文件的路徑顯示報表,并不負責編譯和填充xml設計文件;
5.ok,webapp示例應該就是只提供了在web服務器中跑的支持,并不同時提供直接applet方式顯示,簡單讓它能夠根據.jrxml或者.jasper源設計文件看一下報表格式而已。因為applet方式顯示報表的示例charts中都有了,也沒必要提供支持了。
6.所以,如有要顯示webapp示例,只能在web服務器中部署運行了。這個示例也正是用來展示web環境下如何使用jasperreports開發報表的!
7.部署webapp示例詳見下文;
二、myeclipse+tomcat部署運行jasperreports的webapp示例step?by?step
1.在eclipse中新建web?工程:"jasperwebappproject";
2.把"jasperreports-1.3.0-project\demo\samples\webapp"下的所有文件拷貝到新建的web工程("jasperwebappproject")的webroot下;
注意:
?*?此時新工程的webroot目錄就與原webapp目錄結構對應上了(不要把該webapp文件夾也拷貝過去了,因為新建web工程就默認有webroot根目錄了),拷貝時要覆蓋掉新建工程時webroot下的原WEB-INF目錄;
?*一定要確保webapp\WEB-INF\classes目錄的下的三個源代碼文件夾(datasource、scriptlets、servlets)和web.xml文件都拷貝過去了!!
因為本人操作的時候發現,有時候原WEB-INF文件能夠全部拷貝過去,有時候skip掉沒有拷貝過去。
?*如果沒有把該web.xml拷貝過去,將無法運行示例中的servlet?samples,并且jsp?samples中也無法顯示圖片!因為web.xml中沒有配置ImageServlet:
<servlet>
<servlet-name>ImageServlet</servlet-name>
<servlet-class>net.sf.jasperreports.j2ee.servlets.ImageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ImageServlet</servlet-name>
<url-pattern>/servlets/image</url-pattern>
</servlet-mapping>
3.把"jasperreports-1.3.0-project\lib"與"jasperreports-1.3.0-project\dist"下的所有jar包拷貝到新建工程的lib下;
注釋:其實只需要拷貝webapp中build.xml文件中要include的jar包,不過本人懶得一一去對了,把所有的jar包都加上,圖省事;
4.右鍵新建工程"jasperwebappproject"->"Properties"->"Java?build?path"->"source"-"add?folder...",把"jasperwebappproject\webroot\WEB-INF\classes"文件夾打上勾,即:把classes文件夾也設置為source?folder;因為classes文件夾下有.java源文件,如果不設置為source?folder,就需要手工編譯了,并且eclipse還可能因為自動編譯把該classes的源文件全部清空,因為src是空的。
所以,一定要把classes文件夾設置為source?folder;
注:
"Java?build?path"->"source"中有一選項"allow?output?folders?for?source?folders",按字面理解應該是把該項選上就是把默認的輸出路徑WEB-INF\classes設置為source?folder了,但是我把它選上了,好像沒有效果,只是當時把classes加入source樹了,但是下次再查看工程properties還是原樣,工程中也沒有把classes當作source?folder,而且還把classes目錄清空了。
選項"allow?output?folders?for?source?folders"到底是干什么用的呢?不知道了,期待知道的回答一下,萬分感謝!
5.此時,我們把webapp下的所有文件和需要的所有jar包都拷貝到新工程了,并且把WEB-INF\classes設置為source?folder了;但是如果此時轉換到J2EE?development視圖的話,會發現工程中報了很多錯誤,主要是.jsp文件和.html文件大量報錯。.html文件的錯誤無關緊要,只是多了一些沒有開始標簽的結束標簽,改不改都不影響運行。但是.jsp文件怎么會報錯,提示很多類文件找不到呢?所需要的jar包(包括jasperreports-1.3.0.jar)和數據源等文件(WEB-INF\classes\datasource)都在工程中了呀!
解決:
根據以往經驗,eclipse中如果直接把別人的代碼復制粘貼上去,即使所有的類文件和jar包都存在,也會報錯,需要把該.java源文件重新"剪切"粘貼一下,這樣就不報錯了。
試了一下,把jsp文件夾下的compile.jsp,fill.jsp,viewer.jsp,html.jsp文件前面部分導入包和類的那些語句(eg.<%@?page?import="datasource.*"?%>)重新剪切粘貼一下,保存,耶,不提示紅×錯誤了!
注:
不理會eclipse中這些.jsp文件的報錯也沒關系,因為部署到tomcat后,運行時肯定是能夠找到所需要的類的,因為那些jar包都在工程中了。不過在eclipse中看著那么多的紅×錯誤,還是剪切粘貼一下消除它,心里比較爽。
6.把工程部署(deploy)到tomcat中;
7.啟動tomcat;
8.在IE中輸入"http://192.168.3.161:9005/jasperSampleWebapp/index.html",正確顯示!
9.點左邊的菜單"compile?JRXML",點右邊的"jsp?examples",->"execute",提示編譯成功!
10.點左邊的菜單"fill?report",點右邊的"jsp?examples",->"execute",提示填充數據成功!
11.點左邊的菜單"export?report",分別可以以pdf,html等格式輸出報表!耶,革命終于勝利!
ok!
三、小結:
????總結運行jasperreports的webapp示例的關鍵幾個步驟:
1.要確保webapp\WEB-INF\classes目錄的下的三個源代碼文件夾(datasource、scriptlets、servlets)和web.xml文件都拷貝過去了!!
2.要把WEB-INF\classes設置為source?folder,否則提示找不到數據源,因為該webapp示例的數據源是WEB-INF\classes\datasource\WebappDataSource.java里的二維數組;
3.要確保把原web.xml復制到工程中了,否則無法顯示圖片,也無法運行servlet?samples;
4.*.jsp文件的報錯可通過重新剪切粘貼一下來消除;
5.ie中瀏覽圖表時要按照“compile、fill、export”的順序點擊,這樣才能順利看到報表。
四、其他相關內容:
1.把.jrxml編譯成.jasper文件的類是:net.sf.jasperreports.engine.JasperCompileManager
方法compileReportToFile:這個方法能夠創建一個在整個程序中使用的編譯的報告文件(.jasper)。
這個類有兩個重載函數,一個只有一個參數,指定.jrxml的路徑;另一個有兩個參數,分別指定.jrxml的路徑和.jasper的輸出路徑;
compileReportToFile(String?srcdir):???編譯.jrxml得到.jasper,但是不輸出該.jasper文件;
compileReportToFile(String?srcdir,String?destdir):??編譯.jrxml得到.jasper,并且輸出該.jasper文件到指定路徑;
驗證:
法一:
把compile.jsp中的關鍵的一行代碼:
JasperCompileManager.compileReportToFile(application.getRealPath("/reports/WebappReport.jrxml"));
改為:
JasperCompileManager.compileReportToFile(application.getRealPath("/reports/WebappReport.jrxml"),application.getRealPath("/reports/WebappReport.jasper"));
重啟tomcat,運行該compile.jsp文件,這時可以在tomcat的目錄"tomcat5.5.17\webapps\jasperSampleWebapp\reports"下看到新生成的WebappReport.jasper文件!
法二:
寫一個包含main函數的測試類,執行JasperCompileManager.compileReportToFile方法:
package?test;
import?net.sf.jasperreports.engine.JRException;
import?net.sf.jasperreports.engine.JasperCompileManager;
import?net.sf.jasperreports.engine.design.*;
public?class?testCompileManager{
????public?static?void?main(String[]?args)?{
????????String?sourceFileName="E:\\jiangcm\\workspace-forict-myeclipse\\jasperreports\\demo\\samples\\webapp\\reports\\WebappReport.jrxml";
????????String?destFileName="E:\\jiangcm\\workspace-forict-myeclipse\\jasperreports\\demo\\samples\\webapp\\reports\\WebappReport.jasper";
????????try?{
????????????JasperCompileManager.compileReportToFile(sourceFileName,?destFileName);
????????}?catch?(JRException?e)?{
????????????//?TODO?Auto-generated?catch?block
????????????e.printStackTrace();
????????}
????}
}
posted on 2007-01-29 14:14
matthew 閱讀(5704)
評論(6) 編輯 收藏 所屬分類:
報表設計與開發