|
[摘要]报表始终是所有信息系统中不可或缺的内容,尤其是在国内的应用系统中,报表更是占据着相当重要的地位。本文提出了一个基于JFreeReport报表设计器的设计方案,并给出了基于Swing的实现过程。在设计过程中主要使用了Swing、XML持久化保存、MVC设计模式、软件工程等技术。
[关键词]JFreeReport;报表生成;设计模式;XML持久化保存
1 基于JFreeReport报表背景与简介
企业信息化过程中需要处理大量的有关多维数据集的信息,而表现数据信息处理结果的一种理想的方式就是数据报表。报表定义文件是生成复杂报表的重要文件,主要描述如何使用指定的格式生成复杂的报表,对于JFreeReport定义数据报表格式所需的XML文件通常是由人工输入编写的,对于格式较为简单的报表还可以接受,但是对于大型数据库报表,数据报表关系格式复杂而且字段数量较多,人工输入易出错又繁琐,本文研究的报表设计器就是针对JFreeReport报表生成内核进行开发的。
2系统整体设计
2.1系统整体框架与MVC模式
基于Java的Swing技术,设计器内核使用JFreeReport,用于绘制和输出各种复杂的统计报表。设计器的主要工作是将用户对报表的设计意图通过报表生成内核的API传递至报表生成内核,再将报表生成的结果实时反馈给用户。报表生成后,应该能够持久化保存。此外,根据当前流行的数据库报表的功能,系统也要具备将报表转换成诸如PDF、HTML等其他文件格式的功能。让用户对于事实数据具有全面的分析和了解,增加数据流通为企业带来的效益。
为了能够方便地重用组件并且体现模块的独立性,把整个系统组件分解组织成11个类包,只要得到这个包文件,其他类也可以引用该包中的所有类并使用里面的某些组件。该类包分别为:datasource(数据源包),dbutilities(数据库工具包),io(磁盘操作包),jfdmainfrm(系统主窗体包),reportgenerate(报表生成包),tools(系统所需的其他工具类),wmvc(MVC包,包含有MVC模式所需的基础支持类,它是系统的底层基类)。
MVC模式的优点在于这种方法鼓励重用,而不是重新设计。有相同机理的组件,只要改写不相同的模型部分,便能制造出不同功效的组件,而不用重新设计每个组件,缩短和减轻了设计工作的时间和难度。因此选择了MVC设计模式作为系统的主体架构[1]。
MVC模式基本实现过程为:
(1)控制器;
(2)控制器新建一个或多个视图对象,并将它们与模型相关联;
(3)控制器改变模型的状态;
(4)当模型的状态改变时,模型将会自动刷新与之相关的视图。
Java通过专门的类Observable及Observer接口来实现MVC模式。Model类必须继承Observable类,View类必须实现接口Observer。正是由于实现了上述结构,当模型发生改变时,模型就会自动刷新与之相关的视图。其UML序列图可以表示为图1。
在系统具体实现时,首先建立视图类WmvcView,它继承了Obsever抽象类,重载了update()和updateView()方法。然后构造模型类WmvcModel,它继承自Observable抽象类,重载了addView(),deleteView()和notifyViews()方法。通过addView()方法,模型将实例化视图并且将视图与模型建立关系。最后创建控制器WmvcControllor类,它实现了ActionListener和ItemListener两个接口,重写actionPerformed()和itemStateChanged()方法[2]。至此,系统的MVC框架搭建完成。
最后建立WmvcApp类,它应用了单例模式(Singleton)来保证在整个系统中只有一个实例存在,实现了类似于VC++中的WinApp机制。应用单例模式的思路是:一个类能返回对象一个引用和一个获得该实例的方法。当调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用;同时还将该类的构造函数定义为私有方法[3]。这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。
2.2系统界面设计
整个主界面采用有限制的多文档结构。所谓有限制的多文档结构,就是同一时间内只能打开一个文档的多文档结构。为什么要这样设计而不直接使用单文档结构呢?首先,是由于JFreeReport内核的限制。目前,JFreeReport只支持一个报表对象在内存中,也就是说同一时间只能打开一个报表文件。因此对于设计器系统来说,同一时间当然也只能打开一个文档。但是JFreeReport是一个发展很快的项目,也许它很快就能支持多文档编辑,为了保持系统的可扩展性,所以选择了多文档结构。其次,在系统界面中还引入了子菜单的概念,通过在子窗体上构造子菜单,将报表菜单与系统菜单分离,使得主界面更加简约,用户操作简便。
系统界面主要分为以下几个区域:
(1)系统菜单:用户通过它进行保存/打开报表、设置数据源等系统操作;
(2)报表菜单:用户通过它对报表进行格式转换、打印、翻页、比例设置等操作;
(3)报表工具条:提供报表菜单常用项的快捷操作;
(4)编辑浏览域:编辑报表时实时显示编辑效果;
(5)编辑状态条:显示报表页数等状态信息。
报表元素编辑区:报表编辑的主要区域,以分区域的方式显示报表元素的简要信息。并提供对于报表元素添加、删除、修改功能的操作方法。
2.3数据库连接类的设计
Java的数据库编程主要使用JDBC类库。使用JDBC类库进行编程,调用Connection.getConnection()方法时,获得一个Connection对象,并使用正面(Facade)模式来实现JDBC编程[4]。
DbFacade是一个Facade对象,它使用execute()和executeQuery()两种方法执行SQL语句。前者执行数据库操作语句,后者执行数据库查询语句。在DbFacade类中包装了两个对象,SqlStatement和ConnectionMgr。SqlStatement类主要实现SQL语句的查询,ConnectionMgr类实现了一个单例(Singleton)模式,用于管理与数据库的连接。; |
|