陳穎,陳進(jìn)
(1.湖北大學(xué)圖書館,湖北 武漢 430062;2.武漢大學(xué)遙感信息工程學(xué)院,湖北 武漢 430079;3.天下圖數(shù)據(jù)技術(shù)有限公司,北京 100083)
動(dòng)態(tài)表單又稱為智能表單、電子表單.稱之為動(dòng)態(tài)表單原因在于表單的展現(xiàn)、數(shù)據(jù)交互具有很強(qiáng)的動(dòng)態(tài)特征.動(dòng)態(tài)表單技術(shù)涉及到表單的設(shè)計(jì)、生成、傳輸和發(fā)布,表單數(shù)據(jù)的編輯、傳輸、存儲(chǔ)、更新以及安全控制等多個(gè)方面[1],在表單技術(shù)的應(yīng)用與發(fā)展過程中,出現(xiàn)了HTML表單、InfoPath表單,Adobe表單、XForms表單等表單應(yīng)用技術(shù)[2],以上相關(guān)的智能表單軟件或表單解決方案,目前都是以面向數(shù)據(jù)收集和交換為主,對(duì)用戶交互能力的支持較弱,很難滿足GIS行業(yè)數(shù)據(jù)操作密集、用戶界面交互復(fù)雜、與空間信息處理功能緊密集成等GIS應(yīng)用需求.在系統(tǒng)的部署上,現(xiàn)有商用表單軟件解決方案過于復(fù)雜,難以便捷地實(shí)現(xiàn)GIS行業(yè)用戶的多種部署模式要求與運(yùn)行維護(hù)要求.
在動(dòng)態(tài)表單技術(shù)的研究方面,文獻(xiàn)[3]中提出了一個(gè)Usher系統(tǒng)和一種提高表單輸入數(shù)據(jù)質(zhì)量的自動(dòng)化方法,該系統(tǒng)采用概率模型方法在每一步數(shù)據(jù)輸入操作時(shí)保證輸入數(shù)據(jù)的質(zhì)量;文獻(xiàn)[4]中通過解析XML文件的方式,提高頁面復(fù)用率,減少頁面維護(hù)工作量;文獻(xiàn)[5]中提出擴(kuò)展動(dòng)態(tài)表單架構(gòu)XDF,可以幫助用戶靈活地?cái)U(kuò)展新表單組件的基本表單結(jié)構(gòu),或通過智能搜索重用已有表單組件;文獻(xiàn)[6]中提出了一種動(dòng)態(tài)表單平臺(tái)AdapForms,用于創(chuàng)建動(dòng)態(tài)表單,實(shí)現(xiàn)數(shù)據(jù)輸入驗(yàn)證和表單呈現(xiàn);張佳強(qiáng)等[7]研究了信息系統(tǒng)中表單的動(dòng)態(tài)定制技術(shù);王智廣等[8]結(jié)合Fckeditor在線編輯器和FreeMarker組件,設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)B/S結(jié)構(gòu)的、可視化的動(dòng)態(tài)表單編輯器.
本文中主要針對(duì)GIS行業(yè)應(yīng)用特點(diǎn)與用戶特點(diǎn),構(gòu)建并實(shí)現(xiàn)了一種新的面向GIS應(yīng)用優(yōu)化的動(dòng)態(tài)表單組件,該動(dòng)態(tài)表單組件包括一個(gè)可視化的表單設(shè)計(jì)器,支持所見即所得的表單設(shè)計(jì),以及一個(gè)表單客戶端組件,支持表單的數(shù)據(jù)呈現(xiàn)、數(shù)據(jù)編輯、數(shù)據(jù)存儲(chǔ)更新與打印輸出.該動(dòng)態(tài)表單組件在系統(tǒng)架構(gòu)和功能的設(shè)計(jì)和實(shí)現(xiàn)上充分考慮組件的可復(fù)用性和擴(kuò)展性,提供了專門的接口,可以方便地與GIS系統(tǒng)或工作流管理系統(tǒng)集成使用.
動(dòng)態(tài)表單組件在總體架構(gòu)上由表單設(shè)計(jì)器、表單模型、數(shù)據(jù)模型、表單引擎、客戶端組件5個(gè)主要部分組成,其總體架構(gòu)如圖1所示.
圖1 動(dòng)態(tài)表單組件總體架構(gòu)
動(dòng)態(tài)表單組件的各功能部件說明如下:
(1)表單設(shè)計(jì)器.表單設(shè)計(jì)器是一個(gè)可視化的表單設(shè)計(jì)工具,可以對(duì)表單的樣式進(jìn)行繪制、設(shè)定每個(gè)單元格的輸入類型、輸出風(fēng)格、綁定單元格到指定的數(shù)據(jù)源,創(chuàng)建分組、為事件編寫腳本.并負(fù)責(zé)對(duì)表單涉及到的數(shù)據(jù)模型進(jìn)行定義,包括主表、子表、關(guān)聯(lián)關(guān)系、動(dòng)態(tài)參數(shù)等等.
(2)表單模型.采用面向?qū)ο蟮姆绞綄?duì)表單結(jié)構(gòu)進(jìn)行分析建模,形成表單、分組、單元格三級(jí)對(duì)象模型.單元格是表單中最小、最基本的數(shù)據(jù)輸入輸出單位.單元格根據(jù)輸入類型的不同又可抽象為多個(gè)子類,稱為分組.在單元格與表單兩級(jí)對(duì)象上,設(shè)計(jì)了事件機(jī)制,可以編寫腳本進(jìn)行更加復(fù)雜的運(yùn)算與操作.通過表單設(shè)計(jì)器設(shè)計(jì)表單,可以形成表單模型的實(shí)例,然后被序列化后進(jìn)行存儲(chǔ).表單中的各種靜態(tài)元素,如表格邊框、標(biāo)簽、前景色、背景色、背景圖片、字體等等信息,作為表單模型的樣式模版隨表單模型一起保存.
(3)數(shù)據(jù)模型.描述了表單模型對(duì)應(yīng)的數(shù)據(jù)來源,包含表、子表、關(guān)聯(lián)關(guān)系、關(guān)聯(lián)參數(shù)等內(nèi)容.
(4)客戶端組件.客戶端組件是動(dòng)態(tài)表單組件中面向操作用戶的交互接口.客戶端組件負(fù)責(zé)與表單引擎內(nèi)的各種控制器進(jìn)行必要的交互,通過預(yù)定義的API接口,向外部提供表單交互界面的可視化呈現(xiàn)、表單數(shù)據(jù)顯示、提交、表單打印輸出、格式轉(zhuǎn)換等等功能.
(5)表單引擎.表單引擎是動(dòng)態(tài)表單組件最核心、最復(fù)雜的部分,由6個(gè)主要部分組成,分別為表單頂層控制器、動(dòng)態(tài)編譯控制器、數(shù)據(jù)輸入控制器、數(shù)據(jù)輸出控制器、數(shù)據(jù)持久控制器、腳本事件控制器.在客戶端運(yùn)行時(shí),表單引擎讀取特定的表單模型實(shí)例,根據(jù)表單模型實(shí)例提供的信息,控制表單的各種行為.各控制器之間的主要邏輯關(guān)系如圖1所示.
①表單頂層控制器.負(fù)責(zé)讀取表單模型實(shí)例,初始化相關(guān)環(huán)境,并統(tǒng)一協(xié)調(diào)表單引擎其它控制器之間的調(diào)用邏輯關(guān)系.例如腳本的執(zhí)行,當(dāng)模型內(nèi)有腳本代碼時(shí),則調(diào)用動(dòng)態(tài)編譯控制器進(jìn)行編譯,然后將腳本對(duì)象實(shí)例化后與腳本事件控制器進(jìn)行掛接;如果腳本采用的是引用外部已編譯好的DLL方式,則采用反射機(jī)制加載該DLL,然后與腳本事件控制器進(jìn)行掛接.
②動(dòng)態(tài)編譯控制器.該控制器通過.NET Framework2.0提供的代碼內(nèi)存編譯機(jī)制,對(duì)表單模型中嵌入的腳本進(jìn)行內(nèi)存編譯.如果編譯成功,則實(shí)例化腳本對(duì)象,并對(duì)外返回該腳本對(duì)象實(shí)例的引用接口.
③腳本事件控制器.根據(jù)表單定義的事件響應(yīng)機(jī)制,在其他控制器的觸發(fā)下,對(duì)具體事件中編寫的腳本內(nèi)容進(jìn)行執(zhí)行.腳本采用的是編譯成內(nèi)存動(dòng)態(tài)鏈接庫,或引用外部動(dòng)態(tài)鏈接庫進(jìn)行執(zhí)行的方式.表單支持的事件被抽象成接口IFormEvent,外部動(dòng)態(tài)鏈接庫應(yīng)對(duì)該接口進(jìn)行實(shí)現(xiàn).采用內(nèi)部編譯方式的腳本,由表單設(shè)計(jì)器自動(dòng)生成事件接口的包裝類.在具體的表單模型實(shí)例化時(shí),腳本事件控制器獲取屬于該表單模型的腳本對(duì)象實(shí)例接口,其它控制器通過腳本事件控制器即可進(jìn)行事件的觸發(fā)與腳本內(nèi)容的執(zhí)行.
④數(shù)據(jù)輸入控制器.根據(jù)表單模型實(shí)例中定義的每個(gè)單元格的輸入控制元數(shù)據(jù),對(duì)單元格的用戶交互輸入風(fēng)格、內(nèi)容和交互方式進(jìn)行控制.例如對(duì)于要求從下拉列表中選擇輸入項(xiàng)的單元格,由數(shù)據(jù)輸入控制器響應(yīng)用戶操作,讀取該單元格綁定的列表字典,彈出下拉列表供用戶選擇,然后調(diào)用數(shù)據(jù)持久控制器將用戶當(dāng)前選擇的內(nèi)容進(jìn)行緩存.用戶在完成數(shù)據(jù)輸入、編輯等操作后,數(shù)據(jù)輸入控制器會(huì)調(diào)用數(shù)據(jù)持久控制器對(duì)綁定到該單元格的數(shù)據(jù)源進(jìn)行數(shù)據(jù)更新.
⑤數(shù)據(jù)輸出控制器.根據(jù)表單模型實(shí)例中定義的每個(gè)單元格的輸出控制元數(shù)據(jù),對(duì)數(shù)據(jù)的表現(xiàn)方式進(jìn)行格式化后輸出.在表單數(shù)據(jù)初始顯示以及用戶進(jìn)行了編輯操作后,表單引擎都會(huì)調(diào)用數(shù)據(jù)輸出控制器對(duì)該單元內(nèi)容進(jìn)行刷新操作.
⑥數(shù)據(jù)持久控制器.負(fù)責(zé)解析數(shù)據(jù)模型,根據(jù)數(shù)據(jù)模型定義的業(yè)務(wù)表及相關(guān)關(guān)系與參數(shù),執(zhí)行數(shù)據(jù)庫訪問,建立當(dāng)前表單對(duì)應(yīng)的業(yè)務(wù)數(shù)據(jù)實(shí)例.同時(shí)對(duì)外提供業(yè)務(wù)數(shù)據(jù)讀取、更新、添加、刪除、回退、提交等功能的接口服務(wù).
2.1動(dòng)態(tài)編譯技術(shù)本動(dòng)態(tài)表單組件采用動(dòng)態(tài)編譯機(jī)制對(duì)表單的腳本事件進(jìn)行支持.通過腳本可以提供強(qiáng)大的內(nèi)部邏輯處理能力和與外部應(yīng)用程序集成、交互處理的能力.例如可以在表單設(shè)計(jì)器中對(duì)表單嵌入腳本代碼,由表單運(yùn)行時(shí)組件在執(zhí)行時(shí)對(duì)腳本進(jìn)行調(diào)用,或者通過腳本與外部組件或宿主程序進(jìn)行交互.通過對(duì)腳本事件的支持,本動(dòng)態(tài)表單組件可以方便地與GIS應(yīng)用的相關(guān)功能模塊進(jìn)行集成.
動(dòng)態(tài)編譯是利用Microsoft .NET Framework 2.0框架提供的相關(guān)底層組件來實(shí)現(xiàn)的..NET Framework 2.0中包括了一個(gè)CodeDOM,即代碼文檔對(duì)象模型,在.NET Framework 和Visual Studio .NET中,CodeDOM起著重要的幕后作用.CodeDOM以一種語言中立的方式來表示源代碼文檔,通過操作和使用CodeDOM對(duì)象圖生成源代碼,以及編譯后的程序集.本表單組件主要用到了CodeDOM提供的C#代碼編譯能力.使用CodeDomProvider編譯程序集時(shí),編譯的對(duì)象可以有多種來源,如外部編寫的源代碼文件、以字符串保存在內(nèi)存中的源代碼或者CodeDOM對(duì)象圖等.在進(jìn)行編譯時(shí)會(huì)涉及一些參數(shù)的配置,CodeDOM提供的所有標(biāo)準(zhǔn)編譯調(diào)用方法都有一個(gè)CompilerParameters類型的參數(shù),指示用于編譯的選項(xiàng).該參數(shù)需要進(jìn)行設(shè)置的主要屬性有:OutputAssembly、GenerateExecu_table、IncludeDebugInformation、Referenced_Assemblies、GenerateInMemory、Compiler_Option、Win32Resource、WarningLevel等.下面的代碼示例簡(jiǎn)要說明了如何將保存在字符串中的源代碼編譯成內(nèi)存程序集以及進(jìn)行調(diào)用的具體過程:
//添加引用
using System.Reflection;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
//創(chuàng)建需要編譯的代碼
string strCodeString=@"
public class MyClass
{
public string GetString()
{
return ""Dynamic Compile "";
}
}";
//設(shè)置編譯參數(shù)
CompilerParameters compilerParams = new CompilerParameters();
compilerParams.CompilerOptions = "/target:library /optimize";
compilerParams.GenerateInMemory = true; //編譯時(shí)在內(nèi)存輸出
compilerParams.IncludeDebugInformation = true; //生成調(diào)試信息
//添加程序集引用
compilerParams.ReferencedAssemblies.Add("mscorlib.dll");
compilerParams.ReferencedAssemblies.Add("System.dll");
CSharpCodeProvider compiler = new CSharpCodeProvider();
//執(zhí)行編譯
CompilerResults results =
compiler.CompileAssemblyFromSource(compilerParams, strCodeString);
//獲得編譯后的程序集接口
Assembly asm = results.CompiledAssembly;
//獲取編譯后的類型
object objMyClass = asm.CreateInstance("MyClass ");
Type MyClassType = objMyClass.GetType();
MethodInfo mi = MyClassType.GetMethod("GetString");
///執(zhí)行調(diào)用,輸出結(jié)果
object o = mi.Invoke(objMyClass, null);
Console.WriteLine(o);
2.2組件外部接口的實(shí)現(xiàn)本動(dòng)態(tài)表單組件支持獨(dú)立應(yīng)用模式與工作流集成應(yīng)用模式兩種模式,既可以作為數(shù)據(jù)呈現(xiàn)與數(shù)據(jù)錄入工具獨(dú)立使用,也可以與工作流組件集成使用.針對(duì)獨(dú)立應(yīng)用模式和工作流集成應(yīng)用模式兩種運(yùn)行模式的需要,設(shè)計(jì)并實(shí)現(xiàn)了動(dòng)態(tài)表單組件的獨(dú)立模式接口和工作流集成模式接口,同時(shí)將共同的部分抽象成公共接口,以保證表單組件具備良好的獨(dú)立性、可復(fù)用性與可擴(kuò)展性.三類接口應(yīng)盡量簡(jiǎn)單易用,并易于外部對(duì)表單行為的控制.動(dòng)態(tài)表單組件與工作流管理系統(tǒng)間采用松散耦合的方式,工作流組件、動(dòng)態(tài)表單組件之間不存在直接調(diào)用與依賴關(guān)系.由具體的客戶端應(yīng)用程序根據(jù)應(yīng)用需求調(diào)用工作流組件負(fù)責(zé)流程的控制,調(diào)用動(dòng)態(tài)表單組件完成業(yè)務(wù)數(shù)據(jù)的錄入與展現(xiàn).公共接口(IFormRuntimeBase)提供了表單初始化設(shè)置、模型加載、數(shù)據(jù)加載、打印等操作方法.其包含的主要成員如表1所示.獨(dú)立應(yīng)用模式接口(IFormRuntimeSA)從公共接口IFormRuntimeBase繼承,在其基礎(chǔ)上增加了獨(dú)立應(yīng)用模式下必要的成員.其包含的主要成員如表2所示.工作流集成模式接口(IFormRuntimeWF)從公共接口IFormRuntimeBase繼承,在其基礎(chǔ)上增加了工作流集成模式下必要的成員.其包含的主要成員如表3所示.
本動(dòng)態(tài)表單組件在獨(dú)立應(yīng)用模式下主要用于與業(yè)務(wù)流程控制無關(guān)的數(shù)據(jù)的錄入.在沒有使用動(dòng)態(tài)表單組件前,為了實(shí)現(xiàn)數(shù)據(jù)表格設(shè)計(jì)、數(shù)據(jù)錄入、編輯、提交等功能,一般是在GIS應(yīng)用系統(tǒng)的每個(gè)模塊中使用對(duì)話框和ADO.NET單獨(dú)編碼實(shí)現(xiàn).在不同的GIS應(yīng)用系統(tǒng)中,類似的功能都需要重復(fù)進(jìn)行編碼,代碼的復(fù)用率很低.在GIS應(yīng)用系統(tǒng)中使用動(dòng)態(tài)表單組件后,數(shù)據(jù)表格設(shè)計(jì)、數(shù)據(jù)錄入、編輯等功能的實(shí)現(xiàn)幾乎沒有編碼工作量.原本需要編程實(shí)現(xiàn)的一些報(bào)表表格,也可以使用動(dòng)態(tài)表單組件的表單設(shè)計(jì)器進(jìn)行可視化的設(shè)計(jì),方便快捷地完成報(bào)表設(shè)計(jì)、打印與輸出.動(dòng)態(tài)表單組件能方便地與不同GIS應(yīng)用系統(tǒng)進(jìn)行集成,實(shí)現(xiàn)了軟件復(fù)用,既節(jié)省了人力,也保證了質(zhì)量.圖2和圖3分別是某土地利用規(guī)劃管理信息系統(tǒng)的表單設(shè)計(jì)界面和客戶端數(shù)據(jù)報(bào)表展示界面,用于完成GIS業(yè)務(wù)數(shù)據(jù)表單設(shè)計(jì)、表單呈現(xiàn)、錄入編輯、報(bào)表輸出與打印等作業(yè),均取得了較好的應(yīng)用效果.
表1 公共接口主要成員列表
表2 獨(dú)立應(yīng)用模式接口主要成員列表
表3 工作流集成模式接口主要成員列表
圖2 元數(shù)據(jù)錄入表單設(shè)計(jì)界面圖
圖3 數(shù)據(jù)報(bào)表展示界面
圖4 工作流集成模式下客戶端運(yùn)行界面
在需要交互式審批業(yè)務(wù)流程的實(shí)際GIS應(yīng)用項(xiàng)目中,采用工作流管理系統(tǒng)作為業(yè)務(wù)流程建模、業(yè)務(wù)流程管理的平臺(tái),集成使用本動(dòng)態(tài)表單組件作為表格設(shè)計(jì)、數(shù)據(jù)錄入、數(shù)據(jù)展示與輸出工具,取得了較好的應(yīng)用效果.圖4是某GIS應(yīng)用系統(tǒng)中動(dòng)態(tài)表單組件在工作流集成模式下的客戶端運(yùn)行界面.在工作流集成模式下,除具有獨(dú)立模式下的所有功能外,動(dòng)態(tài)表單組件還可以通過其組件外部接口,實(shí)現(xiàn)業(yè)務(wù)數(shù)據(jù)與工作流業(yè)務(wù)模型、業(yè)務(wù)實(shí)例的關(guān)聯(lián)一致性.
地理信息應(yīng)用系統(tǒng)存在數(shù)據(jù)訪問量大、用戶界面交互需求復(fù)雜、圖形應(yīng)用多,即時(shí)響應(yīng)速度要求高的特點(diǎn).本研究的動(dòng)態(tài)表單組件能較好地適應(yīng)GIS行業(yè)的應(yīng)用需求,主要有以下優(yōu)點(diǎn):①可以有效提高GIS應(yīng)用系統(tǒng)的開發(fā)速度與質(zhì)量,結(jié)構(gòu)靈活,易于部署與維護(hù);②提供很好的用戶交互能力與響應(yīng)速度;③在外部接口上同時(shí)支持獨(dú)立應(yīng)用模式與工作流集成應(yīng)用模式,具有較好的適用性;④在組件設(shè)計(jì)上采用MVC模式,結(jié)構(gòu)清晰,易于維護(hù)擴(kuò)展;⑤引入腳本的動(dòng)態(tài)編譯與執(zhí)行機(jī)制,為表單功能擴(kuò)展提供了良好的基礎(chǔ).
[1] 李穎.電子數(shù)據(jù)交換技術(shù)與應(yīng)用[M].武漢:武漢大學(xué)出版社,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] 張佳強(qiáng),王士同.信息管理系統(tǒng)動(dòng)態(tài)表單技術(shù)的研究與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用與軟件,2010,27(8):30-32.
[8] 王智廣,陳濤,陳明,等.軟件開發(fā)中動(dòng)態(tài)表單的解決方案[J].內(nèi)蒙古師范大學(xué)學(xué)報(bào):自然科學(xué)漢文版,2010,39(5):467-472.