`

DispayTag源码分析

    博客分类:
  • JAVA
阅读更多

好长时间没有来了,这段时间忙于其他事情,现在打算整理一下呈现的控件,主要对比一下displaytag和jmesa,先看一下displaytag

概述

Displaytag是一个开源的用来呈现报表的一个工具,使用比较方便,可以满足表格的小时,可以分页显示,可以导出excel,xml,pdf等等功能,是一个功能比较强大的控件,同时也是有他的不足之处,所以这里对于他的源代码进行了分析,便于从底层理解他的编写的原理.

DisplayTag主要的原理是对于呈现的数据表格进行了抽象,抽象成一个model下的格式

 

对于他的模型抽象比较简单,这样将整个分成三个主要的模块,一个是标签部分,用来组装模型的数据,一部分是模型部分,但是是核心内容,另外一部分就是用来显示的view部分,这样将DisplayTag整体按照MVC的思想进行了系统结构.下面之一说明

整体控制标签部分

标签主要的作用就是将数据进行分解组装成上面的数据结构。组装的原理如下,按照一个简单的例子进行说明

 
  <display:table name="test">
    <display:column property="id" title="ID" />
    <display:column property="name" />
    <display:column property="email" />
    <display:column property="status" />
    <display:column property="description" title="Comments" />
  </display:table>
 

首先,标签解析TableTag,在开始的时候,doStartTag中实例化一个TableModel,然后进行属性的封装

然后,进行模型的数据组装,数据主要包括标题行和数据行二类数据类型,对于标题行有一个转换的算法,就是依靠rowNumber进行输出标题行,因为DisplayTag支持不输入任何列明的方式进行数据的输出,例如<display:table name="test" />他会按照顺序输出对象的属性,所以他按照如下算法进行:
l        如果标题内容部分为空,表示数据的第一行就是标题行,他会去解析数据的第一行放到标题行
l        如果存在列内容,首先解析ColumnTag,解析完成以后执行TableTagdoAfterBody()方法,解析完成标题行.

最后,doEndTag()方法中进行数据的整理输出

整体结构的模型部分

       系统整体模型结构如上面显示的部分,但是模型具有唯一性,模型有自己很多扩展的特性,为了防止过多的继承这个模型造成类的扩展,系统采用了一个Decorator模型对于模型进行了功能的增强,DisplayTag提供的汇总功能都是在这部分继续的扩展.他们的结构如下

 

多样的展现部分

为了满足多种数据类型的数据的展现,系统对于展现的各种模式进行的抽象,形成了一个如下结构的呈现阵列.

 

视图需要输出的,系统编写了专门的renderer,,包括输出到页面.大体的输出结构如下

 

个人感觉DisplayTag的缺点

l         无法真正完成翻页,是依靠简单的算法,主要是因为他的简单的模型的原因

l         输出的整体结构有TableWriterTemplate代码中写死,调整不够灵活,当然这个地方不建议使用模板,影响效率,可以考虑采用工具制作插件的方式.

l         标题行不能存在多行标题行和标题行的合并,无法满足中国的复杂报表的需求

l         架构中非模型直接操作模型的结构,和内部结构耦合,结构变化影响较大

优点

l         模块化较好,减少开发工作量

l         使用简单

l         界面表达方式比较丰富

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics