報表集成那點事
報表工具作為信息管理、決策分析系統(tǒng)不可或缺的部分,在項目中經常用到,市面上的報表工具各式各樣,在集成策略上,每個產品也都有自己特有的打開方式。不過,從門派上看,常見的無外乎中間件,servlet應用兩大門派。一般開源的報表,大都作為中間件產品提供給開發(fā)者,集成方法也比較統(tǒng)一,通常都是嵌入到系統(tǒng)中自行調用API開發(fā)與集成,但開源的幫助文檔或全或不全,都靠自己找資料,就要拼學習能力了。在商用收費報表中,潤乾報表也采用的是中間件方式,下面我們以潤乾報表為例來進一步了解一下:
潤乾報表為了方便開發(fā)者使用,在滿足大多數通用的需求的同時,實現(xiàn)零編程,潤乾報表利用tag標簽進行了封裝,如下就是一個發(fā)布潤乾報表的jsp文件:
- <%@ taglib uri=”/WEB-INF/raqsoftReport.tld” prefix=”report” %>
- <html>
- <body topmargin=0 leftmargin=0 rightmargin=0 bottomMargin=0>
- <report:html name=”report1″ srcType=”file” reportFileName=”wangge.rpx”…/>
- </body>
- </html>
可以看到,在這個jsp中用到一個<prefix:html>標簽來發(fā)布html報表,與struts標簽使用類似,其中reportFileName就是需要發(fā)布的報表文件名,發(fā)布報表的同時,實現(xiàn)了導出,分頁,打印功能
如果把WEB應用比作一臺機器,那報表就是這臺機器諸多功能模塊里的一塊,tag標簽就是一個個小零件,你把這個小零件扣在哪個jsp文件中,報表就在哪里展現(xiàn)。
報表作為中間件集成到其他應用系統(tǒng)里,與這個應用系統(tǒng)就成為了一個整體,但也有分家的做法,比如業(yè)界比較常見的servlet應用——
在這里,報表應用是一個獨立的應用,在其他應用頁面里嵌入一個JFrame,然后通過url請求報表的servlet,報表名作為參數傳遞給報表應用,報表應用將計算以后生成的html報表返回。
那這個時候,我們的程序猿要問了,瀏覽報表明白了,那如果報表需要傳參呢? 別著急,我們再來模擬一下兩種集成方式在給報表傳參上有啥區(qū)別:
中間件方式
我們還是拿潤乾報表的tag標簽來看:
- <%@ taglib uri=”/WEB-INF/raqsoftReport.tld” prefix=”report” %>
- <html>
- <body topmargin=0 leftmargin=0 rightmargin=0 bottomMargin=0>
- <report:html name=”report1″ srcType=”file” reportFileName=”wangge.rpx”
- params=“arg1=123;arg2=abc;……“
- …
- />
- </body>
- </html>
Tag標簽中有個params屬性,可以通過這個屬性給參數賦值,如果參數值靈活變化,當然屬性值也可以通過變量傳遞,這個不多說,程序猿都懂的。
Servlet的方式
JFrame中請求報表servlet的URL就要改成:
http://ip:port/report/reportservlet?參數=報表&arg1=123&arg2=’abc’&…
這時,我知道我們經驗豐富的程序猿又要質疑了:首先,引入了JFrame來加載報表,多一次數據請求;再次,參數在url里都是明文顯示的,安全報警啊,特別集成權限時會比較麻煩!除此之外,web服務與報表服務在不同的進程里,不管是不是在同一臺物理服務器,都會多占用硬件資源,當應用出現(xiàn)異常時,排錯也麻煩,增加運維難度。所以,潤乾報表雖然也支持servlet發(fā)布報表的方式,但我們也不建議大家這樣使用。
前面我們講了潤乾報表作為中間件集成,那么這個中間件到底集成了什么到應用系統(tǒng)中?很簡單,就是jar包,xml配置文件及jsp的tag描述文件tld。
Jar包引入到應用程序中,不僅提供了tag標簽零代碼計算展示、打印報表,也為開發(fā)者在自己的項目中自行調用報表API接口實現(xiàn)報表的計算,分頁,導出,打印等過程提供了方便,例如使用代碼計算發(fā)布一個報表:
- //讀報表
- String reportFile = “C:/reportFiles/wangge.rpx”; //絕對路徑或相對當前程序啟動路徑
- ReportDefine rd = (ReportDefine)ReportUtils.read( reportFile );
- //計算報表
- Context cxt = new Context(); //構建報表引擎計算環(huán)境
- //…………………….. //其它輔助代碼,例如往報表引擎?zhèn)鬟f參數,傳遞數據庫連接參數等ReportDefine rd = (ReportDefine)ReportUtils.read( reportFile );
- Engine engine = new Engine(rd, cxt); //構造報表引擎
- IReport iReport = engine.calc(); //運算報表
- //輸出到網頁,展現(xiàn)報表
- String htmlText = ReportUtils.toHTMLString(iReport,”report1″,request); //生成html語法
- request.setAttribute(“htmlText”, htmlText); //保存到request里,方便頁面上顯示
當然,這里只是講一個簡單例子,API屬于進階集成,更深入的學習請參考潤乾的開發(fā)教程。這例子雖然簡單,但我相信大家已經體會到了她的靈活性、輕量性,而單一的servlet URL方式集成如果要二次開發(fā),僅兩個系統(tǒng)的數據通訊就是一大難題。 所以基于這種方式集成的報表,要么由開發(fā)者想辦法解決,要么就是把報表服務做成了一個平臺——囊括了數據決策展示、權限管理、報表管理等等看起來牛叉,但跟自己業(yè)務系統(tǒng)相結合時又是雞肋的一堆子業(yè)務系統(tǒng)。
便利、靈活、輕量為報表開發(fā)節(jié)約成本提供了基礎,隨著業(yè)務的提升,高效、高可用性也是考核報表系統(tǒng)的重要部分。因此集群也是集成部署的一個重要環(huán)節(jié),那接下來我們繼續(xù)來看,這兩種集成方式在集群上又有啥區(qū)別,先上兩個結構圖——
中間件嵌入到web應用里,與web應用是一個整體,所以web應用做完集群,那么報表也就做完了集群。
而Servlet URL的方式,那集群就相當于分成了兩套,各自做自己的集群,也就是報表是一個集群,web應用是一個集群。
從以上的部署結構可以看出,中間件的方式在集群上更簡單些。所需要的配置及硬件資源都要少不少。
到此報表的集成基本就講完了,優(yōu)缺點都做了一個比較,您的應用需要哪一種呢?