在Java Web项目中引入Mondrian多维分析框架

一,Mondrian简介

Mondrian是一个开源项目,一个用Java写成的OLAP引擎。它用MDX语言实现查询,从关系数据库(RDBMS)中读取数据。然后经过Java API以多维的方式对结果进行展示。

Mondrian的使用方式同JDBC驱动类似。可以非常方便的与现有的Web项目集成。

Mondrian OLAP 系统由四个层组成,可分为从最终用户到数据中心, 顺序为:

1表现层(the presentation layer)

2维度层(the dimensional layer)

3集合层(the star layer)

4存储层(the storage layer)

表现层以多维"语法(grammar)(维、度量、单元)”的形式发出查询,然后OLAP服务器返回结果。

维度层用来解析、验证和执行MDX查询要求。为了提高效率,维度层把要求查询的单元成批发送到集合层,查询转换器接受操作现有查询的请求,而不是对每个请求都建立一个MDX 声明。

集合层负责维护和创建集合缓存,一个集合是在内存中缓存一组单元值,这些单元值由一组维的值来确定。

存储层是一个关系型数据库(RDBMS)。它负责创建集合的单元数据,和提供维表的成员。

维度层对这些单元发出查询请求,如果所查询的单元值不在缓存中,则集合管理器(aggregation manager)会向存储层发出查询请求。

Mondrian应用在java web项目中的目录结构:

webContent目录下的jpivot、wcf这两个文件夹包含mondrian展示查询结果图表时需要使用的图像和css文件。

Busy.jsp显示服务器忙碌等待页面、error.jsp显示出错页面、testpage.jsp文件调用了jpivot标签库来处理MDX查询请求,并将最终结果以html的格式返回给用户。

可以到http://sourceforge.net/projects/mondrian/下载Mondrian的项目包文件。

二,java Web项目中引入mondrian的几个步骤

(1)在java web项目中引入相应的包。

下载mondrian项目包后解压,其中的lib目录下有一个可直接部署的实例mondrian.war。我们需要将war包解压,然后从中取出我们所需要的文件:jpivot、wcf二个文件夹及busy.jsp、error.jsp、testpage.jsp三个文件,放到web项目的webContent目录下。

jpivot、wcf这两个文件夹包含mondrian展示查询结果图表时需要使用的图像和css文件。

jpivot其实是一个自定义jsp的标签库,它基于XML/XSLT配置来生成相应的html。

(2)添加配置文件。

在上述war包的解压目录下的WEB-INF目录下选中jpivot、lib、wcf这三个文件夹,复制到web项目到WEB_INF目录下。Jpivot、wcf这两个文件夹包含jpivot和wcf用于生成用户界面的配置文件(*.xml、*.xsl)及标签文件(*.tld)的定义。lib文件夹包含的是mondrian所要用的jar包。

(3)配置web.xml文件,使web项目能使用mondrian的功能。

可以直接从mondrian.war包中解压得到的项目文件中的WEB_INF路径下复制web.xml文件到我们到项目中,在此基础上进行修改,主要是修改数据库连接字符串connectString的值,并添加项目需要的自定义的Servlet。

(4)在java web 项目的WEB_INF路径下新建queries文件夹,在其中建立模式(schema)文件(一个自定义的xml文件)。

一个模式定义了一个多维数据库。模式文件中包含模式名称Schema、数据立方名称Cube、数据立方对应的事实表名称Table、数据立方中的维度Dimension、维度中包含的数据层次Hierarchy、层次中维度对应的数据库维表名称Table和层次结构中包含的级别Level。

另外就是模式中包含的统计度量因素Measure(需要度量的指标及其计算方法)

Mondrian实现多维数据分析时,需要一个多维数据的逻辑模型(logical Schema model)、一组数据立方(consisting of Cube)、数据维度(Dimension) 、层次(Hierarchy)、和层级成员(Level members), 并映射到物理模型(关系数据库)上。

简单的说,配置一个模式就是配置一个关系数据结构到多维数据结构的映射。

在模式文件定义完成之后,我们就可以根据它来编写相应MDX查询语句了。

模式文件的实例:

<?xml version="1.0" encoding="UTF-8"?>
<Schema name="tezz">
<Cube name="Sales">
<!-- 事实表(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>
<!-- 产品类别维 -->
<Dimension name="产品类别" foreignKey="proId">
<Hierarchy hasAll="true" allMemberName="所有产品" 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="数量" column="number" aggregator="sum" datatype="Numeric" />
<Measure name="总销售额" aggregator="sum" formatString="¥#,##0.00">
<!-- unitPrice*number所得值的列 -->
<MeasureExpression>
<SQL dialect="generic">(unitPrice*number)</SQL>
</MeasureExpression>
</Measure>
<CalculatedMember name="平均单价" dimension="Measures">
<Formula>[Measures].[总销售额] / [Measures].[数量]</Formula>
<CalculatedMemberProperty name="FORMAT_STRING" value="¥#,##0.00" />
</CalculatedMember>
</Cube>
</Schema>

(5)在模式文件Schema基础上编辑用于查询操作的jsp文件,使用MDX语法规则。

在queries目录下新建.jsp文件,jsp文件中使用MDX语法编辑mondrian Query,对数据立方Cube进行查询,从不同的维度上进行select查询取值。

jsp文件中的查询部分如下,包含在标签<jp:mondrianQuery>中。 配置使用的模式文件和数据库,并编辑MDX查询语句。

<jp:mondrianQuery id="query01"

catalogUri="/WEB-INF/queries/tezz.xml"

jdbcDriver="com.mysql.jdbc.Driver"

jdbcUrl="jdbc:mysql://localhost:3306/zett?user=root&password=root">

select {[Measures].[数量],[Measures].[平均单价],[Measures].[总销售额]} ON columns,

{([产品类别].[所有产品],[客户性别].[所有性别])} ON rows

from [Sales]

</jp:mondrianQuery>

(6)部署项目,执行查询。

在tomcat中部署java web项目后,在浏览器中输入:

…./projectname/testpage.jsp?query=xxx,浏览查询结果。其中xxx就是queries中的jsp查询文件。testpage.jsp调用xxx页面中的查询,并将返回的结果组织到对应的表格中,进行展示。

效果图如下,表格比较朴素:

时间: 2024-10-13 12:50:26

在Java Web项目中引入Mondrian多维分析框架的相关文章

在java web项目中集成webservice

公司要求在项目中加入webservice服务,因为项目中使用了spring框架,所以在这里使用与spring兼容性较好的cxf来实现 cxf所需jar包 spring的jar包就不贴了 一:创建webservice服务器 1)创建一个服务接口 package com.service; import javax.jws.WebParam; import javax.jws.WebService; @WebService public interface IHelloWorld { public S

Java Web项目中缺少Java EE 6 Libraries怎么添加

具体步骤如下: 1.项目名称上点击鼠标右键,选择"Build Path-->Configure Build Path-->Java Build Path" 2.单击"Add Library..." 3.选择"User Library",单击"Next" 4.单击"User Libraries...",选择需要的Java EE 6 Libraries Java Web项目中缺少Java EE 6

JAVA WEB项目中各种路径的获取

JAVA WEB项目中各种路径的获取 标签: java webpath文件路径 2014-02-14 15:04 1746人阅读 评论(0) 收藏 举报  分类: JAVA开发(41)  1.可以在servlet的init方法里 String path = getServletContext().getRealPath("/"); 这将获取web项目的全路径 例如 :E:\eclipseM9\workspace\tree\ tree是我web项目的根目录 2.你也可以随时在任意的cla

Java web 项目中使用ckeditor和ckfinder

重点汇总: 加入相关的jar包 在web.xml文件加入ckfinder 请求拦截器 配置ckfinder的配置文件:config.xml 杂谈 作为一个可视化的HTML 编辑器,最重要的一点是对于文件.图片和视频的管理,一个好的可视化的HTML 编辑器应该有很好的设计. 其他的话就不多说了,现在开始进入正题. ckeditor和ckfinder 两个到底是干什么的?为什么要做两个? ckeditor就是一个可视化的HTML编辑器,但是他的上传图片和视频却交给了另外的软件:ckfinder,为什

Java Web项目中连接Access数据库的配置方法

本文是对前几天的"JDBC连接Access数据库的几种方式"这篇的升级.因为在做一些小项目的时候遇到的问题,因此才决定写这篇博客的.昨天已经将博客公布了.可是后来经过一些验证有点问题,所以今天改了一下又一次的公布了 老师决定期末考试採用access数据库实现增删改查.我觉得如今的我已经没有问题了.可是曾经都是在JSP页面中连接access数据库,不管是下面的那种方式都进行了连接的练习,可是如今我想让我的项目中的訪问access数据库的java代码,封装到DAO中,在DAO中连接数据库,

java web项目中 读取properties 路径的问题

可以先获取项目的classPath String classPath = this.getClass().getResource("/").getPath();//获取classPath(部署到tomcat的路径上) 我的为/D:/apache-tomcat-6.0.29/webapps/demo/WEB-INF/classes/  在连接下面的路径即可 代码如下: package readproperties; import java.io.BufferedInputStream;i

实战:在Java Web 项目中使用HBase

在此之前我们使用Mysql作为数据源,但发现这数据增长速度太快,并且由于种种原因,因此必须使用HBase,所以我们要把Mysql表里面的数据迁移到HBase中,在这里我就不讲解.不争论为什么要使用HBase,HBase是什么了,喜欢的就认真看下去,总有些地方是有用的 我们要做的3大步骤: 新建HBase表格. 把MYSQL数据迁移到HBase中. 在Java Web项目中读取HBase的数据. 先介绍一下必要的一些环境: HBase的版本:0.98.8-hadoop2 所需的依赖包: commo

Java web项目中java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

原来是tomcat找不到MYSQL JAR包的问题.后来又把mysql-connector-java-5.1.7-bin.jar导入到tomcat的lib目录下面就ok了,嘿…… 在java项目中,只需要引入mysql-connector-java-5.1.7-bin.jar就可以运行java项目. 在web项目中,当Class.forName("om.mysql.jdbc.Driver");时myeclipse是不会去查找字符串,不会去查找驱动的.所以只需要把mysql-connec

使用Struts框架的Java Web项目中的两个Session的区别和常见的Session取值为空的错误

我的百度知道回答,感觉这个知识很有意义,专门贴出来. 不过还有待验证的地方,就是 ActionContext.getContext().getSession("name", "Tom"); //如果在JSP中通过 EL 或者 Struts2 标签怎么显示? 以下是回答正文. 很多初学Java Web的同学因为使用 Strut2框架而分不清两个 Session的区别. 1.   JSP/Servlety有个原生的 session 对象,这是9大内置对象中的一个,书上写