 | Уровень сложности: средний Майкл Галпин, инженер по программному обеспечению, Vitria Technology
11.08.2009 Это первая статья серии из четырех статей, посвященных совместному использованию XForms, DB2 pureXML и Ruby для упрощенного создания Web-приложений. Мы разработаем гипотетическое приложение для управления историями болезни в кабинете врача. Вы почувствуете преимущества каждой из технологий и увидите, как объединить их друг с другом. В этой первой части мы рассмотрим, как XForms, DB2 pureXML и Ruby on Rails сообща помогают быстро создавать Web-приложения, основанные на XML.
Введение
Мир информационных технологий постоянно меняется. Появляются новые технологии, а существующие постоянно развиваются. Эти силы приводят к появлению новых парадигм и подходов. Часто новые технологии кажутся очередным изобретением колеса, но иногда они действительно помогают упростить жизнь. В этой статье, первой в серии из четырех частей, рассматриваются новые технологии, которые объединяет ряд общих аспектов. Каждая из них не только интересна с чисто теоретической точки зрения, но и помогает серьезно упростить решение трудных задач. Мы рассмотрим технологию для создания функционально богатых интерактивных Web-приложений XForms. Мы рассмотрим мощные функции IBM® DB2® pureXML для управления документами XML. Наконец, мы свяжем эти две технологии между собой с помощью среды разработки Web-приложений Ruby on Rails, чтобы рационализировать ввод информации о пациентах в кабинете врача. Имейте в виду, что эта серия статей не охватывает необходимые для практической среды вопросы безопасности, такие как предотвращение доступа пациентов к закрытым каталогам или защита паролем форм и областей, доступных только для врача и медперсонала.
 |
Предпосылки
Настоящая статья предполагает знакомство с XML и Web-приложениями в целом. Конечно, полезно предварительное знакомство с тремя основными технологиями, XForms, DB2 pureXML и Ruby on Rails, но это не обязательно. Статья написана при помощи Mozilla XForms plugin версии 0.8.0.3. Он обеспечивает поддержку XForms в любом браузере Mozilla, таком как Firefox. Другой очень полезный плагин Mozilla — XForms Buddy. Это отладчик для XForms. Для этой статьи использовалась версия 0.5.6. Нам потребуется также сервер базы данных IBM DB2. Для этой статьи используется СУБД DB2 Express-C version 9.5. Она работает на системах Windows®, Linux™ и UNIX®. Наконец, нам потребуется Ruby on Rails. Для этой статьи используется Ruby 1.8.6 с Rails 1.2.5. Ссылки для загрузки приведены в разделе Resources.
XForms в кабинете врача
Приложение, управляющее историями болезни в кабинете врача, должно обеспечивать возможность ввода пациентами данных, которые обычно собирают работники регистратуры. Это должно быть Web-приложение, чтобы станцией ввода данных для пациентов мог служить любой компьютер с Web-браузером. Здесь приходится принять первое технологическое решение. В качестве пользовательского интерфейса для своего приложения мы выбираем XForms.
Не служит ли это примером применения новомодной технологии лишь для того, чтобы пустить пыль в глаза и вписать яркую строку в свое резюме? Вовсе нет. XForms идеально подходит в подобной ситуации. Эта технология позволяет определять данные в простой XML-модели и просматривать их с применением стандартных элементов форм HTML. Затем XForms обеспечивает декларативное отображение между этими элементами. Это означает, что вам не нужно писать специальную клиентскую или серверную программу для того, чтобы брать вводимые значения и вставлять их в структуру XML. Все это делает XForms. Причем он делает это асинхронно: изменения в форме HTML связаны с моделью XML и передаются для синхронизации на сервер. Вы получаете преимущества Ajax без необходимости писать какие-либо сценарии JavaScript.
Заметим также, что в настоящее время XForms поддерживается браузерами не в полной мере. В будущем такая поддержка появится, но пока ее нет. Поэтому для добавления его поддержки нужно установить специальный плагин. При создании приложения для массового использования это может стать проблемой. Однако в специализированных приложениях, подобных тому, которое мы разрабатываем, эта технология отлично работает. Для доступа к приложениям применяется ограниченное число компьютеров, поэтому можно гарантировать, что на каждом из них будет установлена подходящая комбинация из браузера и плагина.
XForms – это мощная технология, которую можно использовать во всех случаях при работе с XML. Это клиентская технология, и для ее поддержки в любом динамическом приложении потребуются какие-то серверные технологии. В частности, нужна база данных для хранения информации. Так как интерфейс для представления этих данных будет использовать XML, было бы здорово, если бы и сервер использовал XML. В случае применения DB2 именно так и получается.
DB2 9 pureXML
Если вы разрабатывали приложения, использующие XML, то, вероятно, вам уже приходилось применять один или пару обычных методов сохранения данных XML в базе данных. Первый метод состоит в использовании той или иной технологии преобразования XML в записи реляционной БД. Часто это специальная логика приложения, которую программист пишет сам, чтобы извлекать данные из документа XML и помещать их в столбцы таблицы реляционной БД. Такой метод иногда называют «шинкованием» (shredding). Конечно, если впоследствии снова надо считывать данные, их всегда можно «расшинковать» и собрать в документ XML.
Другой общий метод заключается в простом помещении XML-документа в столбец CLOB базы данных. При этом XML, по существу, рассматривается как гигантская строка. Впоследствии можно считать ее из базы данных и передать в парсер или восстановить документ XML. Обычно это гораздо проще, так как не нужно писать никакого кода шинкования/расшинкования, но не так удобно, поскольку нет эффективного способа обращения к данным внутри документа XML.
В последние годы стали популярными XML-базы данных, которые решают проблемы подобного рода. Они позволяют хранить данные прямо в формате XML, так что необходимость шинкования отпадает. В них можно эффективно обращаться к данным с использованием языка XQuery, так что структура документа не пропадает. Многие подобные базы данных – это мелкие, специализированные БД, но теперь в список баз данных со стандартной поддержкой XML можно добавить флагманскую РСУБД IBM DB2.
Используя DB2, те же данные, которые вводятся в XForms, можно хранить в базе данных в формате XML. При этом не требуется никакого шинкования, преобразования или анализа данных. «Язык» данных в браузере – тот же, что используется в базе данных. DB2 позволяет применять XQuery в запросах SQL, так называемый SQL/XML, так что данные документов XML остаются легко доступными. Например, допустим, вам нужна информация об определенном пациенте. Эту информацию можно хранить в документах XML, а для извлечения документов о пациенте с нужной фамилией использовать запрос XQuery. Посмотрим, как это делается в DB2.
Установка DB2
Нужно установить DB2 и создать таблицу, использующую стандартный XML. Одно преимущество DB2 по отношению к другим базам данных XML заключается в том, что она позволяет смешивать реляционные данные с данными 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. Как видно из листинга, синтаксис предельно прост и мало отличается от декларирования столбца как integer или varchar. Тем, кто не любит создавать таблицы из командной строки, DB2 Command Center предоставляет графическую альтернативу того же действия. Можно использовать его мастер создания таблиц, как показано на рис. 1.
Рисунок 1. Запуск мастера создания таблиц
Мастер запускается нажатием кнопки Create New Table и открывает экран с информацией об имени таблицы, как показано на рис.2.
Рисунок 2. Имя таблицы
Этот экран позволяет указать схему таблицы и ее имя. Нажатие кнопки Next открывает интерфейс определения столбцов, показанный на рис.3.
Рисунок 3. Определение столбцов новой таблицы
Нажатие кнопки Add выводит интерфейс добавления столбцов, показанный на рис.4.
Рисунок 4. Интерфейс добавления столбцов
Здесь начинается самое интересное. Чтобы определить столбец с данными XML, нужно установить для него тип данных 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 происходит точно так же. К XML можно обращаться с запросами, используя SQL и XQuery, как показано в листинге 3.
Листинг 3. Запрос SQL/XML
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 для обозначения запроса XQuery по отношению к документу XML, который прошел через оператор выбора SQL. При исполнении этого запроса должен быть возвращен документ XML, показанный в листинге 4.
Листинг 4. Результирующий документ XML
<?xml version="1.0" encoding="UTF-16"?>
<Patients>
<Patient>John</Patient>
</Patients>
|
Теперь, когда стало ясно, как легко использовать DB2 для стандартного хранения XML, нам понадобится какой-то посредник между использованием XML в XForms и в DB2. Для этой цели хорошо послужит Ruby.
Rails с DB2
Пора подумать о том, как соединить интерфейс XForms с механизмом DB2 pureXML. Ruby on Rails служит мощным средством для быстрого и удобного создания Web-приложений. Он облегчает и работу с базами данных, но может ли Rails работать с DB2 и, в частности, с DB2 pureXML? Конечно, как и в большинстве случаев применения Rails, это делается на удивление легко.
Установка драйвера DB2 для Ruby
Первое, что для этого потребуется, — разрешить в Rails поддержку DB2. Если у вас установлен Rails, нужно установить и Ruby Gems. Эта система управления пакетами идеальна для добавления в Rails новых функций, таких как поддержка DB2. Затем в командной строке наберите следующее:
>gem install ibm_db.
Это приведет к загрузке драйвера Ruby для DB2. После его установки любые из приложений 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. Если Ruby установлен при помощи Windows Installer, нужно выбрать вариант #1. Теперь можно создавать приложение Rails, использующее DB2 pureXML.
Создание приложения 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
|
Заметьте, что в этом примере мы изменили только параметры development, оставив значения параметров test и production по умолчанию. Заметьте также, что для 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. Сначала обычным способом создадим модель с применением сценария генерации, как показано в листинге 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.
|
Итак, мы успешно создали таблицу DB2 со столбцом XML при помощи Ruby on Rails. Теперь Rails можно использовать для многих интересных вещей. Можно создать дополнительные сценарии миграции для вставки XML в базу данных. Ruby предельно облегчает создание документов XML; все, что для этого нужно, — превратить их в строки для передачи в DB2. Можно использовать scaffolding-технологию Rails, внеся некоторые корректировки для работы с XML.
Заключение
В этой первой статье серии мы рассказали о том, как XForms, DB2 pureXML и Ruby on Rails помогают быстро создавать Web-приложения на основе XML. Мы показали, как XForms упрощает создание интерактивного интерфейса. Мы получили интерактивность Ajax, но без необходимости писать сценарии JavaScript или код преобразования. Мы увидели, как легко сохранять XML и обращаться к нему с запросами при помощи DB2 pureXML. DB2 SQL/XML позволяет смешивать SQL и XQuery, чтобы легко обращаться к данным XML в базе данных. Наконец, мы показали, как настроить Ruby on Rails для работы с DB2 pureXML. Всего нескольких мелких поправок достаточно, чтобы при помощи Ruby on Rails создать таблицы с поддержкой XML в DB2. Теперь у нас есть все основные технологического составляющие. В следующей части этой серии мы начнем создавать при помощи XForms, DB2 pureXML и Ruby on Rails Web-приложения для врачебного кабинета.
Загрузка | Описание | Имя | Размер | Метод загрузки |
|---|
| Пример кода для Части 1 | part1_doctorsOffice.zip | 2KB | HTTP |
|---|
Ресурсы Научиться
-
XForms and Ruby on Rails at the doctor's office, Part 1: Setting up IBM DB2 9 pureXML: Оригинал статьи (EN).
-
Отличное введение в XForms из трех частей: Introduction to XForms (Chris Herbroth, developerWorks, сентябрь 2006 г.) .
-
Как использовать XForms и Ajax вместе: Combining Ajax and XForms (Nicholas Chase, developerWorks, октябрь 2006 г.) (EN).
-
Добавление к XForms и Ajax инструментария Google Web Toolkit: Integrate XForms with the Google Web Toolkit, Part 1: Introducing GWT's JavaScript Native Interface (Michael Galpin, developerWorks, сентябрь 2007 г.) .
-
Одно из первых углубленных руководств по GWT: Ajax for Java
developers: Exploring the Google Web Toolkit (Philip McCarthy, developerWorks, июнь 2006 г.) (EN).
-
Знакомство с Ruby on Rails и DB2: An introduction to Ruby on Rails for DB2 developers (Edd Dumbill, developerWorks, июнь 2006 г.) (EN).
-
Все о совместном применении DB2 и Ruby on Rails: DB2 and Ruby on Rails, Part 1: Getting started with DB2 and Ruby on Rails (John Chun, et al., developerWorks, май 2007 г.) (EN).
-
Как использовать DB2 pureXML с Ruby on Rails: DB2 and Ruby on Rails, Part2: DB2 and pureXML with Ruby on Rails (John Chun, et al., developerWorks, июнь 2007 г.) (EN).
-
Как использовать DB2 для усиления встроенных средств тестирования Rails: DB2 and Ruby on Rails, Part 3: Testing with DB2 and Ruby on Rails (John Chun, et al., developerWorks, июнь 2007 г.) (EN).
-
О последних усовершенствованиях в DB2: Overview of new DB2 Version 9.5 pureXML enhancements (Manaj Sardana, developerWorks, ноябрь 2007 г.) (EN).
-
Об использовании XQuery с DB2: Query DB2 XML data with XQuery (Don Chamberlin and Cynthia Saracco, developerWorks, апрель 2006 г.) .
-
Посетите IBM developerWorks Ajax Resource Center
-
XForms на W3C.
-
Технические мероприятия и Web-трансляции developerWorks : оставайтесь в курсе событий.
-
Подкасты: Интервью и дискуссии с техническими экспертами IBM.
Получить продукты и технологии
Обсудить
Об авторе  | |  | Майкл Галпин (Michael Galpin) имеет учёную степень по математике в Калифорнийском Технологическом институте. Он является Java-разработчиком с конца 90-х гг. и работает инженером по программному обеспечению в Vitria Technology, в Саннивейл, Калифорния. |
Выскажите мнение об этой странице
|  |