Введение в библиотеку Wt C++ для разработки web-приложений.

Wt (произносится "витти") - это библиотека C++ для разработки web-приложений.

Web реализация протоколов взаимодействия клиента и сервера, управления событиями, GUI, поддержка графики, поддержка постепенной деградации (graceful degradation) или прогрессивного расширения (progressive enhancement), работа с URL, WebSockets, Ajax (GET/POST), самостоятельного сервера приложений Http(s)/WebSockets или может интегрироваться через FastCGI с другими web-серверами.

Web-приложения на базе Wt разрабатывается с использованием C++ API, и библиотека сама генерирует необходимый код HTML, CSS, Javascript, CGI, SVG/VML/Canvas и Ajax. Безопасность и кросс-браузерность web-приложений обеспечивается Wt. Сначала Wt запускает простое приложение HTML/CGI, и затем прогрессивно расширяет его JavaScript, Ajax и даже WebSockets.

Типичные сценарии использования:

  • Высокопроизводительные, сложные web-приложения, которые полностью персонализированы (и, как следствие, кэширование для которых не приносит выигрыша), с полной поддержкой Ajax, и, в то же время, полностью доступные и оптимизированные для поисковых систем.
  • GUI web для встраеваемых систем, благодаря малому размеру web-сервера на C++.
  • GUI web, для интеграции с существующими библиотеками C++, например, для научных или инженерных приложений, или с существующими настольными приложениями C++.

Другие выгоды от использования Wt:

  • Разработка web-приложений с хорошо знакомыми паттернами GUI настольных систем.
  • Наличие обширного набора виджетов без JavaScript, но с ним работают ещё лучше.
  • Единая спецификация клиентской и серверной валидаций и управления событиями.
  • XHTML и CSS для оформления.
  • Генерация отвечающего стандартам HTML или XHTML кода.
  • Переносимая, сглаженная графика (anti-aliased), оптимизированная VML, SVG, HTML5 canvas, PNG,  может быть использована для вывода в PDF.
  • Позволяет избежать проблем безопасности, обладает полным контролем над уровнем представления, фильтрует активные тэги и атрибуты, не влияя на логику, упрощает аутентификацию.
  • Сверхбыстрая загрузка, оптимальное использование канала связи, реализует все известные приёмы оптимизации отзывчивости приложений, используя для этого особенности различных браузеров.
  • Простой API с кросс-браузерной реализацией инициируемых сервером событий (server push посредством comet или WebSockets).
  • Возможность использования встроенного сервера httpd, или FastCGI/ISAPI для развёртывания на действующих web-серверах.

Возможности библиотеки:

  • Поддержка основных браузеров: Firefox/Gecko, Internet Explorer, Safari, Chrome, Konqueror и Opera, а также простого HTML: Links, Lynx.
  • Развёртывание на Unix/GNU Linux или Windows Visual Studio.
  • Идентичное поведение, как при поддержке JavaScript или Ajax, так и без таковой, насколько это возможно, посредством постепенной деградации (graceful degradation) или прогрессивного расширения (progressive enhancement).
  • Интегрированная поддержка Юникода и локализации.
  • Эффективный рендеринг и низкая латентность.
  • Поддержка перемещения с помощью истории браузера, лаконичные URL при доступности истории HTML5, оптимизация для поисковых машин и предсказуемое поведение сессий простого HTML или Ajax.
  • Настраиваемые опции отслеживания сессий, либо перезаписью URL, либо куков.
  • Высокая производительность позволяет развёртывать приложения на встраиваемых устройсвах класса low-end; энерго-, место- и бюджетно-сберегающие развёртывания web-сайтов в Интернет или в экстранет.
  • Полностью событейно-управляемый асинхронный ввод/вывод: сессии не привязаны к потокам, и открываемые соединения не блокируют их. Напротив, потоки необходимы как раз для улучшения обслуживания конкурентных запросов или для повторяющихся циклов событий (reentrant event loops).

Обработка событий:

  • Использует современный типобезопасный сигнально/слотовый API.
  • Отслеживает события клавиатуры, мыши и фокусировк.
  • Автоматическая синхронизация данных в полях формы между браузером и сервером.
  • Динамическая трансляция из C++ в JavaScript, путём определения слотов без состояния (stateless slot). Такие слоты определяются на C++, после чего обработка событий осуществляется как на стороне клиента, так и на стороне сервера: визуальные изменения обрабатываются на стороне клиента, а состояние приложения отслеживается на стороне сервера.
  • Возможность подключения произвольного кода JavaScript (например, для обработки событий только на стороне клиента), и эмитирования сигналов C++.
  • Drag&Drop API.
  • Повременные события и инициируемые сервером обновления ("server push").
  • Использует простой HTML CGI, Ajax или WebSockets.

Собственная система рисования:

  • Унифицированный API рисования, который использует встроенные возможности браузеров отображения векторной графики (встроенный VML, встроенный SVG или HTML 5 canvas), или распространённые форматы растровых изображений (PNG, GIF и т.п.) или векторых изображений (SVG, PDF).
  • Поддерживает произвольные пути рисователя, обрезку, текст, изображения, трансформации, тени.
  • Встроенные компоненты GUI.

Встроенная безопасность:

  • Защита памяти на уровне ядра решает проблемы приватности, возникающие из-за ошибок программирования, так как сессии могут быть полностью изолированы друг от друга (в режиме отдельных процессов).
  • Поддержка шифрования и серверной аутентификации посредством Secure Sockets Layer (SSL) или Transport Layer Security (TLS) через HTTPS.
  • Непрерывное использование HTTPS благодаря низким требованиям к пропускной способности канала передачи данных (за счёт fine-grained Ajax).
  • Встроенная возможность предотвращения атак типа "межсайтовый скриптинг" (Cross-Site Scripting - XSS). Выводимый текст всегда отфильтрован от потенциально вредоносного кода.
  • Неуязвима в части "подделки HTTP-запросов" (Cross-site Request Forgery - CSRF), потому что для отслеживания сессий не обязательно использовать куки, но даже если они и используются, то библиотека никогда не полагается исключительно на них при запросах, которые провоцируют запуск кода обработки события.
  • Неуязвима в части нарушения логики приложения путём перехода по определённому URL, поскольку обработаны могут быть только те события, которые предусмотрены интерфейсом.

Библиотека объектно-реляционного отображения:

Wt имеет в своём составе Wt::Dbo, самодостаточную библиотеку, реализующую объектно-реляционное отображение (Object-Relational mapping - ORM), и, таким образом, предоставляет удобный способ взаимодействия с системами управления баз данных SQL из C++. Хотя такие возможности как оптимистическое управление конкурентным доступом (optimistic concurrency control) делают эту технологию идеальной для web-приложений, опирающихся на базу данных (она также хорошо интегрируется с MVC классами Wt), библиотека также может быть использована для оффлайн и других приложений (она не зависит от Wt). Библиотека ORM обладает следующими возможностями:

  • Нет ни генерации кода, ни "макросомагии", ни XML конфигурирований. Используется только современный C++!
  • Применяется шаблонизированный паттерн посетитель (visitor), которому требуется один шаблонный метод для осуществления отображения: немыслимо эффективно!
  • Вы можете определять суррогатные, автоматически инкрементируемые ключи, или отображать естественные (в т.ч. и составные, состоящие более чем из одного поля в базе данных) ключи на любой тип данных C++.
  • Поддержка оптимистического управления конкурентным доступом с помощью специально выделенных для этого полей данных в базе.
  • Возможность отображения отношений "один-ко-многим" и "многие-ко-многим" на STL-совместимые коллекции.
  • Имеются операции генерирования схемы данных (т.е. DDL: data definition language (язык описания данных)) и работы с данными (т.е. DML: data manipulation language (язык манипулирования данными)).
  • Повсеместно используются предподготовленные выражения (prepared statements).
  • В каждой сессии отслеживаются "грязные" (не сохранённые) объекты и обеспечивается первичное кэширование.
  • Возможность осуществления гибкой выборки отдельных полей, объектов, или их кортежей (с помощью Boost.Tuple).
  • Возможность использования одного соединения или пула соединений из множества сессий, в которых эти соединения фактически будут использоваться только во время транзакций.
  • Поддерживаются СУБД Sqlite3 и PostgreSQL, а также MySQL (только GPL), поддержка которой обеспечивается сообществом (Полом Гариссоном (Paul Harisson)).

Тестирование

В Wt код обработки событий создаёт и манипулирует деревом виджетов, которое может быть легко проверено тестирующим кодом. Поэтому, среда тестирования позволяет динстанцировать приложение и имитировать возникновение событий при отсутствии браузера, тем самым сокращая время цикла обработки запроса и ответа на него (request/response cycle), которое потребовалось бы браузеру.

Развёртывание

Различные способы развёртывания представлены библиотекой в виде коннекторов. Способ развёртывания определяется на этапе компоновки (редактирования связей) с одним из коннекторов!

a) Встроенный httpd
  • Простой, высокопроизводительный сервер web-приложений (многопоточный, с асинхронным вводом/выводом) на базе библиотеки C++ asio.
  • Поддерживает HTTP и HTTPS посредством библиотеки OpenSSL.
  • Поддерживает разбиение ответа на части и компрессию.
  • Один процесс (что удобно для разработки и отладки), который может быть встроен в существующее приложение.
  • Поддержка развёртывания за проксирующим (и, если необходимо, балансирующим нагрузку) web-сервером.
  • Доступен для платформ UNIX и Win32.
b) FastCGI
  • Интеграция с распространёнными web-серверами (apache, lighttpd).
  • Различные стратегии отображения сессий на процессы.
  • "Горячее" развёртывание: новые сессии используют новую версию приложения, в то время как старые сессии могут продолжать работать с соответствующей им версией приложения.
  • Доступен только для платформ UNIX.
c) ISAPI
  • Интеграция с Microsoft IIS server.
  • Использование асинхронного API ISAPI для максимального быстродействия.
  • Доступен для платформ Win32.

http://www.webtoolkit.eu/wt/ru/ - Русская версия, дистрибутив WEB фреймворка

Обратная связь

Интересуют вопросы реализации алгоритмов, программирования, выбора электроники и прочая информация, постараюсь осветить в отдельных статьях

пишите мне на netdm@mail.ru