Возможности
Ключевые возможности библиотеки
- Поддержка основных браузеров (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.