сгенерированной Wee, приложение понимает, что нужно вызвать метод click
.
19.5.2. Ассоциирование состояния с URL
В примере выше отслеживается текущее значение переменной @click
, но она не связывается с URL. Если вы запустите эту программу, что увидите, что Wee генерирует довольно длинный URL, который по сути является GUID'om (globally unique identifier, глобально уникальным идентификатором). URL остается таким же, если не считать завершающего символа косой черты и целого числа. При каждом щелчке по ссылке Welcome to Wee число увеличивается на единицу
Если вручную изменить URL в браузере, то вы получите ту же самую страницу, показываемый счетчик щелчков не изменится. Нет никакой связи между URL и состоянием сервера. (Когда будете ставить эксперимент, не забудьте отключить кэширование в браузере).
Впрочем, это положение можно изменить, слегка модифицировав файл main.rb
. Добавьте в метод Main
такой код:
def backtrack_state(snap)
super
snap.add(self)
end
Теперь перезапустите приложение. Щелкнув несколько раз по ссылке, вручную измените URL в браузере так, чтобы повторно загрузилась предыдущая страница. Теперь счетчик должен показать то значение переменной @click
, которое соответствует моменту генерации данного URL.
Чтобы проверить то же самое с использованием механизма продолжений Wee, добавьте после директив require
в файл run.rb
следующую строку:
require 'wee/continuation'
В Wee слишком много возможностей, чтобы рассмотреть их здесь подробно. Дополнительную информацию можно найти на следующих ресурсах:
• страница проекта Wee (http://rubyforge.org/projects/wee/);
• страница проекта Nemo (http://rubyforge.org/projects/nemo/):
• проект Seaside (http://seaside.st/)
Одна из интересных особенностей — возможность иметь вложенные компоненты и организовывать цепочки обязанностей, что позволяет собирать сайты из повторно используемых компонентов пользовательского интерфейса. Стоит также познакомиться с проектом Nemo — реализацией Mewa (Meta- level Architecture for Web Applications, метауровневая архитектура Web-приложений) на Wee.
19.6. Разработка Web-приложений с помощью IOWA
19.6.1. Основные идеи IOWA
Приложение IOWA работает как фоновый процесс, который прослушивает сокет в ожидании запросов. IOWA включает различные адаптеры, так что источником запроса может быть CGI, Mongrel, WEBrick и т.д.
На домашней странице IOWA представлены хорошее объяснение архитектуры и учебное руководство, поэтому здесь мы приведем лишь краткий обзор основных особенностей.
Загрузить IOWA можно с сайта rubyforge.org. Gem-пакет будет подготовлен вместе с версией 1.0. Примеры, представленные в этом разделе, составлены на базе предварительной версии, доступной в виде zip- или tgz-файла.
В состав дистрибутива входит несколько примеров и тестов, демонстрирующих работу каркаса. Мы рассмотрим простое приложение, разработанное на основе этих примеров.
Для приложения IOWA нужен код, который запустит фоновый процесс, а в качестве фронтального процесса мы будем пользоваться встроенным сервером WEBrick. Сценарий арр.rb
решает обе задачи:
require 'iowa_webrick'
class HWApplication < Iowa::Application
self.daemonize = true
attr_accessor :dbpool
def initialize(*args)
super
Iowa.config[Iowa::Capplication][Iowa::Croot_url] = 'http://127.0.0.1:2000'
end
end
Iowa.run
По умолчанию конфигурационные данные читаются из файла арр.cnf
в текущем каталоге. Вот как выглядит наш файл:
socket:
hostname: localhost
path: ..
logging:
basedir: ../log
minlevel: 0
maxsize: 10000000
maxage: 86400
application:
daemonize: false
sessioncache:
class: LRUCache
maxsize: 20
ttl: 3600
dispatcher:
class: StandardDispatcher
policy:
class: iowa/Policy
Этот файл, записанный в формате YAML, содержит различную информацию о желаемом поведении IOWA. Необходим и еще один конфигурационный файл mapfile.cnf
, в котором описывается, как запросы отображаются на компоненты. Вот пример такого файла, содержащий всего одну строку: