NAME
WebDAO - платформа для web приложений
WebDAO - объектно-ориентированная система для создания производительных web приложений, состоящая из набора модулей на языке perl.
Основные принципы
Абстракция среды выполнения кода приложения
Динамическая структура доменной логики
Адресация объектов по URL
Встроенная поддержка сессионных параметров
Абстракция среды выполнения кода приложения
Существует большое количество окружений, в которых работают web приложений.
---------------------------------------------
| mod_perl Apache |
| FastCGI CGI |
| ------------------------ |
| nginx | | |
| | Your code | isapi |
| | | |
| ---------------------- |
| Shell Test::More IIS |
| lighttpd |
---------------------------------------------
WebDAO проектировалась с целью избавить разработчика от деталей среды работы приложения, снизить затраты при смене окружения, а также упростить отладку и тестирование приложений. Важной целью является упрощение и повышение скорости web разработки.
Динамическая структура доменной логики
Структура объектов доменной логики формируется на основе XML(HTML) файла. Имя файла может быть производным. Для примера, его имя пусть будет привычным для web разработчиков : index.xhtml.
<body>
<div>
<wd>
<object class="MyTest" id="page"/>
</wd>
</div>
</body>
В этом тексте, кроме XHML тэгов, используются дополнительные, например: wd и object. Тэг wd является признаком начала специальной ( интерпретируемой) области. Пока отсутствует поддержка пространств XML имен, но со временем, я обещаю, она появится.
Тэги wd обрамляют область, в которой располагаются определения объектов и другие интерпретируемые тэги. В приведенном примере, с помощью command создается экземпляр класса MyTest и идентификатором page. Именно идентификатор объекта используется в URL. Например:
http://example.org/page
http://example.org/page/Method?par1=1&par2=2
В состав пакета WebDAO входит лексический анализатор, который обрабатывает этот файл и на основе xml тэгов строит структуру объектов.
Создадим файл MyTest.pm со следующим содержимым:
package MyTest;
use WebDAO;
use base 'WebDAO::Component';
sub fetch {
"Hello Web X.0!";
}
1;
Каждый из объектов доменной структуры, участвующих в формировании результатов, отображает себя сам. Поэтому, в приведенном примере, результирующий XHTML будет выглядеть следующим образом:
<body>
<div>
Hello Web X.0!
</div>
</body>
Адресация объектов по URL
Одна из основных идей WebDAO - отображение URL на доменную структуру объектов.
Например, для адреса:
http:://example.com/test/Method?param=1¶m2
Будет вызван метод Method у объекта test. Имена публичных методов, которые доступны для обращений из-вне начинаются с большой буквы. Имена объектов с любой. В случае, если имя метода не указано используется index_x. Если этот метод отсутствует у объекта, возвращается статус "404: Not found". Таким образом адреса:
http:://example.com/test/?param=1¶m2
http:://example.com/test/
Эквивалентны вызовам
http:://example.com/test/index_x?param=1¶m2
http:://example.com/test/index_x
Встроенная поддержка сессионных параметров
В WebDAO встроена поддержка сессионных параметров. Схематически ее можно представить следующей диаграммой объектов:
+-----------------+ load +------------------+ Storages:
| | <---------- | | -> MLDBM files
| Session object | store | WebDAO::Store::* | -> Storable files
| | ----------> | | -> MemCached,MemCacheDB
+-----------------+ +------------------+ -> Custom storage ...
^ |
/|\ |
| |
| \|/
| V
+-----------------+
| |
| WebDAO::Engine |
| |
+-----------------+
Для этого достаточно выбрать источник хранения в конфигурации web сервера и указать атрибуты объекта в наследуемом классе.
Пример конфигурации (Apache web server):
<VirtualHost *>
...
#set Storable storage
SetEnv wdStore WebDAO::Store::Storable
#path for store
SetEnv wdStorePar path=/tmp/sessions
#Track session via cookies
SetEnv wdSession WebDAO::Sessionco
...
</VirtualHost>
В тексте модуля также необходимо создать атрибуты:
package MySess;
use WebDAO::Component;
use base 'WebDAO::Component';
# Определение сессионных атрибутов и
# их значений по умалчанию
__PACKAGE__->mk_sess_attr( attr1 => undef, _attr2 => undef );
sub UseAttr {
my $self = shift;
# read
my $val = $self->attr1;
...
$self->attr1('test_value');
}
1 POD Error
The following errors were encountered while parsing the POD:
- Around line 3:
Non-ASCII character seen before =encoding in 'платформа'. Assuming UTF-8