通過(guò)本教程,您將了解到什么是Mondiran,及如何將mondrian支持添加到您的Java Web項(xiàng)目中。
在閱讀本教程之前,您可能需要掌握以下概念:
OLAP(聯(lián)機(jī)分析處理On-Line Analytical Processing),您可以通過(guò)閱讀ROLAP的概念.pptx來(lái)了解OLAP
MDX多維表達(dá)式,您可以通過(guò)閱讀MDX的基本語(yǔ)法及概念.pptx來(lái)了解MDX
1. Mondrian是什么?
Mondrian是一個(gè)開(kāi)源項(xiàng)目。一個(gè)用Java寫(xiě)成的OLAP引擎。它用MDX語(yǔ)言實(shí)現(xiàn)查詢(xún),從關(guān)系數(shù)據(jù)庫(kù)(RDBMS)中讀取數(shù)據(jù)。然后經(jīng)過(guò)Java API以多維的方式對(duì)結(jié)果進(jìn)行展示。
Mondrian的使用方式同JDBC驅(qū)動(dòng)類(lèi)似。可以非常方便的與現(xiàn)有的Web項(xiàng)目集成
1.1 Mondrian的體系結(jié)構(gòu)(Architecture)
Mondrian OLAP 系統(tǒng)由四個(gè)層組成; 從最終用戶到數(shù)據(jù)中心, 順序?yàn)?
1.1.1 表現(xiàn)層(the presentation layer)
1.1.2 維度層(the dimensional layer)
1.1.3 集合層(the star layer)
1.1.4 存儲(chǔ)層(the storage layer)
結(jié)構(gòu)圖如下:
1.1.1 表現(xiàn)層(the presentation layer)
表現(xiàn)層決定了最終用戶將在他們的顯示器上看到什么, 及他們?nèi)绾瓮到y(tǒng)產(chǎn)生交互。
有許多方法可以用來(lái)向用戶顯示多維數(shù)據(jù)集, 有 pivot 表 (一種交互式的表), pie, line 和圖表(bar charts)。它們可以用Swing 或 JSP來(lái)實(shí)現(xiàn)。
表現(xiàn)層以多維"文法(grammar)(維、度量、單元)”的形式發(fā)出查詢(xún),然后OLAP服務(wù)器返回結(jié)果。
1.1.1.1 Jpivot表現(xiàn)層
JPivot 是Mondrian的表現(xiàn)層TagLib,一直保持著良好的開(kāi)發(fā)進(jìn)度。
您可以通過(guò)訪問(wèn)jpivot的官方網(wǎng)站http://jpivot./以獲得更多的幫助及支持
jpivot使用XML/ XSLT渲染OLAP報(bào)表:
JPivot 使用 WCF (Web Component Framework) ,基于XML/XSLT來(lái)渲染W(wǎng)eb UI組件。這使它顯得十分另類(lèi)。不過(guò),OLAP報(bào)表這種非常復(fù)雜但又有規(guī)律可循的東西,最適合使用XSLT來(lái)渲染。
jpivot完全基于JSP+TagLib:
JPivot另外一個(gè)可能使人不慣的地方是它完全基于taglib而不是大家熟悉的MVC模式。
但它可以很方便的將多維數(shù)據(jù)展示給最終用戶,如下表格:
jpivot其實(shí)是一個(gè)自定義jsp的標(biāo)簽庫(kù)。它基于XML/XSLT配置來(lái)生成相應(yīng)的html。所幸的是,我們并不需要了解太多關(guān)于這方面的內(nèi)容,我們只要掌握相應(yīng)jsp標(biāo)簽的使用即可。
在本教程的實(shí)例中,我們將會(huì)對(duì)一些常用到的jpivot標(biāo)簽進(jìn)行講解。
您還可以通過(guò)漢化WEB-INF/jpivot下的xml文件來(lái)完成對(duì)jpivot的漢化工作
1.1.2 維度層(the dimensional layer)
維度層用來(lái)解析、驗(yàn)證和執(zhí)行MDX查詢(xún)要求。
一個(gè)MDX查詢(xún)要通過(guò)幾個(gè)階段來(lái)完成:首先是計(jì)算坐標(biāo)軸(axes),再者計(jì)算坐標(biāo)軸axes 中cell的值。
為了提高效率,維度層把要求查詢(xún)的單元成批發(fā)送到集合層,查詢(xún)轉(zhuǎn)換器接受操作現(xiàn)有查詢(xún)的請(qǐng)求,而不是對(duì)每個(gè)請(qǐng)求都建立一個(gè)MDX 聲明。
1.1.3 集合層(the star layer)
集合層負(fù)責(zé)維護(hù)和創(chuàng)建集合緩存,一個(gè)集合是在內(nèi)存中緩存一組單元值, 這些單元值由一組維的值來(lái)確定。
維度層對(duì)這些單元發(fā)出查詢(xún)請(qǐng)求,如果所查詢(xún)的單元值不在緩存中,則集合管理器(aggregation manager)會(huì)向存儲(chǔ)層發(fā)出查詢(xún)請(qǐng)求
1.1.4 存儲(chǔ)層(the storage layer)
存儲(chǔ)層是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)(RDBMS)。它負(fù)責(zé)創(chuàng)建集合的單元數(shù)據(jù),和提供維表的成員。
1.2 API
Mondrian 為客戶端提供一個(gè)用于查詢(xún)的API
因?yàn)榈侥壳盀橹?并沒(méi)有一個(gè)通用的用于OLAP查詢(xún)的API,因此Mondrian提供了它私有的API.
盡管如此,一個(gè)常使用JDBC的人將同樣發(fā)現(xiàn)它很熟悉.不同之處僅在于它使用的是MDX查詢(xún)語(yǔ)言,而非SQL
下面的java片段展示了如何連接到Mondrian,然后執(zhí)行一個(gè)查詢(xún),最后打印結(jié)果.
- import mondrian.olap.*;
- import java.io.PrintWriter;
- Connection connection = DriverManager.getConnection("Provider=mondrian;"
- +"Jdbc=jdbc:odbc:MondrianFoodMart;"
- +"Catalog=/WEB-INF/FoodMart.xml;",null,false);
- Query query = connection.parseQuery("SELECT {[Measures].[Unit Sales], [Measures].[Store Sales]} on columns,"
- +" {[Product].children} on rows "
- +"FROM [Sales] " +"WHERE ([Time].[1997].[Q1], [Store].[CA].[San Francisco])");
- Result result = connection.execute(query);
- result.print(new PrintWriter(System.out));
與JDBC類(lèi)似,一個(gè)Connection由DriverManager創(chuàng)建,Query 對(duì)象類(lèi)似于JDBC 的Statement,它通過(guò)傳遞一個(gè)MDX語(yǔ)句來(lái)創(chuàng)建.Result對(duì)象類(lèi)似于JDBC的ResultSet,只不過(guò)它里面保存的是多維數(shù)據(jù)
您可以通過(guò)查看Mondrian幫助文檔里的javadoc來(lái)獲取更多關(guān)于Mondrian API的資料
通過(guò)上面的介紹,您應(yīng)該對(duì)mondrian的體系有一個(gè)基本的了解。
下面我們將通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)加深您的理解。
2. 一個(gè)簡(jiǎn)單的Mondrian例子
現(xiàn)在讓我們用一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明將Mondrian支持添加到您java web的具體步驟。
2.1 準(zhǔn)備開(kāi)發(fā)工具及環(huán)境
本測(cè)試需要的環(huán)境:
操作系統(tǒng):Windows 2000;
Web服務(wù)器:tomcat6.0;
關(guān)系數(shù)據(jù)庫(kù):sql server 2000;
開(kāi)發(fā)工具:eclipse + myeclipse;
JDBC驅(qū)動(dòng):jtds-1.2.2;
您可以在http://tomcat./上下載到tomcat的最新版本及幫助;
您可以在http://www./上下載到myeclipse的最新版本及相應(yīng)的eclipse開(kāi)發(fā)平臺(tái)版本
2.2 準(zhǔn)備Mondrian資源:
從http:///projects/mondrian/下載Mondrian的最新版本(目前版本為3.0,大約有50M+大小)。
2.3 創(chuàng)建項(xiàng)目
啟動(dòng)eclipse。
在eclipse中新創(chuàng)建一個(gè)web項(xiàng)目,名為T(mén)ezz。注意需要加入JSTL支持。
具體步驟如下:
2.3.1 打開(kāi)新建web項(xiàng)目對(duì)話框
一個(gè)新項(xiàng)目Tezz的文件結(jié)構(gòu)如下:
2.4 添加必須的文件
將下載的壓縮包進(jìn)行解壓。完成后,進(jìn)入文件夾可以看到如下目錄結(jié)構(gòu)。雙擊進(jìn)入lib文件夾。
Lib文件夾有如下內(nèi)容:注意到這里的mondrian.war文件是一個(gè)可直接布署的項(xiàng)目,我們需要將它解壓,然后從中取出我們所需要的文件。(建議將其擴(kuò)展名改成zip,然后直接右鍵解壓)
進(jìn)入解壓后的文件夾,選中jpivot、wcf二個(gè)文件夾及busy.jsp、error.jsp、testpage.jsp三個(gè)文件,我們需要將這些資源復(fù)制到我們測(cè)試項(xiàng)目的WebRoot文件夾中。按ctrl+C鍵復(fù)制。
注:jpivot、wcf這兩個(gè)文件夾包含mondrian使用的圖像和css文件。Busy.jsp顯示等待頁(yè)面、error.jsp顯示出錯(cuò)頁(yè)面、testpage.jsp這文件的用處將在后面介紹。
切換到eclipse界面,在我們的Tezz項(xiàng)目的WebRoot文件夾處右擊鼠標(biāo),在彈出的菜單中選擇Paste(粘貼)即可
粘貼完成后的項(xiàng)目結(jié)構(gòu)如下
注意:因?yàn)槲覀冞€未將所有資料復(fù)制到項(xiàng)目中,因此eclipse會(huì)顯示錯(cuò)誤圖標(biāo)
最后進(jìn)入WEB-INF文件夾(在上面步驟中解壓的項(xiàng)目文件mondrian.war里),選中jpivot、lib、wcf這三個(gè)文件夾,同樣需要復(fù)制它們到測(cè)試項(xiàng)目的WEB-INF文件夾中。
Jpivot、wcf這兩個(gè)文件夾包含jpivot和wcf用于生成用戶界面的配置文件(*.xml、*.xsl)及標(biāo)簽文件(*.tld)的定義。Lib文件夾包含的是mondrian所要用的java包。
切換到eclipse界面,在我們的Tezz項(xiàng)目的WebRoot文件夾處右擊鼠標(biāo),在彈出的菜單中選擇Paste(粘貼)
至此Mondrian的支持添加完畢,下面我們將配置web.xml,讓我們的項(xiàng)目能夠使用到mondrian的功能。
2.5 配置web.xml
用eclipse打開(kāi)我們?cè)谏厦娼鈮旱牟际痦?xiàng)目的WEB-INF/web.xml文件
過(guò)濾器(filter)
復(fù)制如下所示的xml代碼到我們測(cè)試項(xiàng)目Tezz的web.xml文件中。
作用:這個(gè)過(guò)濾器在訪問(wèn)/testpage.jsp前被調(diào)用。它被設(shè)計(jì)成jpivot的前端控制器,用于判斷并將用戶的請(qǐng)求發(fā)送到某個(gè)頁(yè)面。
注:在實(shí)際項(xiàng)目中可以使用您自己定義的servlet或使用其他技術(shù)來(lái)替代它以提供更多的功能
- <filter>
- <filter-name>JPivotController</filter-name>
- <filter-class>com.tonbeller.wcf.controller.RequestFilter</filter-class>
- <init-param>
- <param-name>indexJSP</param-name>
- <param-value>/index.html</param-value>
- <description>如果這是一個(gè)新的會(huì)話,則轉(zhuǎn)到此頁(yè)面</description>
- </init-param>
- <init-param>
- <param-name>errorJSP</param-name>
- <param-value>/error.jsp</param-value>
- <description>出錯(cuò)時(shí)顯示的頁(yè)面</description>
- </init-param>
- <init-param>
- <param-name>busyJSP</param-name>
- <param-value>/busy.jsp</param-value>
- <description>這個(gè)頁(yè)面用于當(dāng)用戶點(diǎn)擊一個(gè)查詢(xún)時(shí),在這個(gè)查詢(xún)還未將結(jié)果還回給用戶時(shí)所顯示的界面</description>
- </init-param>
- </filter>
-
- <filter-mapping>
- <filter-name>JPivotController</filter-name>
- <url-pattern>/testpage.jsp</url-pattern>
- </filter-mapping>
復(fù)制下面的listener到我們的web.xml文件中(用于初始化一些資源)
- <listener>
- <listener-class>mondrian.web.taglib.Listener</listener-class>
- </listener>
-
- <!– 資源初始化-->
- <listener>
- <listener-class>com.tonbeller.tbutils.res.ResourcesFactoryContextListener</listener-class>
- </listener>
Print servlet,該servlet用于將數(shù)據(jù)生成Excel文件或pdf文件并返回給用戶,如果您需要用到該功能,則需要將其copy到您項(xiàng)目的web.xml文件中
- <servlet>
- <servlet-name>Print</servlet-name>
- <display-name>Print</display-name>
- <description>Default configuration created for servlet.</description>
- <servlet-class>com.tonbeller.jpivot.print.PrintServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>Print</servlet-name>
- <url-pattern>/Print</url-pattern>
- </servlet-mapping>
MDXQueryServlet用于接受并執(zhí)行一個(gè)MDX查詢(xún),然后將該查詢(xún)以Html表格的形式返回。其中的參數(shù)connectString用于指定連接到數(shù)據(jù)庫(kù)的字符串,例如使用jtds驅(qū)動(dòng)連接到sql server 2000的字符串如下:
Provider=mondrian;Jdbc=jdbc:jtds:sqlserver://localhost/Tezz;user=sa;password=123456;Catalog=/WEB-INF/queries/tezz.xml;JdbcDrivers=net.sourceforge.jtds.jdbc.Driver;
如果您需要用到該功能,則需要將其copy到您項(xiàng)目的web.xml文件中。
- <servlet>
- <servlet-name>MDXQueryServlet</servlet-name>
- <servlet-class>mondrian.web.servlet.MDXQueryServlet</servlet-class>
- <init-param>
- <param-name>connectString</param-name>
- <param-value>@mondrian.webapp.connectString@</param-value>
- </init-param>
- </servlet>
- <servlet-mapping>
- <servlet-name>MDXQueryServlet</servlet-name>
- <url-pattern>/mdxquery</url-pattern>
- </servlet-mapping>
DisplayChart 和GetChart 這兩個(gè)Servlet 用于生成圖表和將其顯示給最終用戶,如果您需要用到該功能,則需要將其copy到您項(xiàng)目的web.xml文件中。
- <!-- jfreechart provided servlet -->
- <servlet>
- <servlet-name>DisplayChart</servlet-name>
- <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
- </servlet>
- <!-- jfreechart provided servlet -->
- <servlet>
- <servlet-name>GetChart</servlet-name>
- <display-name>GetChart</display-name>
- <description>Default configuration created for servlet.</description>
- <servlet-class>com.tonbeller.jpivot.chart.GetChart</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>DisplayChart</servlet-name>
- <url-pattern>/DisplayChart</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>GetChart</servlet-name>
- <url-pattern>/GetChart</url-pattern>
- </servlet-mapping>
它們用于向用戶生成和顯示如下所示的各種圖表:
最后添加以下標(biāo)簽庫(kù)到我們的web.xml項(xiàng)目中即可
- <taglib>
- <taglib-uri>http://www./wcf</taglib-uri>
- <taglib-location>/WEB-INF/wcf/wcf-tags.tld</taglib-location>
- </taglib>
-
- <taglib>
- <taglib-uri>http://www./jpivot</taglib-uri>
- <taglib-location>/WEB-INF/jpivot/jpivot-tags.tld</taglib-location>
- </taglib>
到這里,您應(yīng)該對(duì)mondrian在web.xml的配置有一定的了解,并可按需要添加相應(yīng)的功能。
接下來(lái)我們將要?jiǎng)?chuàng)建本例子所要用到的表格及數(shù)據(jù)。
2.6 準(zhǔn)備測(cè)試用表
本例使用的表結(jié)構(gòu)如下所示:
Sale是事實(shí)表,它有兩個(gè)維:客戶(customer)維和由兩個(gè)表組成的產(chǎn)品(Product)維。
表格的創(chuàng)建很簡(jiǎn)單,您只需要將下面的sql語(yǔ)句導(dǎo)入數(shù)據(jù)庫(kù)即可
2.6.1 使用以下sql語(yǔ)句創(chuàng)建表
- /**銷(xiāo)售表*/
- create table Sale (
- saleId int not null,
- proId int null,
- cusId int null,
- unitPrice float null, --單價(jià)
- number int null, --數(shù)量
- constraint PK_SALE primary key (saleId)
- )
- /**用戶表*/
- create table Customer (
- cusId int not null,
- gender char(1) null, --性別
- constraint PK_CUSTOMER primary key (cusId)
- )
- /**產(chǎn)品表*/
- create table Product (
- proId int not null,
- proTypeId int null,
- proName varchar(32) null,
- constraint PK_PRODUCT primary key (proId)
- )
- /**產(chǎn)品類(lèi)別表*/
- create table ProductType (
- proTypeId int not null,
- proTypeName varchar(32) null,
- constraint PK_PRODUCTTYPE primary key (proTypeId)
- )
2.6.2 使用以下sql語(yǔ)句導(dǎo)入數(shù)據(jù)
- insert into Customer(cusId,gender) values(1,'F')
- insert into Customer(cusId,gender) values(2,'M')
- insert into Customer(cusId,gender) values(3,'M')
- insert into Customer(cusId,gender) values(4,'F')
- insert into producttype(proTypeId,proTypeName) values(1,'電器')
- insert into producttype(proTypeId,proTypeName) values(2,'數(shù)碼')
- insert into producttype(proTypeId,proTypeName) values(3,'家具')
- insert into product(proId,proTypeId,proName) values(1,1,'洗衣機(jī)')
- insert into product(proId,proTypeId,proName) values(2,1,'電視機(jī)')
- insert into product(proId,proTypeId,proName) values(3,2,'mp3')
- insert into product(proId,proTypeId,proName) values(4,2,'mp4')
- insert into product(proId,proTypeId,proName) values(5,2,'數(shù)碼相機(jī)')
- insert into product(proId,proTypeId,proName) values(6,3,'椅子')
- insert into product(proId,proTypeId,proName) values(7,3,'桌子')
- insert into sale(saleId,proId,cusId,unitPrice,number) values(1,1,1,340.34,2)
- insert into sale(saleId,proId,cusId,unitPrice,number) values(2,1,2,140.34,1)
- insert into sale(saleId,proId,cusId,unitPrice,number) values(3,2,3,240.34,3)
- insert into sale(saleId,proId,cusId,unitPrice,number) values(4,3,4,540.34,4)
- insert into sale(saleId,proId,cusId,unitPrice,number) values(5,4,1,80.34,5)
- insert into sale(saleId,proId,cusId,unitPrice,number) values(6,5,2,90.34,26)
- insert into sale(saleId,proId,cusId,unitPrice,number) values(7,6,3,140.34,7)
- insert into sale(saleId,proId,cusId,unitPrice,number) values(8,7,4,640.34,28)
- insert into sale(saleId,proId,cusId,unitPrice,number) values(9,6,1,140.34,29)
- insert into sale(saleId,proId,cusId,unitPrice,number) values(10,7,2,740.34,29)
- insert into sale(saleId,proId,cusId,unitPrice,number) values(11,5,3,30.34,28)
- insert into sale(saleId,proId,cusId,unitPrice,number) values(12,4,4,1240.34,72)
- insert into sale(saleId,proId,cusId,unitPrice,number) values(13,3,1,314.34,27)
- insert into sale(saleId,proId,cusId,unitPrice,number) values(14,3,2,45.34,27)
2.7 建立模式(schema)文件
一個(gè)模式定義了一個(gè)多維數(shù)據(jù)庫(kù). 它包含一個(gè)邏輯模型(logical model)、一組數(shù)據(jù)立方(consisting of cubes)、層次(hierarchies)、和成員(members), 并映射到物理模型(關(guān)系數(shù)據(jù)庫(kù))上。
簡(jiǎn)單的說(shuō),配置一個(gè)模式就是配置一個(gè)關(guān)系數(shù)據(jù)結(jié)構(gòu)到多維數(shù)據(jù)結(jié)構(gòu)的映射。
注:關(guān)于mondrian的模式及模式的配置,您可以通過(guò)閱讀mondrian的基本模式.pptx來(lái)了解。這里我們只對(duì)其進(jìn)行了簡(jiǎn)單介紹。
2.7.1 創(chuàng)建模式文件:
模式文件的創(chuàng)建很簡(jiǎn)單。首先在WEB-INF下新建一個(gè)queries的文件夾,然后在該文件夾下創(chuàng)建一個(gè)名為tezz.xml的文件。再按下面的步驟將xml元素添加入即可。
2.7.2 配置模式文件:
2.7.2.1 添加數(shù)據(jù)立方Sales:
2.7.2.2 添加數(shù)據(jù)立方Sales的維:
添加產(chǎn)品維(因?yàn)楫a(chǎn)品維由兩個(gè)表連接而成,因此比客戶維復(fù)雜些):
添加度量(共有三個(gè)度量:數(shù)量、平均單價(jià)和總銷(xiāo)售額):
最后生成的tezz.xml文件內(nèi)容如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <Schema name="tezz">
- <Cube name="Sales">
- <!-- 事實(shí)表(fact table) -->
- <Table name="sale" />
- <!-- 客戶維 -->
- <Dimension name="客戶性別" foreignKey="cusId">
- <Hierarchy hasAll="true" allMemberName="所有性別" primaryKey="cusId">
- <Table name="Customer"></Table>
- <Level name="gender" column="gender"></Level>
- </Hierarchy>
- </Dimension>
- <!-- 產(chǎn)品類(lèi)別維 -->
- <Dimension name="產(chǎn)品類(lèi)別" foreignKey="proId">
- <Hierarchy hasAll="true" allMemberName="所有產(chǎn)品" primaryKey="proId" primaryKeyTable="product">
- <join leftKey="proTypeId" rightKey="proTypeId">
- <Table name="product" />
- <Table name="producttype"></Table>
- </join>
- <Level name="proTypeId" column="proTypeId"
- nameColumn="proTypeName" uniqueMembers="true" table="producttype" />
- <Level name="proId" column="proId" nameColumn="proName"
- uniqueMembers="true" table="product" />
- </Hierarchy>
- </Dimension>
- <Measure name="數(shù)量" column="number" aggregator="sum" datatype="Numeric" />
- <Measure name="總銷(xiāo)售額" aggregator="sum" formatString="¥#,##0.00">
- <!-- unitPrice*number所得值的列 -->
- <MeasureExpression>
- <SQL dialect="generic">(unitPrice*number)</SQL>
- </MeasureExpression>
- </Measure>
- <CalculatedMember name="平均單價(jià)" dimension="Measures">
- <Formula>[Measures].[總銷(xiāo)售額] / [Measures].[數(shù)量]</Formula>
- <CalculatedMemberProperty name="FORMAT_STRING" value="¥#,##0.00" />
- </CalculatedMember>
- </Cube>
- </Schema>
2.8 編寫(xiě)MDX查詢(xún)語(yǔ)句
在模式文件定義完成之后,我們就可以根據(jù)它來(lái)編寫(xiě)相應(yīng)MDX查詢(xún)語(yǔ)句了。
本例所用的MDX語(yǔ)句如下:
2.9 創(chuàng)建查詢(xún)文件
現(xiàn)在我們將創(chuàng)建一個(gè)jsp文件,該jsp使用jpivot的mondrianQuery標(biāo)簽來(lái)完成查詢(xún)。
該文件最后將被testpage.jsp使用。
在/WEB-INF/queries文件夾下面創(chuàng)建一名為tezz的jsp文件。該jsp包含如下內(nèi)容:
2.10 布署項(xiàng)目
至此我們已經(jīng)全部配置完成,文件結(jié)構(gòu)如下:
布署項(xiàng)目,啟動(dòng)Tomcat,在瀏覽器上輸入http://localhost:8080/Tezz/testpage.jsp?query=tezz即可看到如下結(jié)果:
注:testpage.jsp?query=tezz,這里的tezz即剛我們創(chuàng)建的用于查詢(xún)jsp文件名稱(chēng)
3. testpage.jsp的流程
testpage.jsp文件用于發(fā)出查詢(xún)及將結(jié)果轉(zhuǎn)換成html格式。它使用一組jsp標(biāo)簽來(lái)完成這些復(fù)雜的工作。
在本教程的最后一章里,我們對(duì)testpage.jsp的流程及用到的主要標(biāo)簽進(jìn)行簡(jiǎn)單介紹。
3.1 wcf:include標(biāo)簽:
3.2 jp:table標(biāo)簽:
<jp:table id="table01" query="#{query01}"/>
jp:table根據(jù)query01中保存的結(jié)果(領(lǐng)域數(shù)據(jù))準(zhǔn)備顯示OLAP表格所需的數(shù)據(jù)(顯示數(shù)據(jù))
<wcf:render ref="table01" xslUri="/WEB-INF/jpivot/table/mdxtable.xsl"/>
根據(jù)table01的結(jié)果,使用mdxtable.xsl中的配置,渲染出OLAP表格。
3.3 其他jp、wcf標(biāo)簽
同樣,其他jp標(biāo)簽,如<jp:chart id=“chart01“ ---/>等標(biāo)簽準(zhǔn)備待渲染的數(shù)據(jù),再由相應(yīng)的<wcf:render ref=“chart01” ---/>標(biāo)簽將它們渲染成html格式。
這樣,用戶將在瀏覽器上看到最終的結(jié)果。
至此,一個(gè)完整的mondrian查詢(xún)結(jié)束。
|