电子表单系列谈之电子表单基础概念

作者:袁永福( http://www.xdesigner.cn ) 2007-8-13

动态表单

随着计算机软件技术的不断完善和发展,国内的信息化建设的日益深入,越来越多的信息化系统开发和运行,人们越来越多的关注并参与到信息化建设中。于是逐渐产生了一个比较突出的矛盾,那就是人们日益增长的信息化建设和运用的需求和使用和日益落伍的信息化建设的手段之间的矛盾。这个矛盾主要表现在
1.软件公司和系统集成公司接受的信息化建设的项目越来越多,而开发和实施人力不够。
2.项目进度要求日益提高,而传统的开发模式过于依赖慢速的编程。
3.系统要求越来越灵活,客户需求变更频繁,而传统的硬编码方式来适应客户需求变化的做法日益落后和低效率。
4.实施信息系统的地点从大中型城市向中小型城市扩展,信息系统实施点多面广,环境复杂多变,迫切需要控制单点实施时间,提高实施效率。
5.人力资源的不足和使用不合理,由于信息系统实施地点变多,传统的实施过程可能需要二次开发,需要编程,导致普通的没有编程能力的系统实施人员无法独立的完成实施任务,迫使具有编程能力的程序员过多的参与一线实施。而程序员是软件公司和系统集成公司内的比较高级的人力资源,频繁的参与一线实施是对人力资源的浪费,为此迫切需要功能强大简单易用的实施配套工具软件,提高普通实施人员的工作能力,减少系统现场实施对程序员的依赖。

这个矛盾有一个比较典型的表现实例就是应用系统的用户数据输入界面,现在出现一些信息系统,客户要求其数据的输入界面可以任意修改。所谓数据输入界面,就是数据表单界面,包括WinForm表单和HTMLForm表单界面,是用户输入原始数据的主要工作区域,它很大程度上影响信息系统能处理的数据格式范围和精度。一些客户由于其自身工作业务的需要,频繁的要求信息提供的数据输入表单界面发生改变,比如新增修改和删除提示信息,文本框,单选复选框和列表框等等,同一个操作,在不同的状态下使用不同的数据输入表单。
面对这种需求,传统的做法是获得应用系统当前的源代码,进入相应的IDE,进入它的数据表单设计器然后进行修改。比如对ASP.NET系统,使用VS.NET等IDE打开系统的源代码,进入WebForm表单设计器,修改表单界面,还可能修改一些后台程序,然后编译测试,更新应用系统。整个过程繁琐复杂耗时而且不可靠,而且只有有经验的程序员才能完成,水平不高的程序员或普通的系统实施人员是无法胜任这一系列操作。这种更新手段对信息系统的正常工作带来不小的影响。而且若没有系统的源代码或源代码版本不对,则此工作无法完成。
现在有人开始使用配置文件或者用所谓的表单定义模板来实现动态的表单界面,应用系统运行时,根据需要加载不同的表单定义模板,根据表单定义模板中的定义数据动态的加载表单界面,这种处理模式能满足客户的修改表单输入界面的需求而不影响系统的正常运行,这个过程不需要程序的源代码,没有编译和测试,只要提供表单定义模板文件,一切都是自动完成的。
但是这种动态表单模式带来一个问题,谁来提供表单定义模板文件。若没有配套工具,则需要手工编写模板文件,这个工作必然是枯燥低效,经常需要多次尝试着凑数据,编制过程非常烦心。若拥有方便易用的配套工具,则能大大加快制作表单定义模板的速度和准确性,提高系统实施人员的工作效率。这里的配套工具就是所见即所得的互换式图形化设计器,简称图形化设计器。
图形化设计器是一种技术含量比较高的软件,它涉及到构造自定义的文档对象模型,高级的图形编程技术,复杂的用户界面事件的处理,这些技术手段是一般的信息系统开发过程所没有的,开发图形设计器难度大,时间长,工作量大,需要编写数万行的高效率的代码,这些都要求有专门对此有经验的开发者才能开发。一般的小型软件公司没能力开发,有些公司虽然有能力开发,但由于经济技术和时间的原因而一直未能开发出比较好的图形设计器(能开发图形设计器的人必然是高手,高手必然很忙)。但是若具有图形化设计器,则能成倍的加快表单定义模板的编制速度,能在短时间内完成大量的表单定义任务。
图形化设计器有一种比较简单的开发模式,那就是模拟VS.NET的WinForm窗体设计器的运行原理,设计界面上的设计元素就是Windows控件,这些控件处于设计模式,可以直接拖拽操作来修改控件的位置和大小,这种方式实现简单,开发工作量小,但存在以下缺点:
1.程序运行缓慢而且消耗大量资源,由于Windows控件是一种重量级资源,当文档中包含很多设计元素时需要动态加载很多个Windows控件,这样程序运行缓慢而且消耗很多资源。
2.Windows控件基本上是矩形的,当需要实现非矩形的设计元素时则很困难。
3.当需要绘制已有控件不支持的图形时需要编写新的控件。
4.文档重绘慢而且难于控制,文档重绘需要各个Windows控件的重绘,此时操作系统需要一个个通知这些控件重绘,需要进行大量不直接绘图的操作。
5.文档视图不能输出为图片,很难向其他应用程序开放编程接口。
而图形设计器自己绘制图形时虽然实现复杂,但不会有上述缺点。程序运行快,可对图形进行全面的控制。XDesignerLib实现的就是自己绘制图形的图形化设计器。

除了用于设计数据表单界面的图形化设计器,还有很多其他的领域需要图形化设计器。只要是图形化设计器,那就都需要解决类似的问题,其程序结构也大体一样。
有鉴于此,本人开发了名为XHtmlFormDeisgner的HTML表单设计器,它能定义HTML表单,并能将其定义信息保存到XML文档,而且还能在设计器中直接预览设计出来的HTML表单.详细情况请查看 http://www.xdesigner.cn/_xhtmldesigner.aspx,希望能给大家实现动态表单有所帮助.


(本文有部分文字参考了网络上的一些资料)
表单的基本概念
在各种企事业单位的生产和办公管理过程中,使用了大量的表格和单据,这些表格和单据通常成为表单。表单形成了单位和企业的运行和管理基础,如实而详细记载了运行和管理过程中的数据,是企业信息化中非常重要的管理对象。
企业要实现严格的全面质量管理,要在生产上建立各种规模化规范化和集中化的生产管理系统,其目的就是控制规模庞大和繁杂的生产过程,按照稳定的生产模式和过程生产质量有控制的产品。这一过程具体可以表现为和生产过程相关联的各种表单的填写和处理。例如生产过程中的人事,财务和物料的管理控制都是建立在表单的基础上。在银行,保险,交通运输,邮电通信,等企事业单位的业务管理中,都依赖大量规范的表单,否则就无法进行企业业务的处理。
表单虽实质就是通过分析和提炼业务的属性,制订表格,印制在纸上,并在实际应用中填写,处理和传递。表格的内容从许多方面反应了企业的具体业务。若没有规范化的描述企业业务属性的表单,在处理业务时由当事人自行规定,那么在业务处理上就存在很大的随意性和偶然性,这和现代化的生产和管理要求冲突。因此表单的规范化,有效性和处理效率直接影响到生产,管理中的业务处理质量和效果。
传统表单的不足
传统的预制纸张表单的生成,处理和流转方式是企业业务处理中错误,缓慢和昂贵的重要起因。企业花费大量的资金和时间来处理表单。顾客必须先填好纸质的原始单据,交由业务人员校验和录入,然后收集集中处理。顾客在填写纸质单据时容易误解填写规程,并需要重复填写,加大了系统处理中的人工审刻,降低了服务效率和质量,加大了成本处理。并且由于存在大量的人工处理,不可避免的存在较高的处理错误概率,若要降低这种错误概率需要派人反复检查这些表单,导致管理成本上升。
企事业信息化
随着计算机硬件性能的提高和价格的大幅下降,计算机网络技术的快速发展和普及,计算机软件技术的不断发展,企事业开始实施和普及企业信息化系统。其中也包括了表单的信息化和电子化。在这种条件下,可以将以前由顾客通过业务人员输入或转达的信息,直接由有能力的客户输入和浏览。客户可以通过网络自行提交表单,查看表单,而且软件可以辅助填写合格的表单。这样可减少中间环境,降低差错,提高效率,节省人力,加快表单处理速度。
传统的预印制纸张表单,需要消耗大量的纸张,需要消耗大量的印制,存储,分发和处理费用。而信息化系统可以避免这种情况,大大降低企事业办公和管理成本,节省自然资源和人力资源。
电子表单
表单在信息化系统一般表现为供用户输入和查看数据的页面,一个表单就包含了若干个表单元素,表单元素类型主要有静态文本标签,单行或多行文本输入框,列表框,下拉列表,单选框和复选框,此外还有一些其他的更复杂的表单元素类型。用户可以在这些表单元素中通过鼠标和键盘操作来输入表单数据,或者选中某些列出的表单项目,如此来完成表单数据的输入。
电子表单界面具有特定的用户体验。比较重要的有

  1. 数据的辅助输入:能提供数据库查阅和列表查阅,比如列表框或下拉列表的列表内容可以从数据源中填充;用户输入某些记录的编号,需要弹出一个记录编号浏览对话框来让用户选择某条记录,用户不用记忆输入并不人性化的记录编号。
  2. 数据的校验:软件系统能自动对用户确认输入的数据进行校验,包括数据格式的校验和数据合法性的校验。比如一个文本框只能输入身份证号码,若用户随意输入了数据不符合身份证号码的编码格式,则系统提示用户重新输入正确的身份证号码。
  3. 表单元素之间的数值关系:若干个表单元素之间可能存在一定的数学运算关系,一个表单元素的数值是另外一些表单元素进行数学表达式的运算结果。数学表达式可以包括四则运算,括号和一些数学函数。表单在运行时,用户修改了某个表单数据,则软件系统自动执行表单元素之间的数值运行关系,实时更新表单状态。
  4. 多个表单之间的数值关系:这个关系和表单元素之间的数值关系类似,但超出了单个表单的范围。在一个完整的业务中可以包含多个表单,而且这些不同表单中的表单元素之间可能存在一些数学运算关系,一个表单元素的数值是其他表单的某些表单元素进行数学表达式的运算结果。比如表单1的数据1是表单2的数据2和表单3的数据3的和。
  5. 表单元素之间的依赖关系:表单中某些元素的状态可能依赖其他某个表单元素的数据状态。比如表单中有一个复选框,后面有若干个元素依赖于这个复选框,当用户对这个复选框打勾,则依赖该复选框的表单元素可用;若用户对这个复选框不打勾,则依赖该复选框的表单元素将不可用。所有的操作都是自动执行的,用户在用户界面中打勾或不打勾,软件立即更新表单界面以反应这种表单元素之间的依赖关系。表单元素可以依赖复选框,还可以依赖单选框,列表框或下拉列表框的某个列表项目。
    纯文本的生成:在一些系统中,需要根据表单中输入的数据生成纯文本用来描述整个表单的数据。这样能大大压缩数据的显示空间,而且能向其他软件系统提供纯文本样式的数据支持。目前的技术还不能根据表单来生成自然语言样式的纯文本数据,但可以生成接近于自然语言的纯文本内容。
  6. 表单数据的保存:现代复杂的信息系统都是若干个相对独立的模块的集成,软件模块应当实现开放式的结构,因此表单数据应当可以保存在开发数据结构中,在开发的数据结构中首选是XML结构。表单数据应当可以方便的保存在XML文档,方便其他信息系统处理表单数据。
  7. 跨类型跨平台:尽管目前B/S开发模式是最重要的软件开发模式,但C/S开发模式也不容忽视,而且很多旧系统是C/S系统。因此电子表单可以使用在B/S或C/S系统中,同样的表单可以运行在B/S和C/S系统中,而且应当具有相同的运行时特性,包括表单数据的辅助输入,表单元素之间大数值关系,依赖关系。而且在为B/S和C/S开发表单模块时,定制表单模板的工作不应当重复,应当同一个表单模板无需修改即可用于B/S和C/S系统。

电子表单的开发
作为计算机软件开发人员,除了关心电子表单实现的功能,还需要关注电子表单的实现。目前情况下,计算机软件开发人员,一般都用开发工具内置的窗体设计器,比如VB , Delphi , VS.NET的窗体设计器,在一个窗体上设计表单元素,这些开发工具配备了强大的表单设计器,而且都能进行全功能的编程开发。但仍然不适合设计大量的表单,其主要缺点有

  1. 这些开发工具是通用的开发工具,并没有为表单开发而进行优化。使用它来设计大量的表单是不合适的。而且表单中存在大量的表格,而一些通用的开发工具并没有表格控件,因此很难实现表格样式的表单界面。
  2. 表单元素之间存在大量的相互关系,包括数值运算关系和表单元素依赖关系,对于通用开发工具,要实现这种实时的表单特性,需要在后台编写大量的控制代码。这些代码量大,编写过程简单但麻烦,影响开发效率。
  3. 比较难于实现数据的XML格式的保存,开发工具需要编写代码从XML文档中加载表单数据并对各个表单元素一一进行设置,而保存XML文档则需要收集表单数据并进行保存。所有的操作都需要编写大量的程序代码。
  4. 开发工具修改现有表单很容易导致应用系统的重新编译和重新部署。现代的应用系统需要保证长期不间断的运行,程序的可执行代码的重新编译和重新部署会导致应用系统的停机,更新文件和重新启动的过程,这个过程是危险的,而且影响了系统的长期不间断运行要求。
  5. 使用开发工具开发表单无法保证同一个表单用于B/S或C/S系统。比如使用VS.NET开发表单,可以使用它的WinForm窗体设计器来设计C/S系统中的表单,使用Web窗体设计器来设计B/S系统中的表单,但两种设计器的设计结构不能通用。若一个系统要求具有B/S版本和C/S版本,则需要为每一个表单同时设计和维护WinForm版本和Web版本,这加大了系统的开发和维护的工作量。
  6. 使用开发工具开发表单无法实现跨平台,比如VB,VS.NET两个工具设计的表单是不能相互调用,甚至同样是VS.NET开发的,使用VB.NET和使用C#两种语言开发的表单界面跨语言调用都需要做额外的工作。VS.NET开发的表单是不能用于Java系统,因此若一个系统要求有.NET版本和JAVA版本,则需要为每一个表单同时设计和维护.NET版本和Web版本,这加大了系统的开发和维护的工作量。
    可以想象,若一个系统要求同时有WinForm.NET,ASP.NET和Java甚至更多的版本,则同一个表单需要同时设计和维护多个版本,系统的开发维护工作量成倍增加。
  7. 一般的开发工具费用,包括软件的购买费用,使用费用,都不算低,随着软件正版化的发展,软件公司和客户为开发维护表单而需要对开发工具支付额外的费用,这加大了项目成本,增大了客户的投入。

由于使用通用的开发工具直接开发电子表单有若干不足,因此人们开始使用专门的工具来维护和定义表单。一开始人们提出了表单模板的概念,而且开始使用配置文件来定义表单模板,原始的表单模板配置文件可以是INI文件或XML文件,HTML文件或者二进制文件。这些表单模板文件定义了表单的结构,包含的表单元素,开始没有图形化设计器,只是手工编辑和维护这些配置文件,工作量是相当的大。
为解决手工配置表单模板文件的不足,出现了专业的图形化的表单设计器,这些专业的工具为电子表单开发带来新的提升。使用专门的图形化表单设计器带来的好处主要有

  1. 图形表单设计器能以所见即所得的方式来设计表单界面,大大提高了设计表单的工作效率,解放了生产力。
  2. 图形表单设计器能快速定制表单,避免的手工修改配置文件的低效率和容易发生错误。
  3. 相对应通用开发工具,图形表单设计器软件小,安装部署方便。工作效率更高。
  4. 图形表单设计器在应用系统的支持下,能对系统中的表单模板进行在线定制,修改表单模板无需重启应用系统,对应用系统的长期不中断运行没有影响。
  5. 良好的表单设计器设计的表单模板在应用系统的支持下,即可以用于于B/S系统,也可应用于C/S系统,还有可能实现表单模板的跨语言跨平台跨架构的运用。若一个应用系统有多个版本,则表单模板无需修改就可应用到这些不同版本的应用系统中,避免同一个表单多个版本的出现。
  6. 表单设计器可以快速的定义表单元素之间的依赖关系和数值运算关系。在应用系统的支持下,使得表单在运行时具有这些动态特性而无需额外编程来实现。

如此图形化表单设计器就是电子表单系统开发的核心模块,它决定了表单模块的开发和维护工作量。一个好的电子表单设计器能事倍工半,而平庸的表单设计器则发挥不出应用的作用。

下一篇文章将说说我是怎样实现电子表单设计器的,到时候敬请关注。

电子表单系列谈之三位一体的表单工具

袁永福( http://www.xdesigner.cn ) 2007-8-15
我正在开发的表单工具是一种三位一体的表单工具(点击下载其概念版本),它同时集成了对WinForm,HTML和XSLT的设计功能,使用它,对于同一个表单模板,无需修改即可生成WinForm表单,HTML表单和XSLT表单。
WinForm表单
表单样式设计器是类似VS.NET的WinForm窗体设计器,保存的是表单元素的绝对坐标信息,因此比较容易根据表单模板来生成WinForm界面。表单元素类型和WinForm控件类型是一一对应的。处理起来比较简单。
表单执行引擎根据表单设计来生成WinForm界面处理过程比较简单,首先使用表单文档对象模型加载表单设计文档,然后遍历该表单文档中所有的表单元素对象,针对每一个表单元素对象生成一个对应的WinForm控件,然后添加到一个容器中。
在生成WinForm界面时,表单执行引擎会加上便于用户使用的一些特性,比如会根据表单元素在设计界面中的从左到右从上到下的顺序设置各个WinForm控件的焦点属性。生成文本标签时,若文本标签后面的某个数据输入框具有文本链接则将生成的文本标签控件绑定到这个数据输入框上,当用点击文本标签控件时就会设置焦点到该数据输入框,其行为类似HTML文档中的Label元素。
生成了WinForm界面并投入运行时,表单引擎会监控用户输入的表单数据,若用户修改了表单数据,则就检查表单文档中的表单元素之间的关联信息列表,根据需要执行表单元素依赖关系和表单元素数值表达式,以达到表单的动态特性。
用户保存数据时,表单引擎会遍历整个表单WinForm界面的控件收集表单数据,并根据各个表单元素的数据引用属性指定的XPath属性将表单数据填充到一个XML文档中,然后向应用系统提供这个包含数据的XML文档。而应用系统就可以利用这个XML文件进行后续处理,比如保存或更新数据库。
由于表单工具生成的表单设计文档是采用XML格式,因此其他非.NET的应用系统可以根据这个XML文档动态加载生成各种类型的WinForm控件,动态生成表单界面,这样就扩大了表单工具在C/S系统中的应用范围。

Html表单
表单样式设计器虽然采用控件拖拽式的设计用户体验,使用绝对坐标来设置表单元素的位置,但表单引擎仍然可以根据表单文档生成HTML文档。


HTML排版样式
HTML文档中的表单元素可以使用绝对坐标定位方式,即在元素的style属性中添加”position:absolute ; left:xxx px ; top:xxx px”,这样可以使用绝对坐标方式进行HTML元素的定位。这样可以比较方便的根据表单文档生成HTML文档,但这种简单的处理是不完善的。可能带来以下几个缺点。

  1. 使用绝对坐标定位的表单会严重干扰表单工具和应用系统的集成。在应用系统中,表单界面一般是作为应用系统界面的一部分进行显示,应用系统界面上还有很多不属于表单工具的HTML元素,使用绝对坐标定位的表单元素很容易和非表单元素之间相互覆盖,使得应用系统的界面无法使用。
  2. 使用绝对坐标定位的HTML表单代码难于修改。在少数情况下,表单工具生成的HTML表单需要手工微调,若采用绝对坐标定位则修改表单元素HTML代码比较困难。
  3. 无法实现某些表单页面的动态特效。若表单文档中存在表单元素依赖关系,则一些表单 元素的可用状态依赖其他表单元素的状态。表单工具可以做到一种特效,使得某些元素的可见状态依赖其他表单元素。若采用绝对坐标定义,当某些元素由于依赖关系而导致不可见时,用户界面可能出现大片空白,影响用户界面的美观。

为解决上述问题,表单工具会生成流式排版的HTML表单,生成的HTML代码是很简洁的,没有使用 “position:absolute”来使用绝对定位表单元素。
表单文档中使用绝对坐标来定位表单元素,但HTML文档却采用流式排版样式,这两种排版样式是截然不同的,表单工具内部采用特殊的算法将绝对坐标排版方式转化为流式排版样式,并针对IE浏览器进行了优化,然后针对每一个表单元素生成对应的HTML元素。经过测试,这种处理方法生成的HTML文档显示样式和表单的设计样式非常接近。从而解决了绝对坐标方式带来的问题。
在表单元素中有一个特殊的表单元素类型,那就是单/复选框按钮组。这种表单元素,包含了若干个单/复选框。在设计时这个表单元素是作为一个整体来编辑的,在生成的WinForm表单中也是作为一个整体创建的。但在输出HTML表单则需要将内部项目拆开分散输出,从而生成若干个<input type=”radio”>或<input type=”checkbox” >,而且这些项目有可能不是连续的输出。


HTML页面动态效果
HTML表单中也要实现和WinForm表单中一样效果的表单元素依赖关系和数值表达式,这需要依赖JavaScript脚本来实现。因此表单工具在生成HTML表单式需要随之输出维护表单动态效果的JavaScript脚本。
一般的可以表单工具可以根据表单文档的元素关系信息列表,针对每一个表单元素,拼凑出一段JavaScript脚本,然后绑定到HTML元素的事件属性中。比如可以在<input type=text>元素的onblur事件添加处理表单式的代码,在<input type=checkbox>元素的onclick 属性中添加处理表单元素依赖关系的代码。这样生成的HTML文档中夹杂着大量的JavaScript脚本。这样可以实现HTML表单的动态特效,但仍有不足。其主要缺点有

  1. 大大加大了生成的HTML文档的大小,生成的HTML代码比较臃肿,难于阅读和处理,可能导致应用系统加载大型表单速度缓慢。
  2. 在少数情况下,开发人员需要手工修改表单HTML文档来进行微调,若HTML文档中充斥着大量的不成片的JavaScript代码,则阅读和修改HTML文档比较困难。

根据通常的编程规范,不应当大量出现功能相同的程序代码。而表单HTML代码中出现大量的重复相同功能的JavaScript脚本代码,不符合通常的编程规范,这种JavaScript代码维护困难,不利用手工集中修改。
为了解决这些问题,应当尽量减少HTML文档中生成的JavaScript脚本。而且将JavaScript脚本要实现的功能提取出来,编写通用的JavaScript脚本并单独保存到一个外部的js文件。这样HTML文档中使用<script src=xxxx >来引用通用的JavaScript脚本。此外还利用HTML文档的不严格的特性,将某些控制信息保存在HTML元素中扩展属性中。
在这种思路下,报表工具生成的HTML表单时,在一些HTML元素上追加某些扩展属性,例如使用 idlist 扩展属性来说明指定的编号的元素和该项目进行绑定,表单工具还使用了通用的JavaScript函数来统一实现HTML表单动态效果。这样生成的HTML文档中没有多少JavaScript代码,生成的HTML代码非常简洁,体积小,而且便于阅读和修改;而且由于JavaScript代码集中在一起,因此维护方便。


浏览器兼容性说明
经过测试,表单工具生成的HTML表单可以在IE6.0中正常运行,能实现自动的表单元素依赖关系以及表单内表达式运算。但在Firefox2.0中,能正常显示表单界面,但没有任何动态特性,无法执行表单元素依赖关系和表单内表达式运算,可能是由于Firefox只支持标准的HTML,不支持扩展属性而导致的。因此建议使用表单工具的客户端浏览器应当为IE6.0或更高版本,若表单中没有定义元素依赖关系或表达式是可以使用其他浏览器。
XSLT表单是基于HTML表单的,因此这个浏览器兼容性说明同样适用于XSLT表单。


XSLT表单
表单工具还能生成XSLT表单,这个功能的基础是HTML表单。XSLT表单首先是标准的XSLT文档。表单文档的数据可以保存为XML文档。而使用表单工具生成的XSLT表单,可以利用这个数据XML文档执行XSLT转化,生成用于显示数据的HTML文档。
比如某个表单,生成的数据XML文档片断为

< XFormValue Name ="DataBaseDemo2" >
< Employees >
< Address > 复兴门245号 </ Address >
< BirthDate > 1968-12-8 </ BirthDate >
< City > 北京 </ City >
</ Employees >
</ XFormValue >

则表单设计时定义了一个文本框,它的数据引用为Employees/Address,则表单工具为这个文本框生成的XSLT片断为

< input type ="text" >
< xsl:attribute name ="value" >
< xsl:value-of select ="Employees/Address" />
</ xsl:attribute >
</ input >

将这个XML文档片断和XSLT片断进行XSLT转化,则会生成字符串

< input type =”text” value =”复兴门 245号” >

这个字符串就是标准的HTML代码,这段HTML代码在浏览器中就能显示一个包含数据的文本输入框。
在应用程序中,将表单数据XML文档和XSLT表单进行XSLT转化,即可生成已经包含数据的HTML页面。这个过程包含的三个技术,XML,XSLT,HTML都是国际标准,是跨语言跨平台的技术,因此表单工具通过HTML表单和XSLT表单为其他的非.NET的B/S系统提供了支持,比如asp,Java,PHP等等。
表单工具能针对文本框,单/复选框,单/复选框按钮组,列表框和下拉列表输出XSLT代码。从而构造出非常灵活的XSLT表单。
在实际应用中,可以由表单工具事先设计好表单,并生成HTML表单和XSLT表单,保存在应用系统的指定位置,比如某个目录或者数据库中,而应用系统在从指定位置加载HTML表单或XSLT表单,这样就能在应用系统中使用表单工具设计出来的表单。如此这样,基于.NET的表单工具可以和其他使用任何技术(包括asp,Jsp,J2ee,php等等)的B/S系统进行协同工作,将表单工具在B/S系统的中应用范围扩展到最大。

电子表单系列谈之表单数据处理

袁永福( http://www.xdesigner.cn ) 2007-8-16

点击下载其表单工具概念版本

一般的电子表单工具都要求能自动显示和保存关系型数据库中的数据,比如可以使用SQL语句查询数据填充文本框,或者查询一批数据填充到列表框中的列表项目。而且还要求能更新数据库,能把用户输入的数据保存到数据库中,可以新增,修改和删除数据库记录。为实现这种功能,表单工具在定制表单模板的时候得设置读取数据和更新数据库用的SQL语句,或者设置表单数据输入元素和数据库字段的映射关系,运行时得直接连接数据库,执行SQL更新语句更新数据。但随着时代的进步,这种做法在开发和运行中暴露出一些问题。

对于目前的比较庞大而复杂的信息管理系统,很多系统都采用三层架构或多层结构,此处只讨论有代表性的三层架构。在三层架构中,程序代码根据功能分为三个大部分,数据库处理层,业务逻辑层和数据显示层(用户界面层)。其中数据库处理层专门处理底层数据库,维护基础的数据结构。业务逻辑层则调用数据库层获得数据并根据需要进行处理,而数据显示层则从业务逻辑层获得数据并显示出来。

这种三层架构结构复杂,但程序灵活,适于团体开发,而且维护简单,能比较方便的控制数据访问的安全和限制,因此三层结构目前有很大的影响力。对于三层的数据库信息管理系统,只有数据处理层能直接访问数据库,其他的程序模块是不能的。

电子表单工具是用来显示和输入数据的,从功能上说应当是三层结构中的用户界面层,它应当只能从业务逻辑层获得数据,不应当从数据库层获直接连接数据库获得数据的,更不应当跳过业务逻辑层来直接更新数据库。但目前一些表单工具却如此这样作,破坏了三层结构的原本的意义。一般来说,用户界面层直接查询数据库获得数据,只是影响了三层结构,数据库结构发生改变,而用户界面层没有随之更新,则最多只是不能正确的显示数据,没有其他的影响;但用户界面层直接更新数据库,新增修改或删除数据库记录,这应当是破坏了三层结构,当数据库结构发生改变而用户界面层没有随之更新,则用户界面层可能会破坏数据库,导致数据错误和数据丢失。对于客户而言,最重要的是数据而不是应用系统,应用系统可以更换,可以崩溃,但数据绝不能错误或丢失。因此从客户的利益和软件的安全性着想,使用电子表单工具直接更新数据库应当慎重考虑。

一些电子表单工具具备能自动更新数据库记录的功能,但在现在的软件开发过程中,这种功能要求日渐不重要。这是因为越多越多的开发人员使用各种成熟的对象-数据库映射框架,或者使用各种代码生成器来生成操作低层数据库的代码,而且各个公司对此有各自的规范和传统,表单工具不应对此进行过多的干涉。

综上所述,表单工具是处于用户界面,用于显示和输入数据的,在三层架构中属于用户界面层,按照三层架构的基本规范,用户界面层是不能直接读取和更新底层数据库的。因此电子表单不应当直接更新数据库,而是向三层架构的业务逻辑层提供数据。

此处表单工具使用XML文档和应用系统交换表单数据,应用系统将需要显示的数据组织成一个XML文档,然后传递给表单工具用户界面,在用户界面中,用户确认输入表单数据后,表单工具将表单数据组织成一个XML文档返回给应用系统,应用系统将进行后续处理。

在表单文档中,每一个可以输入数据的表单元素都有一个“数据引用“的属性,该属性就说明了表单工具如何保存在XML文档中。该属性的格式类似XPath字符串,可以包含多个XML节点名称,名称之间由”/”分隔开来。

比如对于一个文本框,若数据引用为”Employees/Address”,则表单数据保存在XML文档根节点的名为Employess子节点的名为Address的子节点下。生成的XML片断可能为

< XFormValue >
< Employees >
< Address > 文本值 </ Address >
</ Employees >
</ XFormValue >

若这个文本框的数据引用为Employees/@Address”,则表单数据保存在XML文档根节点的名为Employess的子节点的名为Address的属性中。此时生成的XML片断可能为

< XFormValue >
< Employees Address =”文本值” />
</ XFormValue >

注意,这里的数据引用是模拟XPath的,不是真的XPath,只能设置各级XML元素的名称,若出现XML属性则放置在最后,而且没有判断条件。

在实际应用中,使用电子表单的最终目的一般是显示和编辑数据库记录的,此时则可以设置表单元素的数据引用为“表名/字段名”。则生成的表单XML文档可以如下

< XFormValue >
< Employees >
< Address > 复兴门245号 </ Address >
< BirthDate > 1968-12-80:00:00 </ BirthDate >
< City > 北京 </ City >
< Country > 中国 </ Country >
< EmployeeID > 1 </ EmployeeID >
< Extension > 5467 </ Extension >
< FirstName > </ FirstName >
< Goal > 2000 </ Goal >
< HireDate > 1992-5-1 </ HireDate >
< HomePhone > (010)65559857 </ HomePhone >
< LastName > </ LastName >
< Sex > 2 </ Sex >
< Title > 4 </ Title >
< TitleOfCourtesy > 女士 </ TitleOfCourtesy >
</ Employees >
< Customers >
< Address > 大崇明路50号 </ Address >
< City > 天津 </ City >
< CompanyName > 三川实业有限公司 </ CompanyName >
< ContactName > 刘小姐 </ ContactName >
< ContactTitle > 销售代表 </ ContactTitle >
< Country > 中国 </ Country >
< CustomerID > ALFKI </ CustomerID >
< Email > Silva@lisboncycle.com </ Email >
</ Customers >
</ XFormValue >

很明显,对于这样的XML文档,从根节点出发,第一层子节点的名称就是数据表的名称,第二层子节点的名称就是数据表各个字段的名称。这样很容易将XML文档中的节点映射到数据库表和字段上,因此容易开发一个将XML文档的数据更新到数据库的通用例程。而且在应用系统中,可以将所有的根据电子表单数据更新数据库的代码集中起来。

下一篇讲讲表单工具用户可用性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值