=begin pod
=CHAPTER WebDAO - платформа для web приложений
B<WebDAO> - объектно-ориентированная система для создания производительных web приложений, состоящая из набора модулей на языке I<perl>.
=head2 Основные принципы
=item * Абстракция среды выполнения кода приложения
=item * Динамическая структура доменной логики
=item * Адресация объектов по URL
=item * Встроенная поддержка сессионных параметров
=head3 Абстракция среды выполнения кода приложения
Существует большое количество окружений, в которых работают web приложений.
---------------------------------------------
| mod_perl Apache |
| FastCGI CGI |
| ------------------------ |
| nginx | | |
| | Your code | isapi |
| | | |
| ---------------------- |
| Shell Test::More IIS |
| lighttpd |
---------------------------------------------
B<WebDAO> проектировалась с целью избавить разработчика от деталей среды работы приложения, снизить затраты при смене окружения, а также упростить отладку и тестирование приложений. Важной целью является упрощение и повышение скорости web разработки.
=head3 Динамическая структура доменной логики
Структура объектов доменной логики формируется на основе I<XML>(I<HTML>) файла. Имя файла может быть производным. Для примера, его имя пусть будет привычным для web разработчиков : I<index.xhtml>.
<body>
<div>
<wd>
<object class="MyTest" id="page"/>
</wd>
</div>
</body>
В этом тексте, кроме XHML тэгов, используются дополнительные, например: I<wd> и I<object>. Тэг I<wd> является признаком начала специальной ( I<интерпретируемой>) области.
Пока отсутствует поддержка пространств XML имен, но со временем, я обещаю, она появится.
Тэги I<wd> обрамляют область, в которой располагаются определения объектов и другие интерпретируемые тэги. В приведенном примере, с помощью I<command> создается экземпляр класса I<MyTest> и идентификатором I<page>. Именно идентификатор объекта используется в URL. Например:
http://example.org/page
http://example.org/page/Method?par1=1&par2=2
В состав пакета I<WebDAO> входит лексический анализатор, который обрабатывает этот файл и на основе I<xml> тэгов строит структуру объектов.
Создадим файл C<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>
=head3 Адресация объектов по URL
Одна из основных идей I<WebDAO> - отображение URL на доменную структуру объектов.
Например, для адреса:
http:://example.com/test/Method?param=1¶m2
Будет вызван метод I<Method> у объекта I<test>. Имена публичных методов, которые доступны для обращений из-вне начинаются с большой буквы. Имена объектов с любой. В случае, если имя метода не указано используется I<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
=head3 Встроенная поддержка сессионных параметров
В I<WebDAO> встроена поддержка сессионных параметров. Схематически ее можно представить следующей диаграммой объектов:
+-----------------+ load +------------------+ Storages:
| | <---------- | | -> MLDBM files
| Session object | store | WebDAO::Store::* | -> Storable files
| | ----------> | | -> MemCached,MemCacheDB
+-----------------+ +------------------+ -> Custom storage ...
^ |
/|\ |
| |
| \|/
| V
+-----------------+
| |
| WebDAO::Engine |
| |
+-----------------+
Для этого достаточно выбрать источник хранения в конфигурации web сервера и указать атрибуты объекта в наследуемом классе.
Пример конфигурации (I<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');
}
=end pod