Введение в Spring Roo: Часть 6. Разработка приложений Spring MVC и GWT при помощи Spring Roo 1.2 и их развертывание в Cloud Foundry

Быстрая разработка и развертывание приложений Spring MVC и GWT

Со времени выхода версии 1.2 Spring Roo была существенно усовершенствована. В данной статье рассматриваются новые возможности текущей версии, такие как мультимодульный проект, поддержка MongoDB, поддержка JSF и многие другие. Затем мы разработаем при помощи Spring Roo мультимодульное GWT-приложение и развернем его в Cloud Foundry.

Шекхар Гулати, старший консультант, Xebia

Шекхар Гулати (Shekhar Gulati) работает Java-консультантом в Xebia India. Более шести лет он занимается корпоративными Java-приложениями. Имеет обширный опыт работы со Spring-проектами, такими как Spring, Spring-WS и Spring Roo. В сферу его интересов входят Spring, базы данных NoSQL, Hadoop, RAD-среды (такие как Spring Roo), облачные вычисления (в основном PaaS-сервисы, такие как Google App Engine, CloudFoundry, OpenShift). Является активным автором статей для JavaLobby, Developer.com, IBM developerWorks и своего собственного блога http://whyjava.wordpress.com/. Связаться с ним можно в Твиттере (@ http://twitter.com/#!/shekhargulati).



12.03.2013

Возможности Spring Release 3.1

Дополнительная информация о Spring Release 3.1, самой последней и наиболее мощной версии среды Spring:

В частях 1 и 2 данной серии мы разработали при помощи Spring Roo 1.1 приложение conference. В частях 3 и 5 мы разработали дополнения Spring Roo. В части 4 мы рассмотрели интеграцию Cloud Foundry и Spring Roo. После части 2 мы не обсуждали новые возможности и изменения, появившиеся в Spring Roo за последний год. Многие команды, которые работали в предыдущих версиях, больше не работают или устарели. Другим важным аспектом текущей версии является использование Spring Release 3.1, самой последней и наиболее мощной версии среды Spring, предоставляющей такие возможности как аннотация Profile, абстракция Environment, абстракция Cache и многие другие. Работать с текущей версией Spring Roo – значит использовать самую последнюю версию среды Spring. ВВ статье мы кратко рассмотрим самую последнюю версию Spring Roo (это версия 1.2.1), а затем создадим мультимодульное приложение на основе GWT (Google Web Toolkit) и MVC (Spring Web Model–View–Controller), которое развернем в Cloud Foundry.

Введение в Spring Roo 1.2

Дополнительные возможности Spring Roo

Spring Roo – это инструмент с интерфейсом командной строки для быстрой разработки Spring-приложений. За последний год основные версии 1.1.5 и 1.2 значительно продвинули Spring Roo вперед, сделав ее более мощной и удобной для корпоративных разработчиков. Эти версии характеризуются следующими основными возможностями и отличиями:

  1. Поддержка MongoDB. В предыдущих версиях приложениям Spring Roo были нужны системы управления реляционными базами данных на стороне сервера (такие как MySQL или PostgreSQL), за исключением Google App Engine BigTable (но это хранилище не поддерживает отношения). Начиная с версии 1.2, в качестве хранилища данных можно использовать MongoDB. MongoDB – это популярное NoSQL-хранилище документов. Возможность создавать MongoDB-приложения в Spring демонстрирует расширяемую природу Spring Roo. Чтобы увидеть все связанные с MongoDB команды, введите:
    help --command mongo
  2. Поддержка JavaServer Faces (JSF) 2.0. До версии 1.2 Spring Roo по умолчанию поддерживала только GWT и Spring MVC; начиная с версии 1.2 Spring Roo также поддерживает JSF 2.0 в качестве одной из опций представления. В настоящее время Spring Roo поддерживает JSF-реализации Apache MyFaces и Oracle Mojarra, а также PrimeFaces в качестве библиотеки компонентов. Эта одна из самых популярных в JIRA задач была решена в версии 1.2. Чтобы увидеть все команды, доступные в JSF, введите:
    roo> help --command "web jsf" 
    * web jsf all - Create JSF managed beans for all entities  
    * web jsf media - Add a cross-browser generic player to embed multimedia content  
    * web jsf scaffold - Create JSF managed bean for an entity  
    * web jsf setup - Set up JSF environment

    В статье не рассматривается разработка приложений JSF 2.0; возможно, она будет рассмотрена в следующих статьях. Разработчики JSF-приложений могут поработать с приложением bikeshop.roo, предоставляемым вместе со Spring Roo. В дистрибутиве Roo есть папка с примерами.

  3. Поддержка мультимодульных Maven-проектов. На сегодня это одна из наиболее популярных в сообществе функциональных возможностей. До версии 1.2 весь код приложения нужно было писать в одном Maven-проекте. Это тормозило создание корпоративных приложений, которые обычно имеют различные подмодули для различных аспектов, таких как Web, персистентность, сервис и т.д. Теперь родительский проект может определять различные подмодули для персистентности, сервиса и Web. Далее в статье будет подробно описано создание мультимодульного Maven-проекта при помощи Spring Roo.
  4. Поддержка уровня репозитория и сервиса. До версии 1.2 в Spring Roo отсутствовала поддержка уровня сервиса или репозитория (или DAO). По умолчанию поддерживался шаблон Active Record, который обеспечивал многообразие классов логических объектов с методами, имеющими отношение к персистентности. На сегодня это одна из наиболее популярных в сообществе функциональных возможностей. По умолчанию Spring Roo по-прежнему поддерживает Active Record как стратегию реализации, но можно также выбрать репозиторий, создав логический объект с –activeRecord, установленным в false. Это будет подробно описано далее.
  5. Более надежная и мощная поддержка реверсивного проектирования баз данных. Хотя мы рассмотрели это дополнение в части 2, по сравнению с прошлым годом оно было кардинально усовершенствовано. Вот некоторые из улучшений: поддержка мультисхем, возможность подключения DBRE к базе данных посредством Java Naming and Directory Interface (JNDI), представления реверсивного проектирования и поддержка репозиториев вместо логических объектов Active Record. Кроме того, было исправлено много ошибок. Реверсивное проектирование баз данных в этой статье не рассматривается. Более подробная информация содержится в документации по Spring Roo (см. раздел Ресурсы).
  6. Усовершенствованный API дополнений Spring Roo. Создание дополнений Spring Roo рассматривалось в части 5. В данной статье я использовал Spring Roo Version 1.2 из-за изменений в API. Некоторые классы, которые использовались до версии 1.2, больше не используются или устарели. Команда Spring Roo улучшила совместимость API с современными дополнениями Spring Roo. С обновлением ваших дополнений до версии 1.2 могут быть проблемы.
  7. Усовершенствованная поддержка GWT. В последних версиях была усовершенствована поддержка Spring Roo GWT. Прежде все делала одна единственная команда gwt setup, начиная с создания прокси и обращения к другим элементам пользовательского интерфейса. Эта команда устарела и была заменена на 10 команд, приведенных в листинге 1. Мы рассмотрим GWT ниже.
    Листинг 1. Пример справки по командам web gwt
    roo> help --command "web gwt"
    * web gwt all - Locates all entities in the project and creates GWT requests, 
         proxies, and creates the scaffold
    * web gwt gae update - Updates the GWT project to support GAE
    * web gwt proxy all - Locates all entities in the project and creates GWT proxies
    * web gwt proxy request all - Locates all entities in the project and creates GWT 
         requests and proxies
    * web gwt proxy request type - Creates a proxy and request based on 
         the specified type
    * web gwt proxy type - Creates a GWT proxy based on the specified type
    * web gwt request all - Locates all entities in the project and creates GWT requests
    * web gwt request type - Creates a GWT proxy based on the specified type
    * web gwt scaffold - Creates a GWT request, proxy and scaffold for the specified type
    * web gwt setup - Install Google Web Toolkit (GWT) into your project

Помимо вышеупомянутых возможностей и улучшений, в статье будут рассмотрены другие незначительные изменения. Начнем с создания в Spring Roo 1.2 нового приложения conference.


Начало работы со Spring Roo 1.2

Загрузите и установите следующее ПО (см. раздел Ресурсы):

  1. Пакет Java™ 6.
  2. Apache Maven 3.
  3. Spring Roo 1.2 или более новой версии.

В статье используется текущая версия Spring Roo - 1.2.1.

Создание приложения conference

Мы создадим такое же приложение conference, как то, что было создано в частях 1 и 2. Докладчик (Speaker) может представлять один или несколько докладов (Talk); при этом каждый доклад может представлять только один докладчик. На рисунке 1 приведена простая диаграмма классов. (Speaker содержит поля firstName, lastName, email, organization, birthDate, age и gender (имя, фамилия, электронная почта, организация, дата рождения возраст, пол), а Talk содержит поля title и description (название и описание).

Рисунок 1. Диаграмма классов таблиц Speaker и Talk
Рисунок 1. Диаграмма классов таблиц Speaker и Talk

Создание мультимодульного проекта

Вместо создания одного Maven-проекта мы создадим родительский проект conference с двумя подмодулями: core и view. Подмодуль core содержит все классы domain, repository и service. Подмодуль view является POM-проектом (Project Object Model), содержащим два подмодуля: MVC и GWT. Проект MVC содержит приложение Spring MVC, а проект GWT содержит приложение GWT. Приложение conference имеет два пользовательских интерфейса: один основан на Spring MVC, а второй – на GWT. На рисунке 2 показана структура проекта.

Рисунок 2. Структура Maven-проекта
Рисунок 2. Структура Maven-проектаt

Структура, показанная на рисунке 2, похожа на структуру корпоративных приложений с несколькими подмодулями. Давайте создадим это приложение при помощи Spring Roo.

  1. Откройте интерфейс командной строки вашей операционной системы.
  2. Создайте каталог под названием conference, используя команду mkdir.
  3. В командной строке перейдите в каталог conference.
  4. Введите команду roo. Эта команда активизирует Roo Shell.
  5. Первой командой, выполняемой в Roo shell, является команда project. В версии 1.2 в эту команду была добавлена поддержка POM-проектов. POM-проекты не содержат никакого кода; они содержат только файл pom.xml. Типом пакетов данных этих проектов является POM, а не JAR или WAR. Для создания POM-проекта conference выполните следующую команду:
    project --topLevelPackage org.xebia.conference --projectName conference 
            --java 6  --packaging POM

    Эта команда похожа на команду project из части 1 (EN), но с одним изменением: она имеет еще один атрибут packaging. Атрибут packaging может принимать значения BUNDLE, JAR, POM или WAR. Для родительского проекта используется POM. Начиная с версии 1.2 команда project может принимать также атрибут с именем parent. Как следует из имени, для того, чтобы POM-проект унаследовал функциональность из другого POM, нужно использовать атрибут parent. Это будет продемонстрировано при создании подмодуля. Просмотрите файл pom.xml, сгенерированный этой командой, и убедитесь, что pom.xml упакован в формате POM.

  6. После создания POM-проекта conference создайте подмодули core и view, используя команду module. Команда module аналогична команде project, но она создает Maven-модули, а не Maven-проекты. Для создания модуля core выполните следующую команду:
    module create --moduleName core --topLevelPackage org.xebia.conference.core 
         --parent org.xebia.conference:conference:0.1.0.BUILD-SNAPSHOT

    Команда module create имеет два обязательных атрибута: moduleName и topLevelPackage. Атрибут moduleName используется для указания имени модуля, а topLevelPackage – для указания имени пакета модуля. topLevelPackage также служит идентификатором groupId этого модуля. Кроме этих обязательных атрибутов, есть три необязательных:

    • –-java для указания версии Java.
    • --packaging для указания упаковки Maven-модуля.
    • --parent для указания наследования этим модулем какого-то другого Maven-проекта.

    В приведенной выше команде модуль core наследует функциональность проекта conference. Атрибут parent принимает значение вида groupId:artifactId:version. Эти значения могут быть получены из файла conference/pom.xml. В файле pom.xml модуля core есть тег parent (см. листинг 2).

    Листинг 2. Раздел parent файла pom.xml
       <parent> 
            <groupId>org.xebia.conference</groupId> 
            <artifactId>conference</artifactId> 
            <version>0.1.0.BUILD-SNAPSHOT</version> 
        </parent>

    Можете взглянуть на pom.xml родительского проекта, т.е. conference/pom.xml, и убедиться в том, что тег module содержит модуль core (см. листинг 3).
    Листинг 3. Раздел module файла pom.xml
    <modules> 
       <module>core</module> 
    </modules>
  7. Создадим подмодуль view. Однако перед его созданием давайте вернемся к корневому (root) проекту, используя команду module focus:
    module focus --moduleName ~

    Тильда (~) указывает корневой проект. Если хотите, введите имя Maven-проекта или Maven-модуля. Например, следующая команда аналогична по результатам (переключаемся на проект core):

    module focus --moduleName core
  8. Теперь создадим модуль view. Этот модуль тоже будет POM-проектом с двумя подмодулями: MVC и GWT. Для создания модуля view выполните команду:
    module create --moduleName view --topLevelPackage org.xebia.conference.view 
         --packaging POM --java 6
  9. Для создания подмодулей GWT и MVC выполните команды, приведенные в листинге 4.
    Листинг 4. Создание GWT и MVC
    module create --moduleName gwt --topLevelPackage org.xebia.conference.view.gwt 
       --java 6 --parent org.xebia.conference.view:view:0.1.0.BUILD-SNAPSHOT 
    
    module focus --moduleName view 
    
    module create --moduleName mvc --topLevelPackage org.xebia.conference.view.mvc
       --java 6 --parent org.xebia.conference.view:view:0.1.0.BUILD-SNAPSHOT

В результате рассмотренных выше девяти шагов создается мультимодульный проект с четырьмя подмодулями: core, view, GWT и MVC. GWT и MVC – это подмодули подмодуля view. Теперь запустите команду perform package в Roo shell, которая выполнит компоновку всех подмодулей.

Добавление персистентности

После создания структуры Maven-модуля можно добавить поддержку персистентности. Используйте команду Java Persistence API (JPA) setup для установки конфигурации с поддержкой персистентности. Команда persistence setup устарела, поэтому использовать ее не рекомендуется. Эта команда устарела потому, что Spring Roo теперь поддерживает различные типы персистентных хранилищ данных (например, реляционные СУБД) и хранилищ документов (например, MongoDB). Команда persistence setup использует обобщенное имя, поэтому, если в дальнейшем в Spring Roo будет добавлена поддержка каких-либо других NoSQL-баз данных (например, Cassandra), нужно будет добавлять и команду Cassandra setup. Для добавления персистентности в приложение введите команду, приведенную в листинге 5. Это делается в модуле core, поэтому сначала переключитесь в модуль core, используя команду module focus.

Листинг 5. Команда для добавления поддержки персистентности
module focus --moduleName core 
jpa setup --database DERBY_EMBEDDED --provider HIBERNATE

Теперь Spring Roo поддерживает пятнадцать баз данных, среди которых скорее всего будет и ваша. Команда JPA setup, как и команда persistence setup, имеет два обязательных атрибута: database и provider, который является JPA-поставщиком, похожим на Hibernate или Datanucleus в случае Google App Engine. Остальные атрибуты аналогичны команде persistence, поэтому мы не будем их обсуждать.

Очистка Roo Shell

Возможно, вы уже пробовали очистить Roo shell при помощи команд clear или cls. Для запуска команд операционной системы нужно ввести ! <команда ОС>. Для очистки введите команду:

core roo> ! clear

Создание логических объектов Speaker и Talk

Команда hint предложит создать логический объект. Команда entity была заменена на entity JPA, чтобы отличать JPA-объекты от MongoDB-объектов, которые создает команда entity mongo. Еще одним важным изменением в команде entity является выбор наличия объектов Active Record. В данной статье мы будем использовать Repositories вместо логических объектов Active Record. Для создания Speaker и Talk выполните команды, приведенные в листинге 6.

Листинг 6. Создание логических объектов
entity jpa --class ~.domain.Speaker --testAutomatically 
     --activeRecord false --serializable 
entity jpa --class ~.domain.Talk --testAutomatically 
     --activeRecord false –serializable

Листинг 6 явно указывает Roo не генерировать объекты activeRecord. Механизмом по умолчанию все еще является activeRecord, поэтому необходимо указывать activeRecord false, иначе будут генерироваться объекты Active Record.

Добавление полей к логическим объектам

Команда field осталась такой же, и ее синтаксис не изменился. Выполните команды, приведенные в листинге 7, для добавления классов логических объектов.

Листинг 7. Добавление полей в классы
field string --fieldName firstname --class ~.domain.Speaker --notNull 
field string --fieldName lastname --notNull 
field string --fieldName email --class ~.domain.Speaker --unique --notNull --regexp 
     ^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})
field string --fieldName organization 
field date --fieldName birthdate --type java.util.Date --past --notNull 
field number --type java.lang.Long --fieldName age --min 25 --max 60 
field date --fieldName created --type java.util.Date --notNull 
field string --fieldName title --class ~.domain.Talk --notNull 
field string --fieldName description --notNull --sizeMax 4000 
field date --fieldName created --type java.util.Date --notNull 
field set --fieldName talks --type ~.domain.Talk --class ~.domain.Speaker 
     --cardinality ONE_TO_MANY 
field reference --fieldName speaker --type ~.domain.Speaker --class ~.domain.Talk 
     --notNull

Обратите внимание на использование регулярных выражений (regexp) в email, по которым будет проверяться корректность адреса электронной почты. Также отметим, что создается имя поля. Поля с именами, созданными type date, не обновляются. YouThis – это небольшое, но полезное улучшение. В листинге 8 приведен фрагмент кода, демонстрирующий, что атрибут updatable в аннотации column установлен в значение false.

Листинг 8. Пример установки значения updatable в false
@NotNull 
@Column(updatable = false) 
@Temporal(TemporalType.TIMESTAMP) 
@DateTimeFormat(style = "M-") 
private Date created = new Date();

Добавление уровней репозитория и сервиса

Дополнительная информация по Spring JPA и Spring Data

Сообщество Spring Roo затребовало альтернативу шаблону ActiveRecord, поскольку в корпоративных приложениях используются уровни репозитория и сервиса и разработчикам удобнее работать с ними. Spring Roo 1.2 позволяет иметь репозитории, использующие проект Spring JPA. Spring JPA – это часть зонтичного проекта Spring Data, упрощающего реализацию JPA-репозиториев. Spring Roo использует репозитории Spring JPA, требующие написания интерфейсов, реализацию которых обеспечивает Spring JPA. Он также поддерживает добавление специализированного метода finder к базовым CRUD-операциям. Метод finder в вашем интерфейсе репозитория можно определить следующим образом:

List<Person> findPersonByNameAndCountry(String name, String country)

Spring JPA обеспечивает реализацию этого метода, разбивая его имя, и возвращает список всех Person с указанными свойствами name и country. Это уменьшает размер кода, но имя метода обязательно должно согласовываться со свойствами логических объектов. Если класс Person не имеет свойств name или country, метод завершится с ошибкой. В данной статье проект Spring Data JPA не рассматривается, но мы рекомендуем прочесть соответствующую документацию.

Чтобы добавить интерфейсы Repository для объектов Speaker и Talk, выполните команды, приведенные в листинге 9.

Листинг 9. Добавление интерфейсов Repository
repository jpa --interface ~.repository.SpeakerRepository --entity ~.domain.Speaker 
repository jpa --interface ~.repository.TalkRepository --entity ~.domain.Talk

Команда repository jpa имеет два атрибута: название интерфейса и логический объект, для которого создается репозиторий. В нашем случае указано создание SpeakerRepository в пакете com.xebia.conference.core.repository для объекта Speaker. То же самое относится и к объекту Talk. Выходные данные команды (см. листинг 10) показывают, что в pom.xml была добавлена зависимость spring-data-jpa, а также были созданы интерфейс SpeakerRepository.java и соответствующий ITD-файл SpeakerRepository_Roo_Jpa_Repository.aj.

Листинг 10. Пример выходных данных
Created core|SRC_MAIN_JAVA/org/xebia/conference/core/repository 
Created core|SRC_MAIN_JAVA/org/xebia/conference/core/repository/SpeakerRepository.java 
Created core|SPRING_CONFIG_ROOT/applicationContext-jpa.xml 
Updated core|ROOT/pom.xml 
             [added dependency org.springframework.data:spring-data-jpa:1.0.2.RELEASE] 
Created core|SRC_MAIN_JAVA/org/xebia/conference/core/repository/
                                       SpeakerRepository_Roo_Jpa_Repository.aj
Created core|SRC_TEST_JAVA/org/xebia/conference/core/domain/
                                       SpeakerDataOnDemand_Roo_DataOnDemand.aj 
Created core|SRC_TEST_JAVA/org/xebia/conference/core/domain/
                                       SpeakerIntegrationTest_Roo_IntegrationTest.aj

Самым интересным артефактом, сгенерированным командой repository jpa, является ITD-файл *Repository_Roo_Jpa_Repository.aj. ITD-файл (inter-type declaration) содержит три объявления (см. листинг 11).

Листинг 11. Объявления в ITD-файле
privileged aspect SpeakerRepository_Roo_Jpa_Repository { 

 declare parents: SpeakerRepository extends JpaRepository<Speaker, Long>; //1
    
 declare parents: SpeakerRepository extends JpaSpecificationExecutor<Speaker> ; //2
    
 declare @type: SpeakerRepository: @Repository; //3
    
}

Первая строка говорит, что интерфейс SpeakerRepository должен расширять интерфейс JpaRepository. Интерфейс JpaRepository содержит объявления для всех CRUD-методов и других общих методов. Вторая строка говорит, что интерфейс SpeakerRepository должен расширять интерфейс JpaSpecificationExecutor. Этот интерфейс обеспечивает выполнение Specifications на основе JPA Criteria API. Третья и последняя строка гарантирует, что интерфейс SpeakerRepository будет иметь аннотацию @Repository.

Добавление уровней сервиса

Хотя при использовании Repositories не обязательно иметь уровень сервиса, в большинстве сценариев есть смысл использовать его для всей бизнес-логики. Вы обнаружите потребность в классе service по мере перехода от сгенерированного Roo CRUD-приложения, поэтому желательно иметь класс service для классов логических объектов. Чтобы создать сервисы для Speaker и Talk в Roo shell, выполните команды, приведенные в листинге 12:

Листинг 12. Создание сервисов
service --interface ~.service.SpeakerService --entity ~.domain.Speaker 
service --interface ~.service.TalkService --entity ~.domain.Talk

Команда service для SpeakerService генерирует информацию, представленную в листинге 13.

Листинг 13. Результаты работы SpeakerService
Created core|SRC_MAIN_JAVA/org/xebia/conference/core/service 
Created core|SRC_MAIN_JAVA/org/xebia/conference/core/service/SpeakerService.java
Created core|SRC_MAIN_JAVA/org/xebia/conference/core/service/SpeakerServiceImpl.java
Created core|SRC_MAIN_JAVA/org/xebia/conference/core/service/
                                       SpeakerService_Roo_Service.aj
Updated core|SRC_TEST_JAVA/org/xebia/conference/core/domain/
                                       SpeakerDataOnDemand_Roo_DataOnDemand.aj
Updated core|SRC_TEST_JAVA/org/xebia/conference/core/domain/
                                       SpeakerIntegrationTest_Roo_IntegrationTest.aj
Created core|SRC_MAIN_JAVA/org/xebia/conference/core/service/
                                       SpeakerServiceImpl_Roo_Service.aj

Помимо создания папки service и изменения тестовых классов были созданы SpeakerService, реализация SpeakerServiceImpl и два ITD-файла: SpeakerService_Roo_Service.aj и SpeakerServiceImpl_Roo_Service.aj. SpeakerService_Roo_Service.aj – это ITD-файл для интерфейса SpeakerService, который должен содержать все необходимые объявления методов. SpeakerServiceImpl_Roo_Service.aj содержит методы реализации, определенные в IDT-файле SpeakerService_Roo_Service.aj, и добавляет все эти реализации в класс SpeakerServiceImpl во время компиляции.

Итак, наш модуль core имеет весь необходимый для данной статьи код. Теперь создадим пользовательские интерфейсы GWT и MVC, используя Spring Roo.

Компоновка пользовательского интерфейса GWT

Google Web Toolkit (GWT) (см. раздел Ресурсы) представляет собой инструментарий разработчика для создания сложных и функциональных JavaScript-приложений на языке программирования Java. Используя GWT, Java-разработчики легко могут писать сложные Ajax Web-приложения, так как все сводится к написанию Java-кода. Кроме того, GWT компилирует код для создания хорошо оптимизированных JavaScript-приложений.

Spring Roo предоставляет поддержку построения GWT-приложений из модели домена.

В предыдущих версиях всю работу выполняла единственная команда gwt setup (начиная с настройки GWT и заканчивая созданием представлений для логических объектов), гарантируя совместимость с Google App Engine. Теперь команда gwt setup разделена на десять разных команд, что дает разработчикам дополнительные возможности управления. Эти команды приведены в листинге 14.

Листинг 14. Справка по командам web gwt
view/gwt roo> help --command "web gwt" 
* web gwt all - Locates all entities in the project and creates GWT requests, proxies 
     and creates the scaffold 
* web gwt gae update - Updates the GWT project to support GAE 
* web gwt proxy all - Locates all entities in the project and creates GWT proxies 
* web gwt proxy request all - Locates all entities in the project and creates GWT 
     requests and proxies 
* web gwt proxy request type - Creates a proxy and request based on the specified type 
* web gwt proxy type - Creates a GWT proxy based on the specified type 
* web gwt request all - Locates all entities in the project and creates GWT requests 
* web gwt request type - Creates a GWT proxy based on the specified type 
* web gwt scaffold - Creates a GWT request, proxy and scaffold for the specified type
* web gwt setup - Install Google Web Toolkit (GWT) into your project

Чтобы создать интерфейс GWT для модели домена, необходимы две команды: web gwt setup и web gwt all. Используйте другие команды, чтобы:

  • Создать прокси, запросы или то и другое, если не генерируется пользовательский интерфейс.
  • Создать прокси, запросы или то и другое и сгенерировать пользовательский интерфейс.
  • Обновить GWT-проект для поддержки Google App Engine.

В данной статье рассматриваются только web gwt setup и web gwt all. Понимая принципы работы двух этих команд, можно легко использовать и другие команды.

Настройка GWT-проекта

Spring Roo в настоящее время следует соглашению, что все его дополнения представлений (например, GTW, MVC и JSF) имеют команду setup. Команда setup ответственна за добавление необходимых Maven-зависимостей, некоторых конфигурационных файлов, пустых классов и создание структуры папок для технологии представлений. Для настройки GWT-проекта выполните команду, приведенную в листинге 15, в котором также показаны выходные данные команды.

Листинг 15. Пример выходных данных команды web gwt setup
view/gwt roo> web gwt setup 

Created view/gwt|ROOT/src/main/webapp/WEB-INF/spring 
Created view/gwt|ROOT/src/main/webapp/WEB-INF/spring/webmvc-config.xml 
Created view/gwt|ROOT/src/main/webapp/WEB-INF/web.xml 
Updated view/gwt|ROOT/src/main/webapp/WEB-INF/spring/webmvc-config.xml 
Created view/gwt|SRC_MAIN_JAVA/org/xebia/conference/view/gwt 
Created view/gwt|SRC_MAIN_JAVA/org/xebia/conference/view/gwt/App.gwt.xml 
Created view/gwt|SRC_MAIN_JAVA/org/xebia/conference/view/gwt/client 
Created view/gwt|SRC_MAIN_JAVA/org/xebia/conference/view/gwt/client/AppEntryPoint.java 
Updated view/gwt|ROOT/src/main/webapp/WEB-INF/web.xml 
Updated view/gwt|ROOT/pom.xml 
   [added dependencies org.springframework:spring-webmvc:${spring.version}, 
   org.springframework.webflow:spring-js-resources:2.2.1.RELEASE, 
   commons-digester:commons-digester:2.1, commons-fileupload:commons-fileupload:1.2.2, 
   javax.servlet.jsp.jstl:jstl-api:1.2, org.glassfish.web:jstl-impl:1.2, 
   javax.el:el-api:1.0, joda-time:joda-time:1.6, javax.servlet.jsp:jsp-api:2.1, 
   commons-codec:commons-codec:1.5; updated project type to war; 
   added repository http://maven.springframework.org/external; 
   added dependencies com.google.gwt:gwt-servlet:2.4.0, com.google.gwt:gwt-user:2.4.0, 
   org.json:json:20090211, com.google.gwt.inject:gin:1.5.0, 
   javax.validation:validation-api:1.0.0.GA, 
   javax.validation:validation-api:1.0.0.GA:sources, xalan:xalan:2.7.1; 
   added plugin org.codehaus.mojo:gwt-maven-plugin:2.2.0; 
   added plugin org.codehaus.mojo:exec-maven-plugin:1.2]

Выходные данные команды показывают, что она создала шаблон GWT-проекта с необходимыми Maven-зависимостями и плагинами, пример класса AppEntryPoint, пример дескриптора GWT-модуля App.gwt.xml и web.xml, необходимый для всех Wweb-приложений. Команда web gwt setup не делает ничего интересного, поэтому рассмотрим команду web gwt all. Для построения пользовательского интерфейса GWT для домена выполните следующую команду:

web gwt all --proxyPackage ~.client.proxy --requestPackage ~.client.request

Команда web gwt all выполняет всю ответственную работу и создает дескриптор развертывания GWT-модуля ApplicationScaffold.gwt.xml, точку входа GWT Scaffold.java, Proxy-классы SpeakerProxy и TalkProxy, различные классы Activity для логических объектов Speaker и Talk, классы RequestFactory для Speaker и Talk и различные классы Place.

Для настройки журналирования log4j для GWT-проекта выполните команду:

logging setup --level INFO

Для выхода из Roo shell введите команду q или quit. Эти команды создадут полнофункциональное интерфейсное GWT-приложение conference.

Для запуска этого приложения в командной строке перейдите в каталог gwt и введите команду mvn gwt:run (которая запустит сервер jetty и режим разработки GWT). Для открытия приложения в браузере по умолчанию выберите Launch Default Browser или скопируйте URL в буфер обмена, чтобы открыть приложение в другом браузере.

Адрес приложения: http://127.0.0.1:8888/ApplicationScaffold.html?gwt.codesvr=127.0.0.1:9997. Должен отобразиться экран, показанный на рисунке 3. Выберите Talks или Speaker для просмотра всех talk и speaker.

Рисунок 3. Выполнение GWT-приложения
Рисунок 3. Выполнение GWT-приложения

Создание пользовательского интерфейса Spring MVC

В данном разделе кратко рассматривается создание Spring MVC Web-представления для модели домена, созданной в данной статье. Команда controller all, упоминаемая в части 1 (EN), устарела и не рекомендуется к применению. Перед использованием новых команд выполните focus на mvc-модуль. В Roo shell выполните следующую команду:

module focus --moduleName view/mvc

Новая команда Spring Roo setup выполняет всю настройку, связанную с установкой приложений Spring MVC. Теперь у нас есть контроллер для построения системы контролеров или просто для выполнения настройки. Для настройки Spring MVC в приложении выполните команду:

view/mvc roo> web mvc setup

Выходные данные этой команды показывают, что она выполнила настройку, связанную с добавлением файла контекста Spring webmvc-config.xml, добавила Maven-зависимости, файлы статических ресурсов и библиотеку тегов Spring Roo. Команда не создала представления для логических объектов. Это удобно для тех, кому не нужны представление для своих логических объектов. Вы можете вручную создавать контроллеры и предоставлять RESTful Web-сервисы.

После завершения базовой настройки приложения conference приступим к созданию контролеров и представлений для логических объектов. Выполните следующую команду:

view/mvc roo> web mvc all --package ~.web

Команда web mvc all создаст контролеры и jspx-представления для всех логических объектов. Для генерирования одного логического объекта используйте команду web mvc scaffold, передав в нее имя объекта и полностью определенное имя контроллера. В листинге 16 приведены многие другие команды web mvc. Мы рассматриваем не все команды, потому что некоторые из них были рассмотрены в части 2 (EN) данной серии статей.

Листинг 16. Справка по командам web mvc
view/mvc roo> help --command "web mvc" 
* web mvc all - Scaffold Spring MVC controllers for all project entities 
     without an existing controller 
     * web mvc controller - Create a new manual Controller (where you write the methods)
* web mvc embed document - Embed a document for your WEB MVC application 
* web mvc embed generic - Embed media by URL into your WEB MVC application 
* web mvc embed map - Embed a map for your WEB MVC application 
* web mvc embed photos - Embed a photo gallery for your WEB MVC application 
* web mvc embed stream video - Embed a video stream into your WEB MVC application 
* web mvc embed twitter - Embed twitter messages into your WEB MVC application 
* web mvc embed video - Embed a video for your WEB MVC application 
* web mvc embed wave - Embed Google wave integration for your WEB MVC application 
* web mvc finder add - Adds @RooWebFinder annotation to MVC controller type 
* web mvc finder all - Adds @RooWebFinder annotation to existing MVC controllers 
* web mvc install language - Install new internationalization bundle for MVC 
     scaffolded UI.
* web mvc install view - Create a new static view. 
* web mvc json add - Adds @RooJson annotation to target type 
* web mvc json all - Adds or creates MVC controllers annotated with @RooWebJson 
     annotation 
* web mvc json setup - Set up Spring MVC to support JSON 
* web mvc language - Install new internationalization bundle for MVC scaffolded UI. 
* web mvc scaffold - Create a new scaffold Controller (that is where Roo maintains CRUD 
     functionality automatically) 
* web mvc setup - Setup a basic project structure for a Spring MVC / JSP application 
* web mvc update tags - Replace an existing application tagx library with the latest 
     version (use --backup option to backup your application first) 
* web mvc view - Create a new static view.

Развертывание в Cloud Foundry

После создания приложения conference можно приступить к его развертыванию. Spring-приложения развертываются в открытом облаке Cloud Foundry без каких-либо модификаций. В части 4 данной серии статей подробно рассматривались среда Cloud Foundry и процесс развертывания приложений Spring Roo из Roo shell с использованием дополнения Spring Roo Cloud Foundry. Однако в версии 1.2.1 эта поддержка, по-видимому, отсутствует. Поэтому в данной статье для развертывания приложения conference в Cloud Foundry мы будем использовать vmc ruby gem. Выполните следующие действия:

  1. Установите vmc-клиент. Ссылка на пошаговое учебное руководство "Установка интерфейса командной строки (vmc)" приведена в разделе Ресурсы.
  2. Войдите в открытое облако Cloud Foundry, используя свои учетные данные. Выполните команду vmc login. Появится запрос адреса электронной почты и пароля (см. листинг 17).
    Листинг 17. Пример входа в vmc
    shekhar@shekhar:~/dev/conference/view/mvc/target$ vmc login 
    Attempting login to [http://api.cloudfoundry.com] 
    Email: shekhargulati84@gmail.com 
    Password: ************* 
    Successfully logged into [http://api.cloudfoundry.com]
  3. После установки vmc-клиента выполните полную Maven-компоновку приложения conference. Для этого выполните команду:
    mvn clean install
  4. После создания проекта поместите приложение conference в Cloud Foundry. В данной статье мы поместим в облако два приложения: одно для Spring MVC, а второе для GWT. Чтобы поместить в облако Spring MVC-приложение conference перейдите в папку conference/view/mvc/target и выполните команду vmc push (см. листинг 18).
    Листинг 18. Пример размещения Spring MVC-приложения в облаке
    shekhar@shekhar:~/dev/conference/view/mvc/target$ vmc push  
    Would you like to deploy from the current directory? [Yn]: Y 
    Application Name: mvcconference  
    Application Deployed URL [mvcconference.cloudfoundry.com]:  
    Detected a Java SpringSource Spring Application, is this correct? [Yn]: Y  
    Memory Reservation (64M, 128M, 256M, 512M, 1G) [512M]:  
    Creating Application: OK  
    Would you like to bind any services to 'mvcconference'? [yN]: N  
    Uploading Application:  
    Checking for available resources: OK  
    Processing resources: OK  
    Packing application: OK  
    Uploading (91K): OK  
    Push Status: OK  
    Staging Application: OK  
    Starting Application: OK

    VMC-клиент Cloud Foundry будет задавать вопросы об имени приложения, типе приложения, URL-адресе для развертывания, распределении памяти и связывании каких-либо сервисов, а затем загрузит и развернет приложение в Cloud Foundry. За работой Spring MVC-приложения можно наблюдать по адресу http://mvcconference.cloudfoundry.com/.

  5. Поместите GWT-приложение в Cloud Foundry. Перейдите в папку conference/view/gwt/target и выполните команду vmc push (см. листинг 19).
Листинг 19. Пример размещения GWT-приложения в облаке
shekhar@shekhar:~/dev/conference/view/gwt/target$ vmc push 
Would you like to deploy from the current directory? [Yn]: Y 
Application Name: gwtconference 
Application Deployed URL [gwtconference.cloudfoundry.com]: 
Detected a Java SpringSource Spring Application, is this correct? [Yn]: Y 
Memory Reservation (64M, 128M, 256M, 512M) [512M]: 
Creating Application: OK 
Would you like to bind any services to 'gwtconference'? [yN]: N 
Uploading Application: 
  Checking for available resources: OK 
  Processing resources: OK 
  Packing application: OK 
  Uploading (5M): OK   
Push Status: OK 
Staging Application: OK                                                         
Starting Application: OK

За работой приложения можно наблюдать по адресу: http://gwtconference.cloudfoundry.com/.

Загрузите исходный код приложения conference.


Заключение

В статье был повторно рассмотрен продукт Spring Roo. Вы познакомились с новыми возможностями, такими как мультимодульные Maven-проекты, уровни репозитория и сервиса, добавленные в Spring Roo 1.2, а затем создали приложение, используя Roo 1.2 и некоторые новые функциональные возможности. Вы также рассмотрели использование Spring Roo для создания GWT-приложений. Наконец, вы развернули Spring MVC- и GWT-приложение в Cloud Foundry. Некоторые новые возможности, такие как поддержка JSF и MongoDB, в данной статье не рассматривались.

В части 7 (EN) данной серии статей мы обсудим создание Spring MongoDB-приложений при помощи Spring Roo и их развертывание в Cloud Foundry.


Загрузка

ОписаниеИмяРазмер
Пример кодаconference.zip340 КБ

Ресурсы

Научиться

Получить продукты и технологии

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source, Технология Java
ArticleID=861177
ArticleTitle=Введение в Spring Roo: Часть 6. Разработка приложений Spring MVC и GWT при помощи Spring Roo 1.2 и их развертывание в Cloud Foundry
publish-date=03122013