为了适应电子表单应用飞速发展的市场需求,IBM 推出了 Lotus Forms 电子表单解决方案,通过采用 XForms 等电子表单技术,IBM Lotus Forms 能够很方便的实现后端数据处理和后端应用整合,为所有公共或私有部门组织提供高安全性的电子表单,以充分利用现有的资源和系统来更好地为客户服务,提高运营效率。
Workplace Forms 家族包含三个产品:
- Workplace Forms Designer 是创建电子表格的主要工具; Workplace Forms Designer 提供一个用户友好的易使用的界面,例如通过拖拽方式创建表格的组件。
- Workplace Forms Server 包括三个组件: Workplace Forms Server - API 提供综合处理能力; Workplace Forms Server - Deployment Server 一个给用户的桌面电脑配置 IBM Workplace Forms Viewer ( 描述如下 ) 的小型安装系统; Workplace Forms Server - Webform Server 是一个将 XFDL 翻译成 HTML/JavaScript 的服务端组件,并提供一个小型客户翻译系统。
- Workplace Forms Viewer 是一种为使用 Workplace Forms 应用程序的用户提供增强特性的浏览器插件程序。(注意:Workplace Forms Viewer 不是使用 Workplace Forms 应用程序的必要条件,用户可以使用其它的 Web 浏览器来做这样的工作,但是 Workplace Forms Viewer 提供了更多的特性和功能)
本文作者就通过使用 Workplace Form Designer,大大简化了 XForm 表单的设计与开发,加快了开发速度。
本文作者曾参与了多个与 IBM Lotus Forms 电子表单相关项目的前期需求分析、实例编写和应用搭建。在实施过程中,作者发现:一个完整的电子表单是一个复杂的 XML 文件,其中即包含负责显示的图形控件的 XML 描述,也有电子表单所擅长得客户端计算逻辑,和描述数据的 XML 信息。在如此纷繁复杂的 XML 文件中,如何方便,清晰的操作表单文件中的业务数据,是电子表单设计,开发过程中的一个重要问题。通过 XForm 的 DataInstance 机制,可以非常清晰将表单中的数据 Modle 与 MVC 中 View 和 Controller 的清晰分离。利用这种机制,我们可以方便的通过 XML 数据交换,动态生成表单中的局部内容。这个需求往往是电子表单应用中最常见的一种设计要求,也是 Data Instance 在使用过程中最广泛的一种应用模式。下文将通过一系列的例子,对这一问题进行详细阐述。
在业务中,我们经常会遇到这样的需求,用户希望根据自己输入,动态生成表单中的某些局部信息。针对 XForm 中数据被封装到 DataInstance 中的情况,我们应该如何实现呢?现在,常用的方式有两种,WebService 或者 XML 数据交换。本文,将由浅入深的为大家介绍通过 XML 数据交换,实现 DataInstance 的动态更新。
演示 1:如何从电子表单中抽取只封装业务数据的 DataInstance
-
首先,我们将通过 Lotus Workplace Form Designer 这个图形化的工具去创建这个 Xfrom 。此 Xform 中的 DataInstance 将包含以下信息:产品编号,产品名称,产品简述,及厂家联系方式。它的 XML 的 DataInstance 结构如下:
<xforms:instance id="FormData" xmlns=""> <document> <FormData> <ProdNum></ProdNum> ―――产品编号 <ProdName></ProdName> ―――产品名称 <ProdDes></ProdDes> ―――产品描述 <ProdContr></ProdContr> ―――厂家联系方式 </FormData> <version>1.0</version> </document> </xforms:instance>
-
我们通过 Form Designer,将 XML DataInstance 托拽到 Designer 的设计面板上,它将自动为我们创建 DataInstance 中元素的可视化组件并将他们一一关联起来。效果如下:
图 1. 可视化组件
产生代码如下:
<field sid=" Field1"> <xforms:input ref="instance('FormData')/FormData/ProdNum"> <xforms:label> 产品编号:<xforms:label> </xforms:input> <itemlocation> <x>39</x> <y>56</y> <width>130</width> </itemlocation> <scrollhoriz>wordwrap</scrollhoriz> </field>
其中,
<xforms:input ref="instance('FormData')/FormData/ProdNum">是用来将 Filed1 与 DataInstance 中的产品编号关联起来的关键。此时如果,在 Filed1 中输值,将自动为instance('FormData')/FormData/ProdNum附值。 -
接下来,我们将通过给 XForm 增加一个保存操作,来把表单中 DataInstance 抽取出来,保存到本地。 Designer 生成代码如下:
<xforms:submission action="All.xml" id="SaveAll" includenamespaceprefixes="" method="put" ref="instance('FormData')" replace="instance"> </xforms:submission>
-
All.xml:将 XML DataInstance 数据保存到当前表单的同一目录下的的 All.xml 文件。 -
ref="instance('FormData')":只保存表单中的 FormData 所代表的 instance 。 -
includenamespaceprefixes="":将 XML 的定义,Schema 等头信息置为空。 -
id="SaveAll": Submission 操作的标识。按钮将通过关联此值,来与 Submission 操作结合。 -
method="put":put 方法用来保存文件。
通过 FormDesigner 为表单增加一个 Button,并与 SaveAll Submission 操作关联,产生代码如下:
<button sid="BUTTON4"> <xforms:submit submission="SaveAll"> <xforms:label>Save Data Instance</xforms:label> </xforms:submit> </button>
-
-
让我们测试一下,打开表单,并输入信息,截图如下 :
图 2. 输入信息
我们点击“ Save Data Instance ”后,XForm 将为我们保存一个 XML 文件―― All.xml,文件内容将只包含表单中的业务数据,而不包含任何显示控件和逻辑:
<document> <FormData> <ProdNum>1234</ProdNum> <ProdName> 螺钉 </ProdName> <ProdDes> 纯钢新工艺制作,规格:7 × 1</ProdDes> <ProdContr> 销售电话:6668989 </ProdContr> </FormData> <version>1.0</version> </document>
通过一个 XForm 的一个简单操作,我们轻松的将 XForm 表单中的特定 Instance 数据抽取出来。
演示 2:如何通过载入 XML DataInstance 来实例化一个空白表单
我们将为表单增加一个 Load 操作,通过 XML 文件为 XForm 表单中的特定 DataInstance 赋值。增加一个 Submission 操作,FormDesigner 生成代码如下:
<xforms:submission
action="All.xml"
id="LoadXMLInstance"
includenamespaceprefixes=""
method="get"
ref="instance('FormData')"
replace="instance">
</xforms:submission>
|
讲解:
-
action="All.xml":将封装有 XML DataInstance 的文件 All.xml 载入到表单中。 -
method="get":通过 get 方法,获取 All.xml 文件中的数据。 -
ref="instance('FormData')":指出获取数据用来填充表单中的哪个 DataInstance 。 -
replace="instance":对 ref 中指定的 DataInstance 进行替换。
测试效果如下:
-
打开表单:
图 3. 打开表单
-
点击 Load Data Instance 按钮,表单将自动载入 All.xml 文件中内容,XForm 中相应的 DataInstance 中的值。效果如下:
图 4. 自动载入 All.xml 文件内容
通过以上的演示,我们已经看到如何从 XForm 中抽取 XML 的数据,及如何将 XML 数据回写到 XForm 表单中。但是,对我们的价值在哪里。以下,我以一个用户场景来举例。用户通过 XForm 构建了一个复杂的表单。在表单的填写过程中,用户希望获取某些动态信息,如产品零件的信息尚未。由于,零件的种类太多,我们无法将零件信息预存在表单中,只能通过服务器端的操作,根据用户的动态输入,获取相关信息回写 XForm 表单。但是,由于只是表单的局部内容,所以,我们不能通过表单完整提交来解决这个问题。那么,我们应该只有通过表单的动态信息交换来实现。表单的动态信息交换,一般有两种方式。方式 1:通过 WebService 来实现。方式 2:通过 XML 数据交换来实现。这里,我们将采用 XML 数据交换来实现。
演示 3:通过 DataInstance 与服务器端做 XML 数据交换,实现表单局部内容的动态更新
我们将为 XForm 增加一个 Submission 操作,生成代码如下 :
<xforms:submission
action="http://localhost:9081/FormTestWeb/FormtestServlet"
id="SumitToServer"
includenamespaceprefixes=""
instance="FormData"
method="post"
ref="instance('FormData')/FormData/ProdNum"
replace="instance">
</xforms:submission>
|
注意:我们通过 ref="instance('FormData')/FormData/ProdNum" 的设置,保证我们的 XForm 上行信息只包含产品编号信息,而无需将整个 DataInstance 的 XML 信息上传。上传内容如下:
<ProdNum>1234</ProdNum> |
- action="http://localhost:9081/FormTestWeb/FormtestServlet":指明 XML 数据提交的服务器端地址。
- instance="FormData" :告诉我们从 response 中获取的信息,去填充 XForm 中 FormData 所代表的 DataInstance 。
示例如下:
图 5. 示例
点击 Submit to Servelet 按钮,XML 数据将会通过 Post 方法提交到 Server 端。 Servelet 将做如下处理。
-
获取请求信息:
ServletInputStream si = request.getInputStream(); byte[] a; int len1 = request.getContentLength(); a = new byte[len1]; si.read(a); String b = new String(a);
结果:
b = "<ProdNum>1234</ProdNum>"
-
将根据产品号,获取相关信息,并以 XML 数据文件形式,回写到 XForm 表单。
in=new FileInputStream(f); byte[] buffer=new byte[4096]; int len; String result=null; while((len=in.read(buffer))!=-1){ result=new String(buffer,0,len); result.trim(); } ServletOutputStream so=resp.getOutputStream(); so.write(result.getBytes());
表单根据用户输入,自动刷新:
图 6. 自动刷新
XForms 在表单数据模型及其表示之间增加了一层新的、功能强大的抽象,把表示层从内容中分离出来,提高灵活性和重用性。使用 IBM Lotus Forms 设计基于 XForms 的电子表单,通过 Data Instance,可以很方便的实现后端的数据处理。 Data Instance 中的数据元素,是通过 XPath 表达式,进行定位引用及相关运算操作的。因此,充分掌握 XPath 的语法语义,设计合理的 Data Instance 结构,是实现数据灵活处理的关键。本文通过一个典型应用场景的运用描述,说明了如何巧用 XPath 来巧妙设计 Data Instance,从而为灵活处理后端数据提供支持。当然,设计灵活合理的电子表单,不仅仅只局限于 Data Instance 的巧妙设计,XForms 还提供了很多强大的机制,比如操作 (actions)、事件 (events) 等,只有充分应用这些机制,才能真正发挥 XForms 的功能,为电子表单应用提供最有效的帮助。
| 描述 | 名字 | 大小 | 下载方法 |
|---|---|---|---|
| 示例程序代码 | FormtestServlet.java | 4 KB | HTTP |
| 示例程序代码 | Product.xfdl | 6 KB | HTTP |
-
阅读 developerWorks 文章“巧用 Data Instance 实现 XForms 中的数据处理”。
-
通过 IBM developerWorks 中国 XML 专区 XForms 专题 进行 XForms 入门教程学习。
-
通过 W3C XForms 主页 进一步了解 XForms。
-
通过 W3C 站点 进一步了解 XPath、XML、XML 技术活动和其他相关标准。
-
通过 IBM Lotus Forms 简介,了解 IBM Lotus Forms 如何改进表单的外观和效率,从而改进依赖于表单的许多业务过程。
-
通过 IBM Lotus Forms 3 信息中心,了解所有关于 IBM Lotus Forms 产品的信息。