jasperreport學習官方例子:webapp
學習開源專案的最好辦法:通過學習官方例子。當然,在這之前最好看看關於這個開源專案是什麼東東,有什麼基本概念。
對於jasperreport,建議先看看官網裡面的這篇文章:
一、將webapp部署到tomcat上
首先,要run一下ant對應的build.xml檔案
看一下主要是做了以下兩個事情:
1、將一些需要的jar檔案拷貝到lib目錄下(注意執行build操作時,這個webapp目錄必須要在原來的目錄下,或者需要修改build.xml檔案裡面的部分目錄引數)
2、編譯class目錄下java檔案
當然,還可以打包的,但是發現這個功能在這個build.xml中有點問題,所以索性複製整個目錄到tomcat裡面算了!
到此為止,我們可以通過這個build.xml檔案可以學習到這個webapp需要什麼lib的支援!
然後,就是複製目錄了
最後,就是啟動tomcat。
二、通過webapp學習報表生成的過程
步驟一:compile JRXML
例子原來在reports目錄就有一個WebappReport.jrxml檔案(一個xml檔案)
這個步驟完成的就是將WebappReport.jrxml檔案編譯成一個對應的WebappReport.jasper
示例中分別用了兩種方式,servlet和jsp,其實做的東西都差不多,不過個人推薦使用jsp。
下面就節選完成這個步驟的關鍵程式碼:
try{
JasperCompileManager.compileReportToFile(context.getRealPath("/reports/WebappReport.jrxml"));
}
catch (JRException e)
{
注:在這種情況下,生成的jasper檔案的目錄與/WebappReport.jrxml一樣
總結:一般編譯jasper檔案不是線上完成的,線上下完成;而且不容易改變的!
將資料渲染到report模板中,得到一個JasperPrint物件
將這個JasperPrint物件放到session,以便後續處理!
關鍵程式碼以及分析:
try{
String reportFileName = context.getRealPath("/reports/WebappReport.jasper");
File reportFile = new File(reportFileName);
if (!reportFile.exists())
throw new JRRuntimeException("File WebappReport.jasper not found. The report design must be compiled first.");
//parameters用來對原來jrxml中自定義的parameter進行賦值
Map parameters = new HashMap();
parameters.put("ReportTitle", "Address Report");
parameters.put("BaseDir", reportFile.getParentFile());
//裡面的 new WebappDataSource()物件是資料的來源
JasperPrint jasperPrint =
JasperFillManager.fillReport(
reportFileName,
parameters,
new WebappDataSource()
);
//上面生成的JasperPrint物件可以理解成一個渲染了資料的report的包裹
request.getSession().setAttribute(BaseHttpServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, jasperPrint);
}
catch (JRException e)
步驟三:export report
根據不同要求(檔案格式),將JasperPrint物件以對應的檔案格式顯示出來。
比如說將report以pdf的方式:
//從session中取回jasperPrint物件List jasperPrintList = BaseHttpServlet.getJasperPrintList(request);
62
63 if (jasperPrintList == null)
64 {
65 throw new ServletException("No JasperPrint documents found on the HTTP session.");
66 }
67
68 Boolean isBuffered = Boolean.valueOf(request.getParameter(BaseHttpServlet.BUFFERED_OUTPUT_REQUEST_PARAMETER));
69 if (isBuffered.booleanValue())
70 {
//生成輸出器
71 JRPdfExporter exporter = new JRPdfExporter();
72 exporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST, jasperPrintList);
73
74 ByteArrayOutputStream baos = new ByteArrayOutputStream();
75 exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos);
76
77 try
78 {
//輸出
79 exporter.exportReport();
80 }
81 catch (JRException e)
解釋結束!