Статьи

Основная структура и компоненты проекта GWT

[img_assist | нидь = 3421 | название = | убывание = | ссылка = URL | URL = HTTP: //www.manning.com/affiliate/idevaffiliate.php идентификатор | ALIGN = влево | ширина = 208 | Высота = 388] Ядром каждого проекта GWT является макет проекта и необходимые базовые компоненты — страницы хоста, точки входа и модули. Чтобы начать проект GWT, вам нужно создать макет по умолчанию и сгенерировать исходные файлы. Самый простой способ сделать это — использовать предоставленный ApplicationCreatorинструмент.

Генерация проекта

ApplicationCreator предоставляется GWT для создания начальных точек и макета по умолчанию для проекта GWT. ApplicationCreator, как и оболочка GWT, поддерживает несколько параметров командной строки, которые перечислены в таблице 1.

ApplicationCreator [-eclipse projectName] [-out dir] [-overwrite] [-ignore] className

Таблица 1 Параметры командной строки ApplicationCreator

параметр Описание
-затмение Создает конфигурацию запуска отладки для названного проекта eclipse
-вне Каталог, в который будут записаны выходные файлы (по умолчанию используется текущий каталог)
-overwrite Перезаписывает любые существующие файлы
-ignore Игнорирует любые существующие файлы; не переписывает
имя класса Полное имя класса приложения, который будет создан

Чтобы заглушить пример проекта калькулятора, мы будем использовать ApplicationCreator, основанный на относительном пути GWT_HOME, и className com.manning.gwtip.calculator.client.Calculator следующим образом:

mkdir [PROJECT_HOME]
cd [PROJECT_HOME]
[GWT_HOME]/applicationCreator com.manning.gwtip.calculator.client.Calculator

GWT_HOME

Рекомендуется установить GWT_HOME в качестве переменной среды, ссылающейся на расположение файловой системы, в которой вы распаковали GWT. Кроме того, вы можете добавить GWT_HOME в PATH для дальнейшего удобства. Мы используем GWT_HOME, когда ссылаемся на местоположение, где установлен GWT, и PROJECT_HOME, чтобы ссылаться на местоположение текущего проекта.

ПУТЬ СЕПАРАТОРЫ

Для удобства при обращении к путям файловой системы мы будем использовать прямые косые черты, которые работают для двух третей поддерживаемых платформ GWT. Если вы используете Windows, пожалуйста, настройте разделители пути, чтобы использовать обратную косую черту. Запуск ApplicationCreator, как описано, создает структуру каталогов src по умолчанию и исходные файловые ресурсы GWT.

Стандартная структура каталогов

Несмотря на то, что это довольно просто, компоновка GWT очень важна, потому что инструментарий может работать в соответствии с подходом проектирования Convention over Configuration. Как мы увидим, некоторые части процесса компиляции GWT делают предположения о макете по умолчанию. Из-за этого не все должны быть явно определены в каждом случае (что сокращает количество требуемой конфигурации). Взглянув на результаты выполнения скрипта ApplicationCreator, вы увидите конкретную структуру и соответствующее содержимое, как показано в листинге 1. Это представляет конфигурацию по умолчанию для проекта GWT.

Вывод ApplicationCreator в листинге 1, показывающий структуру проекта GWT по умолчанию:

src
src/com
src/com/manning
src/com/manning/gwtip
src/com/manning/gwtip/calculator
src/com/manning/gwtip/calculator/Calculator.gwt.xml
src/com/manning/gwtip/calculator/client
src/com/manning/gwtip/calculator/client/Calculator.java
src/com/manning/gwtip/calculator/public
src/com/manning/gwtip/calculator/public/Calculator.html
Calculator-shell.sh
Calculator-compile.sh

Имя пакета, com.manning.gwtip.calculator, представлено в структуре как ряд подкаталогов в дереве src. Это стандартное соглашение Java, и в нем есть отдельные клиентские и публичные подкаталоги.

Каталог клиента предназначен для ресурсов, которые будут скомпилированы в JavaScript. Клиентские элементы являются переводимыми или сериализуемыми и в конечном итоге будут загружены в клиентский браузер — это ресурсы Java в источнике. Клиентский пакет известен в терминологии GWT как исходный путь.

Публичный каталог обозначает файлы, которые также будут переданы клиенту, но не требуют компиляции и перевода на JavaScript. Обычно это включает CSS, изображения, статический HTML и любые другие подобные ресурсы, которые не должны переводиться, включая существующий JavaScript. Публичный пакет известен как публичный путь.

Обратите внимание, что в нашем примере на стороне клиента не используются никакие ресурсы сервера, но GWT включает в себя концепцию пути / пакета сервера для ресурсов на стороне сервера.

На рисунке 1 показана схема проекта GWT по умолчанию.

[Img_assist | NID = 4037 | название = | убывание = | ссылка = нет | Align = нет | ширина = 293 | высота = 284]

ApplicationCreator генерирует структуру и необходимый набор минимальных файлов для проекта GWT. Сгенерированные файлы включают определение модуля конфигурации XML, класс Java точки входа и страницу хоста HTML. Вот некоторые из основных концепций проекта GWT.

Наряду с определением модуля, точкой входа и страницей хоста были также созданы некоторые сценарии быстрого доступа для использования с инструментами GWTShell и GWTCompiler. Эти сценарии запускают оболочку и компилятор для проекта. В таблице 2 перечислены все файлы, созданные ApplicationCreator: основные ресурсы и ярлыки быстрого доступа, необходимые для проекта GWT.

Таблица 2. Сгенерированные ApplicationCreator исходные файлы проекта, которые служат отправной точкой для приложений GWT

файл имя Цель
Файл модуля GWT ProjectName.gwt.xml Определяет конфигурацию проекта
Класс точки входа ProjectName.java Начальный класс, вызываемый модулем
Домашняя страница ProjectName.html Начальная HTML-страница, которая загружает модуль
GWTShell скрипт быстрого вызова ProjectName-shell.sh Вызывает GWTShell для проекта
GWTCompiler скрипт быстрого вызова invoker ProjectName-compile.sh Вызывает GWTCompiler для проекта

Начальные точки ApplicationCreator обеспечивает практически все подвижные части для вас и заглушает ваш проект. Вы берете его оттуда и изменяете эти сгенерированные файлы, чтобы начать создание приложения GWT. Если бы инструментарий не предоставлял эти файлы через ApplicationCreator, запуск проекта, по крайней мере на начальном этапе, был бы намного более трудоемким и запутанным. Если у вас есть опыт работы с GWT, вы можете использовать другие инструменты для запуска проекта: плагин IDE, «архетип» Maven или ваши собственные сценарии. ApplicationCreator, тем не менее, является полезным по умолчанию. Содержимое и структура, предоставляемые ApplicationCreator, сами по себе являются работающим примером GWT «hello world». Вы получаете «привет мир» бесплатно, из коробки.

«Привет мир», однако, не так интересно. Соединение всех движущихся частей — это то, что действительно важно; как страница хоста включает в себя модуль, как модуль описывает ресурсы проекта и как точка входа вызывает код проекта. Эти концепции применимы ко всем уровням проектов GWT — от базовых и выше. Понимание этих частей является ключом к общему пониманию GWT. Далее мы подробнее рассмотрим каждую из этих концепций, начиная со страницы хоста.

Страницы хоста

Хост-страница — это исходная HTML-страница, которая вызывает приложение GWT. Страница хоста содержит тег script, который ссылается на специальный файл GWT JavaScript Module.nocache.js. Этот файл JavaScript, предоставляемый инструментарием при компиляции проекта, запускает процесс загрузки приложения GWT.

Наряду со ссылкой на скрипт, загружающей ресурсы проекта, вы также можете указать несколько связанных с GWT
тегов на странице хоста. Эти параметры тегов отсутствуют на странице хоста по умолчанию, созданной ApplicationCreator, но все же важно знать о них. Теги GWT
, которые поддерживаются на странице хоста, перечислены в таблице 3 в качестве ссылки.

Таблица 3 GWT- теги, поддерживаемые на страницах хоста

Метатег Синтаксис Цель
GWT: модуль <meta name = «gwt: module» content = «_ module-name _»> (Legacy, pre GWT 1.4.) Указывает загружаемый модуль
GWT: недвижимость <meta name = «gwt: property» content = «_ name _ = _ value _»> Статически определяет свойство клиента отложенного связывания
GWT: onPropertyErrorFn <meta name = «gwt: onPropertyErrorFn» content = «_ fnName _»> Задает имя функции для вызова, если для свойства клиента задано недопустимое значение (это означает, что не будет найдено соответствующей компиляции)
GWT: onLoadErrorFn <meta name = «gwt: onLoadErrorFn» content = «_ fnName _»> Задает имя функции для вызова, если исключение происходит во время начальной загрузки или если модуль выдает исключение из onModuleLoad (); функция должна принимать параметр сообщения

Таким образом, страница хоста включает ссылку на скрипт, который запускает процесс GWT и ссылается на все необходимые ресурсы проекта. Необходимые ресурсы для проекта собираются в процессе компиляции GWT и основаны на конфигурации модуля.

Модули

Приложения GWT живут в сложной среде. Это отчасти из-за сферы ответственности, которую GWT решила взять на себя, а отчасти из-за интернет-ландшафта. Будучи богатой интернет-платформой и использующей только базовую встроенную поддержку браузеров для HTML, CSS и JavaScript, GWT выглядит довольно элегантно и впечатляюще, но этой комбинации трудно достичь. Браузеры, которые «руководствуются» стандартами, но не всегда их придерживаются, усиливают давление. Соедините эту среду с подходом, направленным на привнесение статических типов, стандартов кода, профилирования и отладки, наследования и повторного использования на веб-уровень, и у вас сложная задача.

Чтобы помочь в решении этой большой задачи, GWT использует модули в качестве модулей конфигурации и исполнения, которые обрабатывают незаметные зоны ответственности. Модули позволяют компилятору GWT оптимизировать получаемый им Java-код, создавать варианты для всех возможных ситуаций из единой базы кода и делают возможной поддержку наследования и свойств.

Одним из наиболее важных ресурсов, созданных ApplicationCreator, является дескриптор модуля Module.gwt.xml для вашего проекта. Этот файл существует в каталоге верхнего уровня пакета вашего проекта и предоставляет средства для определения расположения и структуры ресурсов.

В сгенерированном по умолчанию файле модуля есть только два элемента:

и

,


элемент просто включает конфигурацию для другого названного модуля GWT в текущем определении, и

определяет класс, который запускает вещи и переходит от конфигурации к коду.
В таблице 4 представлен обзор наиболее распространенных элементов дескриптора модуля GWT.



Таблица 4 Сводка наиболее распространенных элементов, поддерживаемых дескриптором модуля GWT

Модульный элемент Описание
<Наследуется> Определяет дополнительные модули GWT, которые должны быть унаследованы в текущий модуль
<Точка входа> Указывает, какой класс EntryPoint должен вызываться при запуске проекта GWT
<Источник> Определяет, где находится исходный код, который должен быть переведен в JavaScript компилятором GWT
<Открытый> Определяет, где находятся ресурсы, которые не являются переводимым исходным кодом, например изображения и файлы CSS.
<Скрипт> Внедряет элемент скрипта в модуль GWT, обеспечивая его присутствие при наследовании
<Таблица стилей> Вставляет таблицу стилей в модуль GWT, гарантируя, что она присутствует при наследовании
<Сервлет> Определяет путь к ресурсам сервисного сервлета GWT RPC
<Определить-недвижимость> Первоначально определяет свойства
<Набор-недвижимость> Устанавливает значения свойств; например, он используется в модуле UserAgent для определения набора поддерживаемых браузеров
<Простираться-недвижимость> Определяет расширения значения свойства; часто используется для указания информации о локали
<Заменить-с> Заменяет компоненты во время выполнения на основе процесса принятия решения, например, различных реализаций для разных версий браузера.

Файл модуля калькулятора — это простой файл модуля по умолчанию, с добавлением вставленной таблицы стилей через тег <stylesheet>. Используя теги <script> или <stylesheet>, вы можете гарантировать, что эти ресурсы будут доступны вашему модулю при его развертывании. Разница между внедрением ресурсов и простым добавлением ссылки на таблицу стилей или сценария в HTML-код на странице хоста заключается в том, что модуль находится под контролем. Если вы создаете библиотеки с помощью GWT или совместно используете целые проекты, страница хоста не распространяется вместе с вашим проектом. Поэтому пользователи вашей библиотеки не будут использовать одну и ту же страницу хоста и не будут ссылаться на одну и ту же таблицу стилей. Элементы скрипта и таблицы стилей на хост-страницах работают, но они не обязательно будут присутствовать, когда другие используют ваши модули, а внедренные ресурсы есть.Модули могут приносить с собой другие ресурсы, если это необходимо.

Though the three lines of configuration in listing 1 may seem very simple, there is a bit more going on than meets the eye. GWT modules understand several default values for important properties. For example, the source path and public path locations are, by default, the client and public packages on the classpath, respectively. Because no other configuration is explicitly specified, our calculator example uses these defaults.

Modules are therefore significant on a number of fronts. In addition to setting configuration and properties, they also provide resources for projects, enable inheritance, give the compiler hints, and play a central role in the bootstrapping process. Once the bootstrap determines the correct permutation of an application, via the nocache script for a particular module, an entry point is invoked.

Entry points

An entry point class, as we have learned, is simply the first project-specific code every GWT application invokes. This is generally where the first browser-based element is accessed, and it’s typically done with the static RootPanel.get() method. The RootPanel is a default container that is inserted directly before the HTML tag. With a reference to this panel, you can then compose your project and insert other elements from there.

The entry point class of our calculator example is a default EntryPoint implementation with the template «hello world» code removed, and a new custom widget added.

With an entry point in place, our calculator project can now go from the HTTP request on the host page, through the configuration provided by the module descriptor, to additional JavaScript code (built from Java) included in the module.

This process is the same for every GWT project. Whether you are building an entire application with multiple module inheritance, or just a single widget in a single module, the bootstrap we have discussed, from configuration to code, is the same.

This article is excerpted from Chapter 1 of GWT in Practice, by Robert Cooper and Charlie Collins, and published in May 2008 by Manning Publications.