Возможности

Ключевые возможности библиотеки

  • Поддержка основных браузеров (Firefox/Gecko, Internet Explorer, Safari, Chrome, Konqueror и Opera), а также браузеров простого HTML (Links, Lynx).
  • Разработка и развёртывание на Unix/GNU Linux или Microsoft 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). Выводимый текст всегда отфильтрован от потенциально вредоносного кода, делая XSS-атаки на приложения Wt (почти) невозможными.
  • Неуязвима в части "подделки 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.