技术开发 频道

使用XForms和Ruby on Rails开发小型门诊管理系统



【IT168 技术文档】

简介

技术世界在不断的变化。新技术层出不穷,原有的技术不断演化。这些力量产生了新的范型和非常好的实践。有时候新技术就像是重新发明的轮子上闪闪发亮的油漆,但有时候又能带来切实的利益。这是 本系列文章 的第一部分,考察了有不少相通之处的三种新技术。这些技术从单纯的技术角度来看非常有趣,而且都以简化某些困难的任务为目标。我们将看到,XForms 是一种创建功能丰富的交互式 Web 应用程序的技术。还将考察用于管理 XML 文档的强大的 IBM® DB2® pureXML 特性。最后,我们将利用 Ruby on Rails Web 应用程序框架把两者结合起来,创建一个 Web 应用程序简化门诊患者信息的录入。请注意,本系列文章没有涉及到防止病人查看受限制的目录、通过要求登录保护医生和护士表单和特定区域诸如此类的安全问题,这些在产品环境中都是需要考虑的。

前提条件

本文假设读者对 XML 和 Web 应用程序有一定的了解。对 XForms、DB2 pureXML 和 Ruby on Rails 这三种核心技术事先有所涉猎当然最好,但不是必须的。本文使用 Mozilla XForms 插件版本 0.8.0.3 编写。该插件在任何 Mozilla 浏览器如 Firefox 中提供了 XForms 运行时支持。另一种非常有用的 Mozilla 插件是 XForms Buddy。它提供了一个 XForms 调试器。本文使用的是 0.5.6 版。还需要用到 IBM 的 DB2 数据库服务器。本文采用 DB2 Express-C 9.5。支持 Windows®、Linux™ 和 UNIX® 系统。此外还需要 Ruby on Rails。本文使用了 Ruby 1.8.6 with Rails 1.2.5。下载链接参见 参考资料

门诊的 XForms

这个管理门诊患者信息的应用程序,需要让患者输入数据,否则这些数据只能由办公室的工作人员采集。我们需要创建一个 Web 应用程序,这样任何能够运行 Web 浏览器的计算机都可作为患者的数据录入点。现在需要做出第一项技术决策,应用程序的用户界面将使用 XForms。

采用一种新技术仅仅是为了赶时髦或者为简历增加点炫耀的资本吗?完全不是。对于这种情况 XForms 非常适合。它可以用简单的 XML 模型定义数据,使用标准 HTML 表单元素定义视图。XForms 提供了这些元素之间的声明性映射。这意味着不需要编写任何客户端或服务器端代码接收提交的数据然后插入 XML 结构。XForms 替您完成了这些工作。而且是异步执行的:HTML 表单中的变化绑定到 XML 模型,然后发送到服务器实现同步。您享受到了 Ajax 的优点,而且不必编写任何 JavaScript 代码。

但是要记住,目前还不是所有的浏览器都支持 XForms。将来会如此,但现在还不行。因此还需要安装一个插件来支持它。如果应用程序的用户很多,这可能会造成问题。但是对于我们开发的这类专用应用程序而言足够了。用于访问应用程序的计算机是有限的,因此可以假设都安装了适当的浏览器和插件。

无论何时使用 XML,XForms 都是一种很强大的技术。这是一种客户端技术,因此在任何动态应用程序中还需要服务器端技术来支持它。后端需要持久数据的数据库。前端要使用 XML 表示数据,那么如果后端也使用 XML 岂不是更好?DB2 恰好能满足这个要求。

DB2 9 pureXML

如果曾经开发过使用 XML 的应用程序,很可能已经使用过两种常见的持久 XML 数据到数据库技术中的一种。第一种技术是使用某种 XML 关系映射技术。这种技术通常需要自己编写自定义的应用程序逻辑从 XML 文档中提取数据,然后放到关系数据库的表列中。通常被称为切割(shredding)。当然如果以后需要再次读取数据,还需要能够 “反切割” 并重新组装成 XML 文档。

另一种常见的技术是直接把 XML 文档转储到数据库的 CLOB 列中。实际上就是把 XML 看成是一个很长的字符串。此后就可以从数据库中读出,传递给解析器重建 XML 文档。一般来说这种办法要容易得多,因为不需要编写什么切割/反切割代码,但是功能差一些。没有非常有效的办法查询 XML 文档中的数据。

近年来 XML 数据库日渐普及,就是因为解决了这类问题。允许按照 XML 存储数据,因此不需要切割。同时又能使用 XQuery 高效查询,因此不会损失文档的结构。支持这种功能的多数数据库是小型的专用数据库,不过现在可以把 IBM 的旗舰数据库 DB2 添加到原生 XML 数据库的名单中了。

使用 DB2 可以在数据库中存储与 XForms 使用的 XML 相同的数据。不需要切割、映射或者解析数据。浏览器中的数据 “方言” 和数据库使用的方言一样。DB2 支持在 SQL 查询中使用 XQuery,称为 SQL/XML,因此可以方便地访问 XML 文档中的任何数据。比方说,假设需要使用患者的姓检索信息。可以将这些信息存储在 XML 文档中,编写 XQuery 根据患者的姓氏检索文档。我们来进一步看看 DB2 是如何做到的。

DB2 设置

现在需要设置 DB2,创建使用原生 XML 的表。和其他 XML 数据库相比,DB2 的一个优点是允许混合关系数据和 XML 数据。不需要非此即彼的选择,可以同时使用。因而不需要直接把 XML 文档映射到表,可以映射到列。表中给定的一行甚至可以包含多个 XML 文档。

可以通过两种不同的方法创建使用 XML 的新表。最简单的办法是使用命令行。清单 1 中的脚本创建只含一个 XML 列的表。


清单 1. 创建包含一个 XML 列的表
               
 CREATE TABLE DOC.PATIENTS (
 ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (
 START with +1 INCREMENT BY +1),
 INFORMATION XML NOT NULL);
 
该例中的 INFORMATION 列的类型为 XML。可以看到,语法非常简单,和声明整数列或者 varchar 列没有什么区别。如果不喜欢使用命令行创建表,DB2 Command Center 提供了图形化的方式。可以使用它提供的创建表向导,如图 1 所示。

图 1. 启动创建表向导



单击 Create New Table 启动向导。打开图 2 所示的表名信息屏幕。
图 2. 命名表


命名新表的屏幕允许指定表的模式和表名。单击 Next 打开 Columns definition 界面,如图 3 所示。
图 3. 定义新表的列



单击 Add 按钮打开 Add Column 对话框,如图 4 所示。
图 4. Add column 对话框



这就是关键的地方了。要定义保存 XML 数据的列,必须把数据类型指定为 XML。仅此而已!向导的数据类型列表中已经包含 XML,没有什么特殊的地方。完成后单击 OK 将看到定义的 XML 列,如图 5 所示。
图 5. 增加的 XML 列



通过向导还可以添加更多的列、主键和外键等等。然后单击 Finish,表就创建好了。

无论用哪种方法创建表,都可用 SQL 向表中插入数据。编写 SQL 的时候可以把 XML 视作字符串,如清单 2 所示。
清单 2. 插入 XML
               
INSERT INTO DOC.PATIENTS(INFORMATION)
VALUES ('<?xml version="1.0" encoding="UTF-8"?>
<Info>
 <FirstName>John</FirstName>
 <Age>33</Age>
 <Insurer>Blue Armor</Insurer>
 <ID>555-88-1212</ID>
</Info>');
 
看起来似乎是插入一个简单的字符串,不过不用担心。DB2 不会将其看作是字符串。这和在查询中编写日期非常类似。按照特定的语法编写字符串,让数据库解析为特定的数据类型。如果语法错误,查询将失败。处理 XML 的方式是一样的。使用 SQL 和 XQuery 还可以查询 XML,如清单 3 所示。
清单 3. SQL/XML Query
                
SELECT XMLQUERY('<Patients>
 {for $i in $x/Info
 where $i/Insurer = "Blue Armor"
 return <Patient>{$i/FirstName/text()}</Patient>}
 </Patients>'
passing P.INFORMATION as "x") from DOC.PATIENTS P;
注意这里把 SQL (SELECTION ... from ...) 和 XQuery 混合在一起了。被称为 SQL/XML。关键在于使用 XMLQUERY 保留字表明要通过 SQL 选择语句执行针对传入 XML 文档的 XQuery。运行该查询将返回清单 4 所示的 XML 文档。
清单 4. 结果 XML 文档
               
<?xml version="1.0" encoding="UTF-16"?>
<Patients>
 <Patient>John</Patient>
</Patients>
现在您看到使用 DB2 原生存储 XML 是多么简单,但是在 XForms 使用的 XML 和 DB2 中的 XML 之间还需要点什么。我们将使用 Ruby。

0
相关文章