JPivot 的MVC结构
从Web应用的架构来讲,JPivot完全遵循MVC结构,甚至十分苛刻。为了减少对特定第三方框架的以来,JPivot自己实现了MVC框架,但它可以与其它MVC框架共同使用。
1.JPivot模型Model:
JPivot的Model部分处理Olap的模型定义,查询及结果集;JPivot自己定义了一个Olap模型,然后分别提供了Mondrian及XML/A的JPivot model实现,这两个实现又通过Adapter与Mondrian系统及xml/a系统交互。
2.JPivot视图View:
JPivot的View部分比较丰富,包括JPivot taglib、wfc taglib定义及相关的UI Component助手类。用户可以在自己的JSP中使用tag构建新的视图。与其它Web框架不同的是JPivot在该层次提供了大量的Web组件,类似于JSF那样。
3.JPivot控制器Controller:
JPivot的控制器部分非常有特色。在JPivot中,使用单件模式(Singleton)在每个用户的HttpSession中维护唯一一个WcfController对象,然后以此对象为根,使用Composition模式,将所有的控件请求处理的RequestFilter组织成树形结构。
PATH o:connecttype="rect" gradientshapeok="t" o:extrusionok="f" />SHAPE id=_x0000_i1025 style="WIDTH: 336.75pt; HEIGHT: 187.5pt; mso-position-horizontal-relative: text; mso-position-vertical-relative: text" type="#_x0000_t75" o:allowoverlap="f" />/SHAPE />
在JPivot中,所有的UI控件操作都使用DispatcherSupport来维护处理该控件中UI交互的一个或多个Handler(比如表示表格中扩展钻取的“+”图标的DrillExpandUI类中的dispatcher属性与ExpandHandler内部类),而每个UI控件的dispatcher又在其父控件的dispatcher中注册。JPivot根据客户端操作所请求的URL在以WfcController为根的RequestFileter树中查找对应的处理器
JPivot设计模式
在JPivot中使用了大量的设计模式(Design Patterns),本文对这些设计模式实例进行简单的介绍。个人认为通过分析这些实际的系统来学习设计模式所得到的体会还是比较深刻的。
一、Decorator装饰模式
1. OlapModel类与OlapModelDecorator类构成Decorator模式,JPivot基于OlapModelDecorator为OlapModel提供了两种装饰器:
OlapModelProxy对在HttpSession中唯一添加OlapModel提供了支持,并限制了其它对象对OlapModel的初始化与重置操作;增加了OlapModel在改变时通知注册的Listener所发生的改变这一职责。
CachingOlapModel为OlapModel提供了在一定的周期内(Model没有发生改变时)缓存Result结果集的职责。
2. PartBuilder类与PartBuilderDecorator类构成Decorator模式,具体的装饰器比较多,但装饰器都是针对特定的Part来装饰的。通过继承这些装饰器,可以为构建Table的各个部分(行、列、单元格、切片)的xml进行。JPivot结合Apache PATH o:connecttype="rect" gradientshapeok="t" o:extrusionok="f" />SHAPE id=_x0000_s1026 style="MARGIN-TOP: 0px; Z-INDEX: 1; LEFT: 0px; MARGIN-LEFT: 0px; WIDTH: 346.5pt; POSITION: absolute; HEIGHT: 254.6pt; TEXT-ALIGN: left; mso-position-horizontal-relative: text; mso-position-vertical-relative: text" type="#_x0000_t75" />/WRAPBLOCK />
Digester,使我们可以不用修改任何现有代码,仅需实现这些装饰器及对应TableExtension,并在config.xml中注册就可以对所生成的Olap Pivot Table在UI表现上进行扩充,并且可以增加或修改对相应的交互操作进行处理的Handler。
3. JPivot使用wfc.tree包对成员及层次的树形展示进行支持。JPivot定义了一些装饰来增加树形控件模型的职责。其中:
-
GroupingTreeModelDecorator 装饰增加的职责是在子成员数目比较大的时候,可以分组显示子成员以提高效率。
-
OptimizingTreeModelDecorator 装饰增加的职责是可以根据过滤器( NodeFilter )动态的隐藏掉不满足过滤条件的分支及节点。
-
SimpleOptimizingTreeModelDecorator 装饰增加的职责是当树只有一个顶级根节点的时候,不显示该根节点,而是直接显示第二层的子节点,这样用户就不用每次都要做无谓的展开操作。
-
CachingTreeModelDecorator 装饰增加的职责是当用户在树形中执行展开等浏览操作时,保存用户每次操作请求的数据,形成 TreeModel 节点的缓存,以提高以后再次操作的相应效率。
二、Observer观察者模式
在JPivot中,大量使用Observer模式解除视图与模型之间的耦合,处理两者之间的依赖关系及内容与表示同步。
Model类及其子类(JPivot自定义Olap 模型的Mondrian实现、xml/a实现)与ModelChangeListener及其子类(表格、钻取/旋转/排序排名等、图形、成员树等展示控件)构成Observer模式(严格的说应该是Listener模式),作用是在模型发生改变时,同步更新所有的UI控件展示。