January 31, 2011

Wt C++ Web Toolkit. Часть вторая.

В продолжение первой части, рассмотрим работу с библиотекой Wt на примере.
Чтобы показать, как это работает, рассмотрим самый простой пример. Будет использовано всего два виджета, это WText и WPushButton, соответственно текст и кнопка.

Все в целом очень простенько, а тем, кто знаком с Qt, все будет вызвать состояние дежавю.

00: #include <Wt/WApplication>
01: #include <Wt/WPushButton>
02: #include <Wt/WText>
03:
04: using namespace Wt;
06: class HelloWorld: public WApplication
07: {
08:  public:
09:    HelloWorld(const WEnvironment &env);
10:    void OnButtonClick();
11:  private:
12:    WText *text;
13:    WPushButton *button;
14: };
15:
16: HelloWorld::HelloWorld(const WEnvironment &env)
17:  :WApplication(env)
18: {
19:  text = new WText("<h1>Push the button</h1>", root());
20:  button = new WPushButton("Button", root());
21:  button->clicked().connect(this, &HelloWorld::OnButtonClick);
22: }
23:
24: void HelloWorld::OnButtonClick()
25: {
26:  if (text != NULL)
27:    text->setText("<h1>Hello World!</h1>");
28: }
29:
30: WApplication* CreateApplication(const WEnvironment &env)
31: {
32:  return new HelloWorld(env);
33: }
34:
35: int main(int argc, char **argv)
36: {
37:  return WRun(argc, argv, &CreateApplication);
38: }

Пример cостит из единственного объявленного класса HelloWorld унаследованного от WApplication, это необходимо для того, чтобы каждая отдельная запущенная сессия нашего приложения, имела соответствующий экземпляр WApplication.

В классе HelloWorld выполнено переопределение конструктора базового класса с аргументом в виде ссылки на экземпляр класса WEnvironment. Класс WEnvironment используется для представления данных о среде выполнения данной веб-сессии.

Так же в классе HelloWorld объявлены указатели на два виджета, это соответственно WText и WPushButton. Метод класса HelloWorld::OnButtonClick представляет собой слот, который определяет реакцию на сигнал clicked получаемый от экземпляра класса WPushButton. Так же в конструкторе класса HelloWorld производится инициализация виджетов и соединение сигнала и слота для обработки события нажатия кнопки.

Наиболее интересным моментом данного примера является вызов функции WRun. Данная функция вызывается единожды и выполняет запуск Wt сервера приложения. В качестве одного из параметров ей передается указатель на функцию CreateApplication, которая реализует создание новых экземпляров приложения для каждой новой веб-сессии.

Сборка Wt приложения
Сборка Wt приложения не отличается от сборки любого другого приложения.

gcc -c hw.cpp
gcc -o hw hw.o -lwt -lwthttp


Интересным моментом тут является указание линковщику на тип библиотеки -lwthttp или -lwtfcgi.
При -lwthttp Wt приложение будет собираться как сомостоятельный web сервер, а при -lwtfcgi, как fastcgi.

Как все это работает
1. При запуске нашего Wt приложения в режиме http сервера, необходимо передать ему как минимум два параметра: --docroot - определяющий корневой рабочий каталог сервера, а так же –http-address – определяющий адрес сетевого интерфейса для которого будет открыт серверный сокет.

2. Открываем имеющий под рукой браузер.

3. Создание новой веб-сессии.

4. Нажимаем на кнопку и получаем сообщение HelloWorld!

5. Обработка изменения состояния Wt приложения.



Как все это попробовать
Чтобы попробовать библиотеку Wt вовсе не обязательно непосредственно собирать ее из исходных текстов. Есть более простой вариант, непосредственно собрать дистрибутив Linux с уже включенной библиотекой Wt. И это совсем не сложно и даже очень просто, если воспользоваться замечательным сервисом Suse Studio. Регистрируемся и начинаем творить. :о)

1. Выбираем на базе, какого шаблона будем строить свой дистрибутив.
2. Придумаем имя новому дистрибутиву.
3. Добавим в дистрибутив необходимые пакеты.
Все что требуется добавить к базовому набору пакетов, свои. У меня это были собственно wt и wt-devel, а так же apache2, MozillaFirefox, gcc, gcc-c++.

4. Нажимаем большую зеленую кнопку Build. Ждем. И загружаем наш дистрибутив.
Процесс создания собственного дистрибутив как, оказывается, может быть на удивление простым. Далее можно смело запустить вашу любимую (на выбор) виртуальную машину и наконец-то пощупать Wt ручками.

8 comments:

MikeDM said...

Требую продолжения! =)

john said...

было бы неплохо узнать о производительности, плюсах,минусах

kuzmenko5 said...

Самое толковое описание на русском)
автор молодчина) ждем продолжения)

Миша said...

Спасибо прочитал обе статьи
Понравились

Большое спасибо

А по тестам C++ быстрее всех ну кроме ассемблера.

eugen said...

Добрый день!

Спасибо за статью - очень интересная тема поднята...

поскажите пожалуйста - как правильно произвести установку - не сработало:

eugen@comp:~/Project/Wt/hello$ gcc -c hello.cpp
eugen@comp:~/Project/Wt/hello$ gcc -o hello hello.o -lwt -lwthttp
/usr/bin/ld: hello.o: undefined reference to symbol 'boost::signals::detail::slot_base::create_connection()'
/usr/bin/ld: note: 'boost::signals::detail::slot_base::create_connection()' is defined in DSO /usr/lib/libboost_signals.so.1.46.1 so try adding it to the linker command line
/usr/lib/libboost_signals.so.1.46.1: could not read symbols: Invalid operation
collect2: выполнение ld завершилось с кодом возврата 1
eugen@comp:~/Project/Wt/hello$ gcc -o hello hello.o -lwt -lwthttp
/usr/bin/ld: hello.o: undefined reference to symbol 'boost::signals::detail::slot_base::create_connection()'
/usr/bin/ld: note: 'boost::signals::detail::slot_base::create_connection()' is defined in DSO /usr/lib/libboost_signals.so.1.46.1 so try adding it to the linker command line
/usr/lib/libboost_signals.so.1.46.1: could not read symbols: Invalid operation
collect2: выполнение ld завершилось с кодом возврата 1

Сергей said...

а какая версия gcc, boost?
не может слинковать... тут надо на boost смотреть.
такое я видел на ubunte 10.10 из коробки, но особо не разбирался. на suse собирается.

Сергей said...

to eugen:
если все же не понятно, пиши на почту, так больше шансов что быстрее увижу.

azure said...

Интересная штука. Только вот не понятно, каким образом эта штука генерирует выхлоп в браузер. Вот допустим этот хеллоуворлд какой код в браузер "выплюнул"? На сколько он "чист"? Как подключить к нему цсс?
Что будет при одновременном подключении тысячи клиентов?