Вступление
В этой статье я покажу вам, как создать приложение MongoDB, используя новую версию ZKGrails, ZKGrails 2.2 . Это приложение было разработано после приложения Simon’s MongoMaps также на DZone. В конце этой статьи вы сможете создать простое приложение MongoDB с ZK и Grails.
ZKGrails является частью экосистемы Grails с 2008 года. Я предполагал, что Grails будет полноценной веб-платформой вместо фреймворка, поддерживающего только MVC. Эта идея была движущей силой развития ZKGrails. На сегодняшний день ZKGrails является ведущим плагином из почти 1000 доступных, который поддерживает еще один уровень View / Controller, помимо GSP Grails. Также в ближайшем будущем Grails снова превратится из платформы веб-разработки в полноценную платформу разработки приложений. Конечно, ZKGrails также будет развиваться как профиль RIA Grails .
Доменный класс и MongoDB
Как обычно, мы начинаем создавать приложение ZKGrails из доменной части приложения. Grails 2 поднял опорный слой постоянства за Hibernate. Слой GORM Grails 2 обеспечивает очень прозрачный способ подключения к MongoDB. Это означает, что вы можете переключаться между отображением Hibernate и MongoDB, просто меняя плагины и перенастраивая источники данных.
Я начну с создания приложения Grails, установки плагина MongoDB и указания источника данных на мой локальный экземпляр MongoDB.
$ grails create-app mongomaps $ cd mongomaps
Найдите свой grails-app / conf / BuildConfig.groovy и добавьте:
compile ‘: mongodb: 1.1.0.GA’
в блок plugins {} для установки плагина Grails MongoDB.
// // BuildConfig.groovy // plugins { compile ':mongodb:1.1.0.GA' }
Также внутри BuildConfig.groovy рекомендуется установить значение true для legacyResolve, чтобы Grails могла правильно разрешать зависимости плагинов.
// // BuildConfig.groovy // grails.project.dependency.resolution = { ... legacyResolve true ... }
Чтобы убедиться, что плагин MongoDB установлен правильно, введите:
$ grails refresh-dependencies
Если у вас есть сообщения о том, что плагин MongoDB устанавливается, то это хорошо.
Тогда пришло время для нашего класса домена. У нас будет класс домена для хранения почтовых индексов США и их местоположения. Введите следующую команду для создания Zipcode.groovy :
$ grails create-domain-class Zipcode
Затем найдите его в grails-app / domain / mongomaps / , откройте и, в основном, скопируйте и вставьте следующие коды.
package mongomaps class Zipcode { Integer pop String state List loc String city static transients = ['lat', 'lng'] Double getLng() { loc[0] as Double } Double getLat() { loc[1] as Double } static constraints = { loc geoIndex: true } static mapping = { collection "maps" } }
Начнем со свойств класса домена. Существует четыре свойства, сопоставленных с коллекцией «maps» MongoDB (см. Статическое сопоставление в строке 19). Свойство pop для численности населения, штат — это название штата, city — название города. Хитрый здесь — это loc , который отображается как список из 2 элементов. Предложенный в статье Саймона, у нас также есть геттеры для долготы (loc [0]) и широты (loc [1]). Оба типа Double . Свойство loc отображается правильно на долготу и широту с помощью loc geoIndex: true в блоке ограничений (строка 16-18).
Двигается рядом с настройкой наших данных , S Ource . Для экземпляра MongoDB на локальном хосте достаточно поместить следующую конфигурацию в grails-app / conf / DataSource.groovy .
// // DataSource.groovy // grails { mongo { host = "localhost" databaseName = "grails" } }
На данный момент нам, конечно же, нужен работающий экземпляр MongoDB и тестовые данные. Установка MongoDB относительно проста. Просто зайдите на http://mongodb.org, скачайте и распакуйте. Затем запустите bin / mongod –dbpath =. / Data и ваш экземпляр будет запущен.
Чтобы импортировать тестовые данные, загрузите « zips.js » со следующего URL:
https://dl.dropbox.com/u/381580/zkgrails/zips.json
и используйте утилиту MongoDB, mongoimport , для импорта файла. Не забудьте, что мы настроили имя базы данных «grails», а имя коллекции — «maps» .
Пользовательский интерфейс с ZK
Теперь вернемся к BuildConfig.groovy, чтобы установить плагин ZK для Grails. Поставьте следующую строку:
скомпилируйте «: zk: 2.2.0»
в блок plugins {} , например:
// // BuildConfig.groovy // plugins { ... compile ':mongodb:1.1.0.GA' compile ':zk:2.2.0' }
Также нам нужен компонент Google Map ZK (для тега <gmaps />), который можно скачать здесь:
http://www.zkoss.org/download/zkgmaps
Загрузить бинарный файл, и экстракт gmapz.jar в ./lib каталог
Затем позвольте Grails снова обновить все зависимости.
$ grails refresh-dependencies
Начиная с ZKGrails 2.1, он представил новый способ разработки приложений ZK с использованием API в стиле jQuery. ZKGrails 2.2 улучшает набор API несколькими способами, включая новую систему шаблонов пользовательского интерфейса.
Мы запускаем часть пользовательского интерфейса, создавая ZUL-файл и его Composer с помощью следующей команды:
$ grails create-zul index
В сгенерированном grails-app / zul / index.zul отредактируйте его следующим образом:
<zk xmlns="http://www.zkoss.org/2005/zul"> <vlayout width="600px" vflex="true" apply="mongomaps.IndexComposer"> <gmaps width="600px" vflex="true" /> <listbox width="600px" height="280px"> <listhead> <listheader label="Id"/> <listheader label="Name"/> <listheader label="State"/> <listheader label="Population"/> </listhead> </listbox> <hlayout sclass="z-valign-middle"> <paging hflex="true" /> </hlayout> </vlayout> </zk>
Файл index.zul содержит 1. компонент карты Google ( <gmaps /> ) 2. компонент списка с 4 столбцами данных ( <listbox /> ) и 3. компонент разбиения на страницы ( <paging /> ) для управления отображением данные. Пожалуйста, обратите внимание, что мы не устанавливаем идентификатор для этих компонентов специально. Они будут управляться CSS-селекторами в стиле jQuery из связанного mongomaps.IndexComposer .
Вдохновленные Backbone.JS, мы упростили имя нашего базового класса Composer, zk.grails.Composer , чтобы сделать его более интуитивным в ZKGrails 2.2. Новое имя Composer гораздо легче запомнить, чем старое, предоставленное более старыми версиями ZKGrails. Кроме того, новый не требует каких-либо преобразований AST для добавления новых API в Composer. Ничто не должно замедлять процесс компиляции. Более того, объявление явного суперкласса делает осмысленным интеллигентство или автозаполнение в любой среде IDE.
package mongomaps class IndexComposer extends zk.grails.Composer { static PAGE_SIZE = 8 def afterCompose = { window -> $('listbox').template { listitem { listcell() listcell() listcell() listcell() } } $('paging') pageSize PAGE_SIZE totalSize Zipcode.count() redraw(0) $('paging').on('paging', { redraw $(it).activePage() }) $('listbox').on('select', { def zipcode = $(it).object() $('gmaps') lat zipcode?.lat lng zipcode?.lng }) } def redraw(page=0) { def list = Zipcode.list(offset: PAGE_SIZE * page, max: PAGE_SIZE) $('listbox').fill(list, 'listitem', [ id: 'listcell:eq(0)', city: 'listcell:eq(1)', state: 'listcell:eq(2)', pop: 'listcell:eq(3)' ]) $('listbox').selectedItem null } }
Наш код начинается с первой строки Closure afterCompose (строка 7). Список выбирается $ (‘listbox’), и мы вызываем .template (), чтобы определить шаблон пользовательского интерфейса для него (строки 9-16).
Затем в строке 18 мы выбираем компонент разбиения на страницы с помощью $ (‘paging’) , устанавливаем свойства pageSize и totalSize . Этот вид синтаксиса, предоставляемый Groovy начиная с 1.8, выглядит действительно круто. Но не волнуйтесь, если вы не знакомы с этим синтаксисом. Использование методов доступа к свойствам также прекрасно работает здесь.
Строка 19 вызывает перерисовку (0) для отображения первой страницы данных. Этот метод извлекает страницу данных из класса домена Zipcode, а затем «заполняет» их в список, выбранный с помощью $ (‘listbox’) . Метод fill выполняет визуализацию пользовательского интерфейса, используя шаблон, определенный в строке 9-16, и автоматически связывает каждый объект Zipcode из списка с каждым компонентом listitem . Все 4 столбца данных, указанных параметром Map, содержат имена свойств Zipcode, которые являются id , городом , государством и pop соответственно (строки 34-39).
Каждый раз, когда процесс рендеринга заканчивается, выбранный элемент списка устанавливается в ноль (строка 40), чтобы не выбирать ни один элемент списка.
Вы можете найти 2 обработчика событий пользовательского интерфейса в строках 22-24 и 26-29. Первый, $ (‘paging’). On (‘paging’) , предназначен для изменения страницы. Каждый раз, когда компонент пагинации изменяется, мы извлекаем другой набор данных и повторно заполняем список. Второй, $ (‘listbox’). On (‘select’) , предназначен для обработки выбора элементов. Когда выбрано поле со списком, текущий объект Zipcode, прикрепленный к выбранному элементу списка, можно получить с помощью $ (it) .object (), а его данные используются для обновления карты Google.
Сопоставление URL
Далее следует косметический штрих, чтобы «index.zul» отображался как страница по умолчанию. открыто
Grails-приложение / CONF / UrlMappings.groovy
и добавьте следующую строку:
«/»(View:»/index.zul»)
в блок static mapping = {…} , например:
class UrlMappings { static mappings = { "/$controller/$action?/$id?"{ constraints { // apply constraints here } } "/"(view:"/index.zul") "500"(view:'/error') } }
После того, как все настроено. Убедитесь, что ваш локальный экземпляр MongoDB запущен и затем вызывается:
$ grails run-app
или попробуйте онлайн здесь .
Некоторые вещи на заметку
-
Я использую $ (…) с именами тегов, а не ID для выбора компонентов. Это только для демонстрации. В реальном приложении мы часто определяем идентификатор компонента и используем $ (‘# id’) для его выбора.
-
Модель программирования jQuery проста. Это ctive способ мышления. Вы все еще можете делать то, что вы хотите активно с более кратким синтаксисом.
-
Механизм привязки данных в ZKGrails 2.2 значительно упрощен. Вы можете использовать его без каких-либо обязательных аннотаций. Всего 2 шага, определите шаблон и заполните . (В любом случае мы используем привязку данных ZK внизу).
Вывод
В этой статье вы увидели быстрый и простой способ создания приложения MongoDB с использованием ZK & Grails. Эта статья призвана показать, что вы можете значительно повысить производительность, используя Grails для разработки своего корпоративного приложения, по сравнению с Java. В сочетании с мощью ZKGrails вы обнаружите, что создание серверного AJAX-приложения — это весело и эффективно.