关闭

XForms架构

1196人阅读 评论(0) 收藏 举报

HTML表单是一种用于收集用户数据和提交数据到服务器的重要应用技术,然而,HTML表单只是一个简单的工具,它本省无法满足web应用所需的一些特性,例如复杂数据有效性验证。还有,由HTML表单提供的用户界面代码是与某种设备紧密结合的,也就是说,相同的表单无法使用在PDA或移动电话上。

W3C XForms的推荐书中提到上述这些问题。XForms是XML标签,它嵌入到XHTML这样的主机语言里,当在XFomrs浏览器中呈现时,能提供丰富和动态的应用,其中包括:

        XForms利用了xml schema的强大类型检查功能来验证用户在客户端的输入数据的有效性,而不使用任何script。XForms也可以验证更复杂的数据,例如不同表单数据间的关系。

        XForms的用户界面组件与显示设备无关,也就是它们是根据显示设备来生成的。

        XForms使用的是XML,而不是name/value的方式,这样可很好地应用在Web service上。

为了介绍XForms的一些功能特性,本文将讲述一个简单应用在Amazon web service上用来查询和显示特定图书查询结果的XForms应用的开发过程。

XForms的工作原理

为了利用XForms的功能,首先我们需要一个在简单HTML表单处理模型之上的东西--XForms引擎。XForms引擎是一个应用程序,它通常安装在客户端上,比如浏览器插件,它的典型工作原理是:

        用户通过打开一个文件系统中的文档或发出一个HTTP Get,请求一个包含XForms标示的文档;

        XForms引擎阅读标示,生成表单。由于XForms用户界面组件用抽象的方式定义,因此相同的XForms可以在适当的客户设备中用某种方式生成。因此,一个日期类型输入域在桌面浏览器中可能显示成日期控件,但在另外一个类似PDA有限制的设备上,相同的输入域可能显示成单行文本框。

        一旦表单生成后,用户就可以完成他所需要的操作。当用户填写表单时,在控件之间将会触发事件,用来检验数据输入的有效性、有条件的显示不同的组件,或者执行计算操作。(XForms的计算操作和域更新使用与spressheet相同的depth-first查询和拓扑排序)。

        当用户完成表单的填写后,他点击button来提交表单,那么XForms引擎将会生成一个XML实例文档,根据表单中定义的规则处理这次提交。XForms的提交目标通常是一个URL,可能的操作包括把XML写到一个文件上、发送一个email、提交到一个web service上,或者任何一个HTTP或HTTPS的目标。

在客户端具有XForms引擎的优点是所有的数据处理都在客户端执行,而避免server端不必要的网络堵塞。然而,在XForms的实现成为更加common前,开发者都无法认为他们的client端正确安装了XForms引擎。因此,server端的XForms引擎通常通过结合script和主机语言的普通标示,为普通client端提供相同XForms功能,也就是说,cients端不需要安装XForms引擎,但是在client端获得的标示可能无法全面支持XForms的特性。

我将使用一个client端XForms引擎Formsplayer来演示本文中的例子。

XForms基础

Xforms不能作为一个单独的xml文档使用,而必须嵌入到其他主机语言上使用。通常,这种主机语言是XHTML,单也可能无线标示语言(WML)或者可扩展矢量图形语言(SVG),以及其他语言。在这些语言中,XForms紧紧遵守MVC模型,而就是XForms的数据、界面表示和逻辑明显分离。

XForms中等同于MVC的model层的是model元素,一个XForms模型实现上是一个XML文档,在转载含有任意初始化数据的模型时,XForms模型存在两个角色。如Listing 1所示, 在一个简单的“Hello World”表单中,一个简单的model存在XHTML文档的head中。 模型通常放在head中,而强调它们并不是界面组件。任意的规范的xml文档可能放在model中,作为实例子文档,或者也可以用一个url来表示为一个外部实例文档。

XForms比HTML表单好的一个关键点是XForms能够执行数据有效性检查、约束检查以及数值计算,而不需要编写client端script。XForms可通过以下几种方式来达到如此的功能:

        instance数据element中连接一个xml scheman,对于小型的model,这些约束和有效性检验可能定义在model中,而需要指向另外一个xml schema文档。

        bind元素可以用来在用户界面控件和instance文档元素之间建立一个数据绑定,bing元素同时对instance元素指定一种数据类型,而且bind元素还可以对绑定的元素应用任意计算或约束操作(通过XPath表达式)。

XForms模型的最后一部分是submission元素,它使用uri来描述如何处理所提交的xml实例文档。在“hello world”实例中,当用户点击“Write to Disk” button时,xml实例文档简单的写到一个以命名文件中。

一旦模型定义好后,模型的全部或部分通过用户界面组件来显示。符合MVC模型,XForms用户界面组件相当于在模型的上view层,连接这两层的是XPath表达式,如Listing 1所示,或者是一个bind节点。与HTML定义了具体的用户界面组件如radio按钮和check按钮,XForms定义的是一系列抽象的组件。这些抽象的组件告诉组件应该做什么,而实际上组件的显示依赖与主机语言和它所在的显示设备。

然而,XForms引擎对XForms关心用户界面的生成,开发者仍然可以通过几种途径来设置表单的style。XForms可以利用主机语言的特性来直接设置表单的style,因此在XHTML中,XForms的控件可以嵌入到tables,heading和其他XHTML标签中,但是,由于这种方法使用了固定代码来设置style,限制了表单的独立于设备的特性。

设置style的一种替换方式是只使用最少的主机语言来设定XForms的标示。例如在XHTML中,只把XForms的model放在head段,把抽象用户界面组件放在body段,使用一个外部stylesheet,如Listsing 2所示,来为特定设备指定color,font和其他属性。

MVC模型的最后一部分控制器相当于XForms的事件和动作。XForms中的events由XML events规范定义,其对DOM level2的event语法提供基于element的接口。同时,XForms的actions作为响应XForms events的hanlder,也就是说XForms遵守著名的Gang of Four Observer模型,其中observers为特定的elements,当由events触发时,它们接到通知,接着执行相应的actions。

XForms的events和actions结合起来,能完成以下的任务:

        能为用户提供不同级别的message,从model对话框到工具栏提示等等;

        修改instance文档中的一些数值;

        动态地插入或删除table中的行数;

        可能在这个新的窗口或者在活动的表单窗口中连接到一个新的URI;

        提交xml instance文档中的全部或部分数据;

        在不同组件之间触发事件来实现表单工作流流转。

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:105734次
    • 积分:1633
    • 等级:
    • 排名:千里之外
    • 原创:46篇
    • 转载:37篇
    • 译文:5篇
    • 评论:7条
    最新评论