Основные принципы

Абстракция среды выполнения кода приложения

Существует большое количество окружений, в которых работают 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&param2

Будет вызван метод Method у объекта test. Имена публичных методов, которые доступны для обращений из-вне начинаются с большой буквы. Имена объектов с любой. В случае, если имя метода не указано используется index_x. Если этот метод отсутствует у объекта, возвращается статус "404: Not found". Таким образом адреса:

    http:://example.com/test/?param=1&param2
    http:://example.com/test/

Эквивалентны вызовам

    http:://example.com/test/index_x?param=1&param2
    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');
    }