Робота з grails cоздание першого grails-додатки

Цей контент є частиною серії: Робота з Grails

Слідкуйте за виходом нових статей цієї серії.

Знайомство з Grails я почну з іншого безкоштовної інфраструктури для розробки Web-додатків: Ruby on Rails. Коли Rails з'явився, він захопив безліч розробників. Можливості скаффолдинг, закладені в Rails, дозволяли запустити новий проект за менший час, ніж раніше. Ідея "угод по конфігурації" (convention over configuration), що лежить в основі Rails, дозволяє додатку "збирати" себе самого, грунтуючись на розумних схемах іменування, а не на громіздких і схильних до помилок конфігураційних XML-файлах. Можливості метапрограмування Ruby дозволяють об'єктам "магічно" успадковувати методи і поля, які їм потрібні під час роботи, без захаращення вихідного коду.

Інфраструктур Rails заслужив і як і раніше заслуговує того схвалення, яке він отримав, але він ставить Java-розробників перед важкими питаннями. Чи варто відмовлятися від відомої Java-платформи через обіцянки нової платформи? І що робити з існуючим кодом Java, існуючими корпоративними серверами і штатом досвідчених Java-програмістів?

Про цю серії статей

Grails - це сучасний інфраструктур для розробки Web-додатків, який поєднує відомі Java-технології, такі як Spring і Hibernate, з сучасними прийомами, такими як "угода по конфігурації". Написаний на Groovy, Grails прозоро інтегрується з існуючим Java-кодом, додаючи гнучкість і динаміку мов сценаріїв. Після вивчення Grails ваші погляди на розробку Web-додатків зміняться безповоротно.

Тут на сцену виходить Grails. Grails надає ті ж можливості розробки, що і Rails, при цьому зберігаючи міцний зв'язок з перевіреними Java-технологіями. Але Grails - це не просто "ще один клон" Rails, перенесений на платформу Java. Grails засвоїв уроки, отримані в Rails, і поєднав їх із сучасними віяннями в Java-програмуванні. Це скоріше розвиток Rails, ніж просто перенесення на нову платформу.

можливості Groovy

Так само як Rails глибоко прив'язаний до мови програмування Ruby, Grails не зміг би існувати без можливостей Groovy (див. Розділ Ресурси). Groovy - це динамічний мову, що працює в JVM і прозоро інтегрується з мовою Java. Якщо ви читали багаторічний цикл статей Practically Groovy на Web-сайті developerWorks, то ви вже знайомі з можливостями цієї мови. Якщо ж ні, то нічого страшного, в процесі вивчення Grails доведеться дізнатися дуже багато і про Groovy. Це не повинно бути складно, так як Groovy був спеціально спроектований так, щоб сподобатися Java-розробникам.

Наприклад, Groovy дозволяє істотно скоротити кількість Java-коду, який зазвичай припадає писати. Не потрібно писати get і set-методи для доступу до полів, так як Groovy надає їх автоматично. Не потрібно писати конструкції типу for Iterator i = list.iterator () для виконання циклу за списком елементів; конструкція list.each робить те ж саме більш лаконічно і наочно. Простіше кажучи, Groovy - це те, як виглядав би мову Java, якби його написали в двадцять першому столітті.

Groovy ніколи б не привернув Java-програмістів, якби для того, щоб скористатися його перевагами, доводилося повністю переписувати додатки. На щастя, Groovy прозоро інтегрується з існуючим кодом. Мова Groovy не замінює мову Java, а вдосконалює його. Groovy можна швидко вивчити за один день, так як Groovy-код - це Java-код. Ці дві мови настільки сумісні, що можна перейменувати працює файл .java в файл .groovy (наприклад, файл Person.java перейменувати в Person.groovy), і отримати абсолютно правильний (і виконуваний) файл Groovy, хоча він і не буде використовувати ніяких синтаксичних переваг, що надаються Groovy.

Така глибока сумісність між мовами Groovy і Java означає, що Grails не потрібно "винаходити колесо", коли мова йде про ключові внутрішніх технологіях. Замість цього він дозволяє поглянути на знайомі Java-бібліотеки з точки зору Groovy. Сценарії тестування JUnit типу TestCase полягають в Groovy-оболонку і представляються як об'єкти типу GroovyTestCase. Grails представляє нову точку зору на сценарії збірки Ant за допомогою GANT - версії Ant, реалізованої виключно на Groovy. Grails поміщає Hibernate за "тонкий" Groovy-фасад, званий GORM (Grails Object Relational Mapping - розширення Grails для об'єктно-реляційного перетворення). Це тільки три приклади того, як Grails дозволяє використовувати весь досвід, накопичений в Java, одночасно надаючи переваги сучасних прийомів Web-розробки.

Але щоб повністю оцінити Grails, для початку з ним необхідно познайомитися на практиці. Прийшов час встановити Grails і створити перше Web-додаток.

установка Grails

Все, що потрібно для запуску Grails-додатки, укладено в один ZIP-файл. Всі залежні бібліотеки - Groovy, Spring і Hibernate і багато інших - уже встановлені на місце і готові до використання. Для установки Grails необхідно:

  1. Завантажити і розпакувати архів grails.zip з Web-сайту Grails (див. Розділ Ресурси).
  2. Встановити змінну середовища GRAILS_HOME.
  3. Додати шлях $ GRAILS_HOME / bin в змінну середовища PATH.

Звичайно, необхідно мати встановлену версію JDK. (Grails хороший, але все-таки не настільки хороший). Grails 1.0 може запускатися на Java 1.4, 1.5 і 1.6. Якщо ви не впевнені, яка версія встановлена, введіть java -version в командному рядку. Якщо необхідно, скачайте і встановіть версію JDK, сумісну з Grails (див. Розділ Ресурси).

Після виконання дій по установці необхідно ввести в командному рядку grails -version для перевірки правильності встановлення. Якщо виводиться таке вітальне повідомлення, значить, все налаштовано правильно:

Web-сервер і база даних в комплекті

Використання безкоштовних продуктів

У додатку в цій статті будуть використовуватися Web-сервер і база даних, які безкоштовно поставляються з Grails. У наступній статті будуть представлені покрокові інструкції по запуску Grails на інших серверах. Також можна відвідати Web-сайт grails.org і ознайомитися з відмінною онлайнової документацією (див. Розділ Ресурси).

Цікаво, що для запуску Grails-додатків не потрібно окремо встановленого Web-сервера. Grails поставляється зі своїм вбудованим сервлет-контейнером - Jetty. Досить ввести grails run-app. і додаток буде запущено в контейнері Jetty (див. розділ Ресурси) без необхідності проходити через звичайні етапи установки. Запуск Grails-додатки на існуючому корпоративному сервері додатків також не представляє проблем. Якщо ввести команду grails war. буде створено стандартний файл, який можна встановити на Tomcat, JBoss, Geronimo, WebSphere® або будь-який інший сервлет-контейнер, сумісний з Java EE 2.4.

Також не потрібно окремо встановленої бази даних. Grails поставляється з базою даних HSQLDB (див. Розділ Ресурси), написаної повністю на Java. Наявність бази даних, вже готової до використання, дає істотну надбавку до продуктивності. Використовувати іншу СУБД, наприклад, MySQL, PostgreSQL, Oracle Database або DB2 також нескладно завдяки Hibernate і GORM. Якщо є JAR-файл з JDBC-драйвером і настройки для стандартного підключення, то досить внести одну зміну в файл DataSource.groovy, щоб переключити додаток на використання іншої бази даних.

Створення першого Grails-додатки

Мені доводиться багато подорожувати - щонайменше 40 поїздок на рік. Я виявив, що календарі надають мені величезну допомогу, кажучи мені, коли я повинен бути десь, але при цьому не повідомляють, де знаходиться це місце. У онлайнових карт протилежна проблема: вони відмінно справляються з питанням "де", але не з питанням "коли". Тому в цій і парі наступних статей цієї серії буде підготовлено спеціальне Grails-додаток, що допоможе вирішувати питання "де" і "коли" при плануванні поїздки.

Обережно, спойлер!

Для початку необхідно увійти в порожній каталог і ввести команду grails create-app trip-planner. Після спалаху активності можна буде побачити каталог trip-planner. Подібно Maven, Rails і AppFuse, Grails створює стандартну структуру каталогів для користувача. Якщо вам здається, що це безнадійно обмежує вас, а з інфраструктурою неможливо працювати, якщо ви не можете педантично створити власне дерево каталогів, то, швидше за все, великого задоволення від роботи з Grails ви не отримаєте. Угоду. перша складова принципу "угоду по конфігурації", дозволяє взяти будь-Grails-додаток і негайно зрозуміти, які компоненти є і де вони зберігаються.

Далі необхідно перейти в каталог trip-planner і ввести команду grails create-domain-class Trip. Якщо все пройде нормально, з'являться два файли: grails-app / domain / Trip.groovy і grails-app / test / integration / TripTests.groovy. Тестування буде розглядатися в наступній статті. Поки ж сфокусуємось на доменному класі, який починається, як показано в лістингу 1:

Лістинг 1. Доменний клас, згенерований Grails

Поки дивитися нема на що, але ми це виправимо, додавши поля в клас Trip. як показано в лістингу 2:

Лістинг 2. Клас Trip з доданими полями

Як вже говорилося, не потрібно турбуватися про створення get () та set () - методів, так як Groovy динамічно згенерує їх. Клас Trip також містить багато нових і корисних динамічних методів, назви яких говорять самі за себе:

  • Trip.save () зберігає дані в таблицю Trip в базі даних HSQLDB.
  • Trip.delete () видаляє дані з таблиці Trip.
  • Trip.list () повертає список об'єктів Trip.
  • Trip.get () повертає один екземпляр Trip.

Всі ці та інші методи знаходяться в повному вашому розпорядженні. Відзначимо, що клас Trip не має права продовжувати батьківський клас і не реалізує "чарівний" інтерфейс. Завдяки можливостям метапрограмування Groovy ці методи просто з'являються у відповідному місці у відповідних класах. (Ці методи, пов'язані зі збереженням даних в базу даних, отримують тільки класи в каталозі grails-app / domain).

Створення контролера і видів

Створення класу для доменної області - це тільки перший крок. Кожній моделі для повноти картини потрібно хороший контролер і кілька видів. Передбачається, що читач вже знайомий з шаблоном MVC (Model-View-Controller - Модель-вид-контролер) (див. Розділ Ресурси). Введіть в командному рядку: grails generate-all Trip. щоб створити клас grails-app / controllers / TripController.groovy і відповідний набір GSP-сторінок (Groovy Server Pages - серверні сторінки Groovy) в каталозі grails-app / views / Trip. Для кожної дії типу list в контролері є відповідний файл list.gsp. Для дії create є файл create.gsp. Тут на практиці стають видні переваги "угоди по конфігурації": не потрібно ніяких XML-файлів для встановлення відповідності елементів. Кожен клас доменної області має пару у вигляді контролера з відповідним ім'ям. При бажанні цю конфігурацію, що грунтується на іменах, можна обійти, але в більшості ситуацій досить просто дотримуватися угоди, і додаток відразу запрацює.

Розглянемо файл grails-app / controller / TripController.groovy, показаний в лістингу 3:

Лістинг 3. Клас TripController

Так де ж використовується ця колекція типу HashMap. Розглянемо файл grails-app / views / list.gsp, показаний в лістингу 4:

Лістинг 4. Файл list.gsp

Файл list.gsp - це по суті простий HTML документ з невеликою кількістю GroovyTagLibs (бібліотек Groovy-тегів). Все, перед чим варто префікс g. є Groovy-тегом. У лістингу 4 тег проходить по всіх об'єктах Trip в колекції tripList типу ArrayList і будує таблицю, відповідну синтаксису HTML.

Щоб зрозуміти, як працюють контролери, необхідно розібратися з "трьома R": return (повернути), redirect (перенаправити) і render (сформувати графічне відображення). Деякі типи дій використовують переваги неявного вираження return. щоб повертати дані на GSP-сторінку з таким же ім'ям. Інші дії виконують перенаправлення. Наприклад, дія типу index викликається, якщо користувач не вказав тип дії в URL:

В цьому випадку клас TripController виконує перенаправлення до дії list. передаючи при цьому всі параметри (або об'єкт типу QueryString (рядок запиту)) в колекції params типу HashMap.

Нарешті, дія типу save (див. Лістинг 5) не має відповідної сторінки save.gsp. Воно перенаправляє користувача на сторінку дії show. якщо запис була збережена в базу даних без помилок. В іншому випадку воно відображає сторінку create.gsp, де можна побачити виникли помилки і спробувати виконати дію знову.

Лістинг 5. Дія типу save

Однак замість того щоб просто обговорювати, як працює Grails, варто побачити його в дії.

працююче додаток

Введіть grails run-app в командному рядку. Після набору повідомлень Log4J, виведених в консоль, має бути показано повідомлення з таким текстом:

Якщо на порту 8080 вже знаходиться запущений сервер, в результаті збою буде виведений дамп ядра з повідомленням:

Є два способи легко змінити порт, на якому працює Jetty. Можна виконати цю зміну буквально на льоту, ввівши команду grails -Dserver.port = 9090 run-app. Щоб зробити це зміна постійним, необхідно в файлі $ GRAILS_HOME /scripts/Init.groovy знайти рядок, яка починається з serverPort. і змінити її значення:

Після того як Grails був запущений на обраному порту, можна ввести URL в Web-браузер. При цьому повинна з'явитися сторінка вітання зі списком усіх контролерів, як показано на малюнку 1:

Малюнок 1. Екран вітання Grails-додатки

Робота з grails cоздание першого grails-додатки

Робота з grails cоздание першого grails-додатки

Потім необхідно натиснути на посилання TripController. і вам буде представлено повноцінне CRUD-додаток (Create, Read, Update, Delete - створити, вважати, оновити, видалити), з яким вже можна працювати.

Нові поїздки створюються за допомогою сторінки, зображеної на малюнку 2:

Малюнок 2. Сторінка Create Trip (створити поїздку)

Робота з grails cоздание першого grails-додатки

Робота з grails cоздание першого grails-додатки

Редагування поїздок проводиться за допомогою сторінки, зображеної на малюнку 3:

Малюнок 3. Сторінка Trip List (список поїздок)

Робота з grails cоздание першого grails-додатки

Робота з grails cоздание першого grails-додатки

Так скільки ж часу знадобилося на створення і запуск програми? І скільки для цього потрібно рядків коду? Дізнатися про це можна в такий спосіб:

  1. Натиснути Ctrl-C для виключення Grails.
  2. Ввести grails stats.

На екрані будуть надруковані наступні дані:

Для реалізації всієї функціональності додатку знадобилося менше 100 рядків коду. Непогано, але перед завершенням статті хотілося б продемонструвати ще одну можливість Grails.

Генерація контролера і видів - це дуже гарна вправа, а наявність фізичних файлів на диску ілюструє, як всі деталі пов'язані між собою. Однак давайте видалимо вміст класу TripController і замінимо його наступного змісту:

Ця єдина рядок коду вказує Grails зробити те ж саме, що було зроблено з попереднім контролером, з одним винятком: згенерувати всі дії list. save і edit динамічно - прямо в пам'яті під час виконання. Три рядки коду замість 66 призводять до абсолютно такому ж поведінки програми.

Знову введіть grails run-app. Так, всі введені дані пропали, але це не страшно. Вимкніть Grails комбінацією клавіш Ctrl-C і надрукуйте в командному рядку grails prod run-app. Додаток буде запущено в робочому режимі, що означає, що дані будуть зберігатися між перезапуску сервера. Знову пройдемо через TripController і збережемо кілька записів. У поведінці програми не помітно жодної різниці. Розуміння того, що все, що показується в Web-браузері, забезпечується 15 рядками коду, дає уявлення про силу і можливості Grails.

висновок

Сподіваюся, вам сподобалося перше знайомство з Grails. В цей невеликий пакет упаковані величезні можливості, і ми тільки розкрили його оболонку. Установка інфраструктури зажадала чи більше зусиль, ніж проста розпакування архіву. Створення програми з чистого аркуша зажадало введення пари команд. Сподіваюся, цей оглядовий тур підігрів у читача інтерес до Grails. Сподіваюся, він заклав основу для подальшого розширення цього прикладу і вказав вам нові цікаві напрями.

Поки ж рекомендую повправлятися з Groovy і Grails і запевняю, що ваші погляди на Web-розробку радикально зміняться.

Ресурси для скачування

Схожі теми

Схожі статті