程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 使用XForms 和 Ruby on Rails開發小型門診管理系統,第1部分

使用XForms 和 Ruby on Rails開發小型門診管理系統,第1部分

編輯:關於JAVA

安裝配置IBM DB2 9 pureXML

本系列文章 介紹如何結合使用 XForms、IBM DB2 pureXML 和 Ruby 來簡化 Web 應用程序的開發,分 為四部分,這是第一部分。本系列文章中將開發一個虛構的應用程序來管理一個小型醫院的門診患者信息 。您將看到每種技術的強大功能,同時還將看到如何將其結合起來。第一部分將說明 XForms、DB2 pureXML 和 Ruby on Rails 如何幫助您更快地構建以 XML 為核心的 Web 應用程序。

簡介

技術世界在不斷的變化。新技術層出不窮,原有的技術不斷演化。這些力量產生了新的范型和最 佳實踐。有時候新技術就像是重新發明的輪子上閃閃發亮的油漆,但有時候又能帶來切實的利益。這是 本系列文章 的第一部分,考察了有不少相通之處的三種新技術。這些技術從單純的技術角度來看非常有 趣,而且都以簡化某些困難的任務為目標。我們將看到,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。

Rails 和 DB2

現在需要考 慮如何將 XForms 前端和 DB2 pureXML 後端連接在一起了。Ruby on Rails 為快速便捷地創建 Web 應用 程序提供了一種強大的方法。而且處理數據庫也很方便,但是 Rails 能用於 DB2 尤其是 DB2 pureXML 嗎?當然可以,而且和 Rails 的其他方面一樣,驚人的簡單。

為 Ruby 安裝 DB2 驅動程序

首先需要啟動 Rails 中的 DB2 支持。如果已經安裝了 Rails,還需要安裝 Ruby Gems。否則應 該安裝它,因為這個包管理系統非常適合為 Rails 增加新的功能,如 DB2 支持。安裝之後在命令提示符 下輸入:>gem install ibm_db。

從而下載 DB2 Ruby 驅動程序。安裝完成後,所有的 Ruby 應用程序(不僅僅是 Rails 應用程序)都有了 DB2 支持。如果使用的是 Windows,就會提示選擇什麼版 本的驅動程序,如清單 5 所示。

清單 5. 選擇 DB2 驅動程序

>gem install ibm_db
Bulk updating Gem source index for: http://gems.rubyforge.org
Select which gem to install for your platform (i386-mswin32)
1. ibm_db 0.6.0 (mswin32)
2. ibm_db 0.6.0 (ruby)
3. ibm_db 0.4.6 (ruby)
4. ibm_db 0.4.6 (mswin32)
5. Skip this gem
6. Cancel installation

需要選擇最新版本的驅動程序,因此選擇 #1 或 #2。如果使用 Windows 安裝程序安裝了 Ruby,需要選擇 #1。現在就可以創建使用 DB2 pureXML 的 Rails 應用程序了 。

創建 Rails 應用程序

Rails 開發人員應該熟悉下面的代碼。我們將創建清單 6 所示的 應用程序。

清單 6. 創建 Rails 應用程序

>rails xmlmd
create
create app/controllers
create app/helpers
create app/models
create app/views/layouts
create config/environments
create components
create db
create doc
create lib
create lib/tasks
create log
create public/images
create public/javascripts
create public/stylesheets
create script/performance
create script/process
create test/fixtures
create test/functional
create test/integration
create test/mocks/development
create test/mocks/test
create test/unit
create vendor
create vendor/plugins
create tmp/sessions
create tmp/sockets
create tmp/cache
create tmp/pids
create Rakefile
create README
create app/controllers/application.rb
create app/helpers/application_helper.rb
create test/test_helper.rb
create config/database.yml
create config/routes.rb
create public/.htaccess
create config/boot.rb
create config/environment.rb
create config/environments/production.rb
create config/environments/development.rb
create config/environments/test.rb
create script/about
create script/breakpointer
create script/console
create script/destroy
create script/generate
create script/performance/benchmarker
create script/performance/profiler
create script/process/reaper
create script/process/spawner
create script/process/inspector
create script/runner
create script/server
create script/plugin
create public/dispatch.rb
create public/dispatch.cgi
create public/dispatch.fcgi
create public/404.html
create public/500.html
create public/index.html
create public/favicon.ico
create public/robots.txt
create public/images/rails.png
create public/javascripts/prototype.js
create public/javascripts/effects.js
create public/javascripts/dragdrop.js
create public/javascripts/controls.js
create public/javascripts/application.js
create doc/README_FOR_APP
create log/server.log
create log/production.log
create log/development.log
create log/test.log

這樣就完成了 Web 應用程序的框架。還需要編輯 config/database.yml 以便連接到 DB2,如清單 7 所示。

清單 7. 編輯 config/database.yml

# IBM DB2 

Database configuration file
# Install the IBM DB2 driver and get assistance from:
# http://www.alphaworks.ibm.com/tech/db2onrails
development:
adapter: ibm_db
database: health
username: michael
password: your_password_here
schema: xmlmd
# == remote TCP/IP connection (required when no local database catalog entry available)
# host: bigserver // fully qualified hostname or IP address
# port: 50000 // data server TCP/IP port number
# Warning: The database defined as 'test' will be erased and
# re-generated from your development database when you run 'rake'.
# Do not set this db to the same as development or production.
test:
adapter: mysql
database: xmlmd_test
username: root
password:
host: localhost
production:
adapter: mysql
database: xmlmd_production
username: root
password:
host: localhost

請注意該例中只修改了開發設置,而沒有改變測試和產品設置。此外把 adapter 設為 ibm_db。這就是剛剛安裝的驅動程序。Rails 不知道這個驅動程序,因為它不是 Rails 默認安裝的驅動程序。所幸的是很容易修改。只需要編輯一個文件。找到 Ruby 安裝目錄打開文件 /lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record.rb。找到 RAILS_CONNECTION_ADAPTERS 這一行,在列表的後面加上 ibm_db,如清單 8 所示。

清單 8. 為 Rails 增加 DB2 支持

RAILS_CONNECTION_ADAPTERS = %w( mysql postgresql sqlite firebird sqlserver db2 oracle sybase openbase frontbase ibm_db )

現在可以生成使用 XML 的模型了。首先按照常規方式使用 Rails 生成腳本建立一個模型,如清單 9 所示。

清單 9. 生成 Rails 模型

>ruby script\generate model doctor
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/doctor.rb
create test/unit/doctor_test.rb
create test/fixtures/doctors.yml
create db/migrate
create db/migrate/001_create_doctors.rb

生成的遷移腳本和預期的一樣。我們將利用它生成使用 XML 的另一個表,如清單 10 所示。

清單 10. Rails 遷移腳本:001_create_doctors.rb

class CreateDoctors < ActiveRecord::Migration
 def self.up
 create_table :doctors do |t|
 t.column :profile, :xml, :null => false
 end
 end
 def self.down
 drop_table :doctors
 end
end

這是非常典型的 Rails 遷移腳本。僅定義了一列 “profile”。惟一特別的一點是將列的類型定義為 xml。我們已經使用 Rails 創建了連接到數據庫的 Ruby 腳本,並建立了包含 XML 列的表。剩下的就是測試腳本了。

測試 Ruby 和 DB2

測試 Ruby/DB2 pureXML 腳本很容易。不過是一般的 Rails 遷移罷了。我們使用 Ruby 的 rake 命令,如清單 11 所示。

清單 11. 運行遷移腳本

>rake db:migrate
(in /xmlmd)
== CreateDoctors: migrating ===================================================
-- create_table(:doctors)
-> 0.7840s
== CreateDoctors: migrated (0.7860s) ==========================================

這樣就完成了。您也許希望使用 --trace 選項幫助調試錯誤。一般來說,對於診斷連接錯誤、用戶名/口令錯誤、指定的數據庫或模式錯誤等,非常有效。下面需要使用 DB2 檢查是否存在新建表,如清單 12 所示。

清單 12. 檢查和描述新表

db2 => describe table xmlmd.doctors
Data type Column
Column name schema Data type name Length Scale Nulls
------------------------------- --------- ------------------- ---------- ----- ------
ID SYSIBM INTEGER 4 0 No
PROFILE SYSIBM XML 0 0 No
2 record(s) selected.

由此可見,我們已經使用 Ruby on Rails 建立了包含 XML 列的 DB2 表。此後就可以使用 Rails 完成很多有趣的工作了。可以創建新的遷移腳本向數據庫插入 XML 數據。Ruby 創建 XML 文檔特別簡單,只需要轉化成字符串並發送給 DB2。稍加修改還可以利用 Rails 中的腳手架來處理 XML。

結束語

本系列的第一部分說明了如何利用 XForms、DB2 pureXML 和 Ruby on Rails 快速構建以 XML 為核心的 Web 應用程序。考察了 XForms 如何簡化了交互式前端的創建。交互性類似於 Ajax,但是不需要編寫 JavaScript 或映射代碼。我們還介紹了使用 DB2 pureXML 存儲和查詢 XML 是多麼簡單。DB2 的 SQL/XML 允許混合使用 SQL 和 XQuery,可以方便地訪問數據庫中的 XML 數據。最後還介紹了如何設置 Ruby on Rails 與 DB2 pureXML 交互。稍加調整技能使用 Ruby on Rails 創建支持 XML 的 DB2 表了。所有技術的關鍵部分都已完結。下一部分我們將使用 XForms、DB2 pureXML 和 Ruby on Rails 創建用於醫院門診管理的 Web 應用程序。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved