APP下载

集成工作流的GIS应用动态表单组件设计与实现

2013-11-20陈颖陈进

湖北大学学报(自然科学版) 2013年4期
关键词:表单脚本单元格

陈颖,陈进

(1.湖北大学图书馆,湖北 武汉 430062;2.武汉大学遥感信息工程学院,湖北 武汉 430079;3.天下图数据技术有限公司,北京 100083)

0 引言

动态表单又称为智能表单、电子表单.称之为动态表单原因在于表单的展现、数据交互具有很强的动态特征.动态表单技术涉及到表单的设计、生成、传输和发布,表单数据的编辑、传输、存储、更新以及安全控制等多个方面[1],在表单技术的应用与发展过程中,出现了HTML表单、InfoPath表单,Adobe表单、XForms表单等表单应用技术[2],以上相关的智能表单软件或表单解决方案,目前都是以面向数据收集和交换为主,对用户交互能力的支持较弱,很难满足GIS行业数据操作密集、用户界面交互复杂、与空间信息处理功能紧密集成等GIS应用需求.在系统的部署上,现有商用表单软件解决方案过于复杂,难以便捷地实现GIS行业用户的多种部署模式要求与运行维护要求.

在动态表单技术的研究方面,文献[3]中提出了一个Usher系统和一种提高表单输入数据质量的自动化方法,该系统采用概率模型方法在每一步数据输入操作时保证输入数据的质量;文献[4]中通过解析XML文件的方式,提高页面复用率,减少页面维护工作量;文献[5]中提出扩展动态表单架构XDF,可以帮助用户灵活地扩展新表单组件的基本表单结构,或通过智能搜索重用已有表单组件;文献[6]中提出了一种动态表单平台AdapForms,用于创建动态表单,实现数据输入验证和表单呈现;张佳强等[7]研究了信息系统中表单的动态定制技术;王智广等[8]结合Fckeditor在线编辑器和FreeMarker组件,设计并实现了一个B/S结构的、可视化的动态表单编辑器.

本文中主要针对GIS行业应用特点与用户特点,构建并实现了一种新的面向GIS应用优化的动态表单组件,该动态表单组件包括一个可视化的表单设计器,支持所见即所得的表单设计,以及一个表单客户端组件,支持表单的数据呈现、数据编辑、数据存储更新与打印输出.该动态表单组件在系统架构和功能的设计和实现上充分考虑组件的可复用性和扩展性,提供了专门的接口,可以方便地与GIS系统或工作流管理系统集成使用.

1 动态表单组件总体架构

动态表单组件在总体架构上由表单设计器、表单模型、数据模型、表单引擎、客户端组件5个主要部分组成,其总体架构如图1所示.

图1 动态表单组件总体架构

动态表单组件的各功能部件说明如下:

(1)表单设计器.表单设计器是一个可视化的表单设计工具,可以对表单的样式进行绘制、设定每个单元格的输入类型、输出风格、绑定单元格到指定的数据源,创建分组、为事件编写脚本.并负责对表单涉及到的数据模型进行定义,包括主表、子表、关联关系、动态参数等等.

(2)表单模型.采用面向对象的方式对表单结构进行分析建模,形成表单、分组、单元格三级对象模型.单元格是表单中最小、最基本的数据输入输出单位.单元格根据输入类型的不同又可抽象为多个子类,称为分组.在单元格与表单两级对象上,设计了事件机制,可以编写脚本进行更加复杂的运算与操作.通过表单设计器设计表单,可以形成表单模型的实例,然后被序列化后进行存储.表单中的各种静态元素,如表格边框、标签、前景色、背景色、背景图片、字体等等信息,作为表单模型的样式模版随表单模型一起保存.

(3)数据模型.描述了表单模型对应的数据来源,包含表、子表、关联关系、关联参数等内容.

(4)客户端组件.客户端组件是动态表单组件中面向操作用户的交互接口.客户端组件负责与表单引擎内的各种控制器进行必要的交互,通过预定义的API接口,向外部提供表单交互界面的可视化呈现、表单数据显示、提交、表单打印输出、格式转换等等功能.

(5)表单引擎.表单引擎是动态表单组件最核心、最复杂的部分,由6个主要部分组成,分别为表单顶层控制器、动态编译控制器、数据输入控制器、数据输出控制器、数据持久控制器、脚本事件控制器.在客户端运行时,表单引擎读取特定的表单模型实例,根据表单模型实例提供的信息,控制表单的各种行为.各控制器之间的主要逻辑关系如图1所示.

①表单顶层控制器.负责读取表单模型实例,初始化相关环境,并统一协调表单引擎其它控制器之间的调用逻辑关系.例如脚本的执行,当模型内有脚本代码时,则调用动态编译控制器进行编译,然后将脚本对象实例化后与脚本事件控制器进行挂接;如果脚本采用的是引用外部已编译好的DLL方式,则采用反射机制加载该DLL,然后与脚本事件控制器进行挂接.

②动态编译控制器.该控制器通过.NET Framework2.0提供的代码内存编译机制,对表单模型中嵌入的脚本进行内存编译.如果编译成功,则实例化脚本对象,并对外返回该脚本对象实例的引用接口.

③脚本事件控制器.根据表单定义的事件响应机制,在其他控制器的触发下,对具体事件中编写的脚本内容进行执行.脚本采用的是编译成内存动态链接库,或引用外部动态链接库进行执行的方式.表单支持的事件被抽象成接口IFormEvent,外部动态链接库应对该接口进行实现.采用内部编译方式的脚本,由表单设计器自动生成事件接口的包装类.在具体的表单模型实例化时,脚本事件控制器获取属于该表单模型的脚本对象实例接口,其它控制器通过脚本事件控制器即可进行事件的触发与脚本内容的执行.

④数据输入控制器.根据表单模型实例中定义的每个单元格的输入控制元数据,对单元格的用户交互输入风格、内容和交互方式进行控制.例如对于要求从下拉列表中选择输入项的单元格,由数据输入控制器响应用户操作,读取该单元格绑定的列表字典,弹出下拉列表供用户选择,然后调用数据持久控制器将用户当前选择的内容进行缓存.用户在完成数据输入、编辑等操作后,数据输入控制器会调用数据持久控制器对绑定到该单元格的数据源进行数据更新.

⑤数据输出控制器.根据表单模型实例中定义的每个单元格的输出控制元数据,对数据的表现方式进行格式化后输出.在表单数据初始显示以及用户进行了编辑操作后,表单引擎都会调用数据输出控制器对该单元内容进行刷新操作.

⑥数据持久控制器.负责解析数据模型,根据数据模型定义的业务表及相关关系与参数,执行数据库访问,建立当前表单对应的业务数据实例.同时对外提供业务数据读取、更新、添加、删除、回退、提交等功能的接口服务.

2 关键技术的实现

2.1动态编译技术本动态表单组件采用动态编译机制对表单的脚本事件进行支持.通过脚本可以提供强大的内部逻辑处理能力和与外部应用程序集成、交互处理的能力.例如可以在表单设计器中对表单嵌入脚本代码,由表单运行时组件在执行时对脚本进行调用,或者通过脚本与外部组件或宿主程序进行交互.通过对脚本事件的支持,本动态表单组件可以方便地与GIS应用的相关功能模块进行集成.

动态编译是利用Microsoft .NET Framework 2.0框架提供的相关底层组件来实现的..NET Framework 2.0中包括了一个CodeDOM,即代码文档对象模型,在.NET Framework 和Visual Studio .NET中,CodeDOM起着重要的幕后作用.CodeDOM以一种语言中立的方式来表示源代码文档,通过操作和使用CodeDOM对象图生成源代码,以及编译后的程序集.本表单组件主要用到了CodeDOM提供的C#代码编译能力.使用CodeDomProvider编译程序集时,编译的对象可以有多种来源,如外部编写的源代码文件、以字符串保存在内存中的源代码或者CodeDOM对象图等.在进行编译时会涉及一些参数的配置,CodeDOM提供的所有标准编译调用方法都有一个CompilerParameters类型的参数,指示用于编译的选项.该参数需要进行设置的主要属性有:OutputAssembly、GenerateExecu_table、IncludeDebugInformation、Referenced_Assemblies、GenerateInMemory、Compiler_Option、Win32Resource、WarningLevel等.下面的代码示例简要说明了如何将保存在字符串中的源代码编译成内存程序集以及进行调用的具体过程:

//添加引用

using System.Reflection;

using Microsoft.CSharp;

using System.CodeDom.Compiler;

//创建需要编译的代码

string strCodeString=@"

public class MyClass

{

public string GetString()

{

return ""Dynamic Compile "";

}

}";

//设置编译参数

CompilerParameters compilerParams = new CompilerParameters();

compilerParams.CompilerOptions = "/target:library /optimize";

compilerParams.GenerateInMemory = true; //编译时在内存输出

compilerParams.IncludeDebugInformation = true; //生成调试信息

//添加程序集引用

compilerParams.ReferencedAssemblies.Add("mscorlib.dll");

compilerParams.ReferencedAssemblies.Add("System.dll");

CSharpCodeProvider compiler = new CSharpCodeProvider();

//执行编译

CompilerResults results =

compiler.CompileAssemblyFromSource(compilerParams, strCodeString);

//获得编译后的程序集接口

Assembly asm = results.CompiledAssembly;

//获取编译后的类型

object objMyClass = asm.CreateInstance("MyClass ");

Type MyClassType = objMyClass.GetType();

MethodInfo mi = MyClassType.GetMethod("GetString");

///执行调用,输出结果

object o = mi.Invoke(objMyClass, null);

Console.WriteLine(o);

2.2组件外部接口的实现本动态表单组件支持独立应用模式与工作流集成应用模式两种模式,既可以作为数据呈现与数据录入工具独立使用,也可以与工作流组件集成使用.针对独立应用模式和工作流集成应用模式两种运行模式的需要,设计并实现了动态表单组件的独立模式接口和工作流集成模式接口,同时将共同的部分抽象成公共接口,以保证表单组件具备良好的独立性、可复用性与可扩展性.三类接口应尽量简单易用,并易于外部对表单行为的控制.动态表单组件与工作流管理系统间采用松散耦合的方式,工作流组件、动态表单组件之间不存在直接调用与依赖关系.由具体的客户端应用程序根据应用需求调用工作流组件负责流程的控制,调用动态表单组件完成业务数据的录入与展现.公共接口(IFormRuntimeBase)提供了表单初始化设置、模型加载、数据加载、打印等操作方法.其包含的主要成员如表1所示.独立应用模式接口(IFormRuntimeSA)从公共接口IFormRuntimeBase继承,在其基础上增加了独立应用模式下必要的成员.其包含的主要成员如表2所示.工作流集成模式接口(IFormRuntimeWF)从公共接口IFormRuntimeBase继承,在其基础上增加了工作流集成模式下必要的成员.其包含的主要成员如表3所示.

3 动态表单组件实际应用及分析

本动态表单组件在独立应用模式下主要用于与业务流程控制无关的数据的录入.在没有使用动态表单组件前,为了实现数据表格设计、数据录入、编辑、提交等功能,一般是在GIS应用系统的每个模块中使用对话框和ADO.NET单独编码实现.在不同的GIS应用系统中,类似的功能都需要重复进行编码,代码的复用率很低.在GIS应用系统中使用动态表单组件后,数据表格设计、数据录入、编辑等功能的实现几乎没有编码工作量.原本需要编程实现的一些报表表格,也可以使用动态表单组件的表单设计器进行可视化的设计,方便快捷地完成报表设计、打印与输出.动态表单组件能方便地与不同GIS应用系统进行集成,实现了软件复用,既节省了人力,也保证了质量.图2和图3分别是某土地利用规划管理信息系统的表单设计界面和客户端数据报表展示界面,用于完成GIS业务数据表单设计、表单呈现、录入编辑、报表输出与打印等作业,均取得了较好的应用效果.

表1 公共接口主要成员列表

表2 独立应用模式接口主要成员列表

表3 工作流集成模式接口主要成员列表

图2 元数据录入表单设计界面图

图3 数据报表展示界面

图4 工作流集成模式下客户端运行界面

在需要交互式审批业务流程的实际GIS应用项目中,采用工作流管理系统作为业务流程建模、业务流程管理的平台,集成使用本动态表单组件作为表格设计、数据录入、数据展示与输出工具,取得了较好的应用效果.图4是某GIS应用系统中动态表单组件在工作流集成模式下的客户端运行界面.在工作流集成模式下,除具有独立模式下的所有功能外,动态表单组件还可以通过其组件外部接口,实现业务数据与工作流业务模型、业务实例的关联一致性.

4 结束语

地理信息应用系统存在数据访问量大、用户界面交互需求复杂、图形应用多,即时响应速度要求高的特点.本研究的动态表单组件能较好地适应GIS行业的应用需求,主要有以下优点:①可以有效提高GIS应用系统的开发速度与质量,结构灵活,易于部署与维护;②提供很好的用户交互能力与响应速度;③在外部接口上同时支持独立应用模式与工作流集成应用模式,具有较好的适用性;④在组件设计上采用MVC模式,结构清晰,易于维护扩展;⑤引入脚本的动态编译与执行机制,为表单功能扩展提供了良好的基础.

[1] 李颖.电子数据交换技术与应用[M].武汉:武汉大学出版社,2007.

[2] Steven Pemberton. The forms working group[EB/OL]. [2012-8-20]. http://www.w3.org/MarkUp/Forms.

[3] Kuang Chen, Harr Chen, Neil Conway, et al. Usher: improving data quality with dynamic forms[J]. IEEE Transactions on Knowledge and Data Engineering,2011,23(8):1138-1153.

[4] Xu Yin. The research of workflow dynamic forms based on XML[C]//Proc of 2011 IEEE International Conference on Computer Science and Automation Engineering, CSAE,2011:331-334.

[5] Yan Kang, Jaewook Kim, Yun Peng. Extensible dynamic form approach for supplier discovery[C]//Proc of 2011 IEEE International Conference on Information Reuse and Integration(IRI),2011:83-87.

[6] Bohj, Morten, Bouvin, Niels Olof, et al. AdapForms: a framework for creating and validating adaptive forms[C]// Proc of 11th International Conference on Web Engineering, ICWE,2011:105-120.

[7] 张佳强,王士同.信息管理系统动态表单技术的研究与实现[J].计算机应用与软件,2010,27(8):30-32.

[8] 王智广,陈涛,陈明,等.软件开发中动态表单的解决方案[J].内蒙古师范大学学报:自然科学汉文版,2010,39(5):467-472.

猜你喜欢

表单脚本单元格
酒驾
电子表单系统应用分析
流水账分类统计巧实现
安奇奇与小cool 龙(第二回)
玩转方格
玩转方格
浅谈网页制作中表单的教学
浅谈Excel中常见统计个数函数的用法
快乐假期
小编的新年愿望