Skip to main content

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

Материал, представленный ниже, большей частью, написан по мотивам A gentle introduction to the Wt C++ Toolkit for Web Applications, не является полным переводомм.
Введение
C++ – язык программирования общего назначения, созданный для разработки программного обеспечения широкого спектра, такого как, операционные системы, прикладное программное обеспечение, серверное программное обеспечение и так далее. Тем не менее, использование C++ для разработки веб-приложений весьма ограничено. Вместо этого применяются языки «доминирующие» в разработке веб-приложений, такие как, Java, PHP, Python, Perl. За исключением PHP, который был специально спроектированным для разработки веб-приложений, для языков программирования предлагаются различные фреймворки, облегчающее разработку веб-приложений. Например, J2EE и Struts для Java, Perl::CGI для Perl, или Zope для Python.
Стоит отметить, что в оригинальной статье не упоминается ASP.NET, технология Microsoft позволяющая создавать веб-приложения с использованием .NET Framework.
Фреймворки обеспечивают управление сессиями, поддержку разбора данных, передаваемых из браузера, генерации новой страницы в ответ, и так далее. Парадигма, используемая веб-приложениями данного типа приведена на рис.1.
На каждом шаге, браузер запрашивает новую страницу на сервере, и может передать данные HTML формы в запросе. На стороне сервера, веб-приложение обрабатывает запрос, определяет сессии, выполняет бизнес-логику, и наконец, генерирует страницу ответа. Кроме этого, страница может содержать не только HTML, но и JavaScript для повышения интерактивности. Однако, JavaScript имеет различного рода причуды при работе в различных браузерах, что требует больших усилий для написания кроссбраузерного кода.
Весьма успешные приложения, такие как GMail, Google Map компании Google, не следуют этой парадигме. Вместо этого они используют сочетание JavaScript и серверных методов, часто упоминаемых, как AJAX, для динамического обновления веб-страницы с новым содержанием, получаемым от сервера без перезагрузки всей страницы. Технология AJAX использует JavaScript, чтобы выполнить HTTP запрос к серверу в фоновом режиме (например, Есть новая почта?). Cервер генерирует соответствующий ответ, (например, «Да, 2 письма. 1..., 2...) в XML формате. Наконец, на стороне клиента JavaScript анализирует ответ и выполняет обновление веб-страницы модифицируя Document Object Model (DOM) (например, добавляя два новых почтовых сообщения в папку «Входящее»).
Возможность выполнять запросы в фоновом режиме основана на наборе API XMLHttpRequest, впервые разработанном Microsoft для Outlook Web Access. Впоследствии XMLHttpRequest в составе MSXML 2.0 появился в Internet Explorer 5.
Эта технология вызвала много шума в 2005 году, причина которого – фундаментальные изменения в подходах к тому, как может быть построено веб-приложение. Больше не требуется передачи новой веб-страницы в ответ на каждое событие. AJAX представил новые возможности для веб, следовательно, иногда ассоциируется с совершенно новой и более интерактивной версией интернета WEB 2.0. В тоже время использование этих технологий порождает много проблем. Разработчик приложений должен освоить ряд новых технологий, чтобы использовать AJAX. В дополнение к фреймворку используемому на стороне сервера и HTML/CSS, разработчик должен освоить Dynamic HTML (DHTM), который позволяет выполнить модификацию Document Object Model (DOM) с помощью JavaScript, некоторую дополнительную информацию о протоколе HTTP, чтобы создавать корректные GET/POST запросы с помощью JavaScript, и, наконец, использование XMLHttpRequest API. Так же следует учесть различия между браузерами и желание обеспечить поддержку более старых версий, не поддерживающих данную технологию.

Введение в Wt
В отличие от традиционной модели веб-приложений, модель библиотеки Wt, как и традиционных GUI библиотек, основывается на виджетах, рис.2.

Концептуально виджеты организованы в виде дерева, а функции обратного вызова связаны с конкретными событиями. В ответ на событие вызывается метод, выполняющий определенное действие и(или) модифицирующий виджет. Wt является молодой С++ библиотекой для разработки веб-приложений. Модель Wt во многом похоже на модели существующих библиотек GUI (таких как MFC или Qt). Wt скрывает от разработчика многие детали технологий (HTML, Forms/CGI, JavaScript, AJAX, и т.д.), мало чем, отличаясь от того, как библиотека Qt скрывает детали лежащих в основе библиотек X Window System или Microsoft Windows GUI. Так как Wt API реализует абстракцию для базовых технологий (Forms, JavaScript или AJAX), Wt выбирает, способ взаимодействия с веб-браузером в зависимости от технической поддержки со стороны браузера. Таким образом, ответственность за работу веб-приложения в джунглях веб-браузеров передается от разработчиков приложения к разработчикам библиотеки.

Основные компоненты. Пользовательский интерфейс организован в виде иерархического дерева виджетов, объектов WWidget. WWidget соответствует таким визуальным элементам, как, например, текст (WText), таблица (WTable), строка ввода (WLineEdit) или более сложным составным виджетам. Каждому WWidget соответствует прямоугольная область, для которой реализуется управление содержимым и обработка событий. Библиотека предоставляет ряд основных виджетов, которые непосредственно соответствуют элементам HTML, все они являются потомками WWebWidget (WText, WTable, WImage, ...). Эти виджеты непосредственно управляют модификацией HTML DOM. Более сложные составные виджеты являются потомками WCompositeWidget, они не производят непосредственной модификации HTML DOM, но могут использовать открытие вызовы API составляющих их виджетов. Каждое приложение Wt начинается с создания экземпляра объекта WApplication. Таким образом, каждая новая сессия имеет свой соответствующий экземпляр WApplication. WApplication содержит ссылку на корневой элемент дерева виждетов, информацию о возможностях браузера, обеспечивает поддержку локализации.

Управление сессиями. Подобно тому, как несколько экземпляров обычного приложения могут быть запущены одновременно, Wt запускает отдельное веб-приложение для каждой отдельной веб-сессии. Каждая новая сессия представляет новый путь исполнения, который начинается с wmain(), точки входа в приложение. Таким образом, программисту необходимо лишь реализовать однопользовательское приложение, если только, не планируется использовать общие ресурсы (например, базы данных, в данном случае должны применяться стандартные методы совместного использования данных). Текущая версия Wt реализует различные пути исполнения за счет использования различных процессов. Таким образом, для каждой новой сессии, Wt порождает новый процесс. Это главное преимущество, обеспечивающееся уровнем защиты памяти между различными сессиями на уровне процессов. Недостатком такого подхода является то, что может потребоваться некоторое количество невыгружаемой памяти для каждого процесса. В будущем Wt сможет предложить другой вариант разделения, в том числе на потоках.

Сигналы и слоты. Библиотека Wt использует механизм сигналов и слотов для осуществления передачи событий. События пользовательского интерфейса, такие как щелчки мыши, или изменение текста, Wt представляет как сигналы, связанные с конкретным виджетом. Любой метод объекта, имеющий сигнатуру совместимую с сигналом, может быть использован в качестве слота. Всякий раз, когда посылается сигнал, все слоты, которые были связаны с сигналом, вызываются. Парадигма сигналов и слотов представляет собой типизированную и управляемую альтернативу обратным вызовам.

Локализация. С учетом масштабов глобальной паутины одно из важнейших свойств сайта это интернационализация и локализация. Wt обеспечивает поддержку наборов ресурсов сообщений. Объект WMessage представляет фрагмент текста, который зависит от текущей локали, переводы сообщей для каждого языка хранятся в XML формате. При изменении локали используется WApplication::SetLocale() при этом приложение автоматически обновит соответствующие виджеты с локализованным текстом.

Время жизни сессии. Wt использует подтверждающий активность протокол между клиентом и сервером для определения активности сессии. Пока веб-страница отображается в браузере пользователя, сессия продолжает оставаться активной, в противном случае сессия завершается. Кроме того приложение может выполнить завершение до конца сессии, вызвав WApplication::quit(). В любом случае, когда сессия завершается, корневой виджет будет уничтожен, что позволяет приложению освободить любые ранее выделенные ресурсы.

Как это работает. Wt реализует две основные задачи:
  • рендеринг и управление деревом HTML DOM в браузере;
  • обработка событий, таких как ввод данных или щелчки мыши.
Все события, которые могут быть захвачены для обработки отображаются на сигналы соответствующих виджетов. Когда происходит событие (например, нажатие кнопки "Ok"), браузер связывает целевой объект и соответствующий сигнал (например, OkButton->clicked) передавая данные на сервер (с использованием AJAX или же формы HTML). На сервере соответствующий экземпляр приложения Wt обрабатывает полученные данные для изменения дерева виджетов. Далее, события распространяются путем проецирования сигнала целевого объекта на все связанные слоты. При этом они могут выполнять бизнес-логику приложения, а так же модификацию дерева виджетов. Все изменения дерева виджетов отслеживаются библиотекой Wt и преобразовываются в изменения серверной модели HTML DOM. Наконец, в зависимости от метода установки связи, данные передаются обратно в браузер.