Mercurial > pub > Impl
view Lib/IMPL/Web/Application.pm @ 71:d92d5ddaf524
docs
author | wizard |
---|---|
date | Thu, 25 Mar 2010 13:05:18 +0300 |
parents | 9f5795a10939 |
children | 2f31ecabe9ea |
line wrap: on
line source
package IMPL::Web::Application; use strict; use warnings; use base qw(IMPL::Config IMPL::Object::Singleton); require IMPL::Web::Application::Action; require IMPL::Web::Application::Response; use IMPL::Class::Property; use CGI; __PACKAGE__->PassThroughArgs; BEGIN { public property handlerError => prop_all; public property actionFactory => prop_all; public property handlersQuery => prop_all | prop_list; public property responseCharset => prop_all; public property options => prop_all; } # custom factory sub new { my ($self,$file) = @_; return $self->LoadXMLFile($file); } sub CTOR { my ($this) = @_; $this->actionFactory('IMPL::Web::Application::Action') unless $this->actionFactory; $this->responseCharset('utf-8') unless $this->responseCharset; } sub Run { my ($this) = @_; while (my $query = $this->FetchRequest()) { my $action = $this->actionFactory->new( query => $query, application => $this, ); $action->response->charset($this->responseCharset); $action->ChainHandler($_) foreach $this->handlersQuery; $action->Invoke(); $action->response->Complete; } } { my $hasFetched = 0; sub FetchRequest { return undef if $hasFetched; $hasFetched = 1; return CGI->new(); } } 1; __END__ =pod =head1 SYNOPSIS =begin code require MyApp; my $instance = spawn MyApp('app.config'); $instance->Run(); =end code =head1 DESCRIPTION Зкземпляр приложения содержит в себе глобальные настройки, реализует контроллер запросов, в качестве источника запросов используется CGI или иной совместимый модуль. Процесс обработки запроса состоит из следующих частей =over =item 1 Получение cgi запроса =item 2 Создание объекта C<IMPL::Web::Application::Action> =item 3 Формирование цепочки вызовов при помощи C<< IMPL::Web::Application::Action->ChainHandler >> =item 4 Выполнение запроса C<< IMPL::Web::Application::Action->Invoke >> =cut Также приложение поддерживает отложенное создание объектов, которые по первому обращению к свойствам. Это реализовано в базовом классе C< IMPL::Configuration >. Для настройки активаторов можно использовать свойство C<options>, в которое должен быть помещен хеш со ссылками на активаторы, см. пример ниже C<CONFIGURATION>. =head2 CONFIGURATION Ниже приведен пример конфигурации приложения =begin code xml <?xml version="1.0" encoding="UTF-8"?> <Application id='app' type="Test::Web::Application::Instance"> <!-- Begin custom properties --> <name>Sample application</name> <dataSource type='IMPL::Config::Activator' id='ds'> <factory>IMPL::Object</factory> <parameters type='HASH'> <db>data</db> <user>nobody</user> </parameters> </dataSource> <securityMod type='IMPL::Config::Activator'> <factory>IMPL::Object</factory> <parameters type='HASH'> <ds refid='ds'/> </parameters> </securityMod> <!-- End custom properties --> <!-- direct access to the activators --> <options type="HASH"> <dataSource refid='ds'/> </options> <!-- Set default output encoding, can be changed due query handling --> <responseCharset>utf-8</responseCharset> <!-- Actions creation configuration --> <actionFactory type="IMPL::Object::Factory"> <!-- Construct actions --> <factory>IMPL::Web::Application::Action</factory> <parameters type='HASH'> <!-- with special responseFactory --> <responseFactory type='IMPL::Object::Factory'> <!-- Where resopnses have a special streamOut --> <factory>IMPL::Web::Application::Response</factory> <parameters type='HASH'> <!-- in memory dummy output instead of STDOUT --> <streamOut>memory</streamOut> </parameters> </responseFactory> </parameters> </actionFactory> <!-- Query processing chain --> <handlersQuery type="IMPL::Object::List"> <item type="IMPL::Web::QueryHandler::PageFormat"> <templatesCharset>cp1251</templatesCharset> </item> </handlersQuery> </Application> =end code xml