Введение в библиотеку 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