Введення в grails

Введення в Grails

Розробка веб-додатків ніколи не була заняттям дуже простим і швидким. І безліч розробників по всьому світу намагаються якось цю ситуацію виправити. Але в той час як одні люди шукають, інші вже знайшли свій шлях. «Нам не потрібна срібна куля, коли ми вже знайшли Священний Грааль», - кажуть розробники Grails.

Спробуємо розібратися, через що могло виникнути бажання придумати новий підхід до процесу Разрабтка веб-додатків.

Зазвичай веб-розробка на Java - процес досить виснажливий, а говорити про швидкість взагалі не доводиться. Ось тільки уявіть собі, скільки дій необхідно зробити, щоб додати в додаток нову сторінку:

  • Створити шаблон сторінки. Шаблон в даному випадку є уявлення.
  • Створити DTO-клас (Data Transfer Object), насправді це клас моделі для MVC.
  • Створити клас Assembler, який буде вміти формувати з доменних об'єктів наш DTO-об'єкт.
  • Створити бізнес-фасад і його імплементацію (хоча це не завжди необхідно). Бізнес-фасади є об'єктами, які виконують складну логіку додатка, найчастіше методи бізнес-фасадів виконуються транзакційно.
  • Створити DAO-інтерфейс (Data Access Object) і його імплементацію. DAO-об'єкти використовуються для роботи з базою даних.
  • Створити клас-контролер, який буде обробляти запити, що надходять, викликати потрібні методи нашого фасаду і збирати разом модель і відображення (маються на увазі складові частини MVC) і повертати результат.
  • І все створені класи конфігурувати за допомогою Spring.

Насправді цей процес описує загальний випадок, і далеко не завжди нам потрібні, наприклад, DTO- або Assembler-класи. Самим утомливих зазвичай є процес зміни. Так що доводиться створювати багато XML-коду, що описує і не започатковано наші об'єкти, а також зв'язку між ними.

Як це робиться в Grails

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

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

Останній крок не завжди необхідний. І найважливіше - не потрібно ніякого XML!

Набагато простіше, чи не так?

Отже, перш ніж приступити до прикладів і подробиць, необхідно розібратися з базовими речами.

В основі Grails лежать:

Малюнок 1. Архітектура Grails

У Grails існує деяка кількість понять, з якими варто ознайомитися насамперед:

Почнемо по порядку. Доменні об'єкти є цеглинками веб-додатки, поняттями предметної області. Так, наприклад, якщо ми пишемо електронний магазин, то у нас, швидше за все, будуть такі об'єкти, як «Користувач», «Замовлення», «Товар» та інші. За доменним об'єктів Grails автоматично генерує таблиці в базі даних разом з ключами, обмеженнями, індексами і всім-всім. Запити до бази також в основному здійснюються за допомогою цих об'єктів, на зразок використання ActiveRecord в Ruby On Rails.

Коли користувач набирає URL нашого сайту, то першим ділом запит потрапляє в контролер цього запиту. Контролер отримує призначені для користувача дані, генерує на їх основі модель і передає її в відображення.

Сервіси - спеціальні суті, завданням яких є виконання бізнес-логіки додатка. Як вже було сказано вище - в Java-додатках для виконання бізнес-логіки використовуються бізнес-фасади.

Шаблони, в общем-то як і скрізь, є HTML-кліше, за якими генеруються сторінки. У Grails з метою спрощення створення шаблонів існує вбудована мова - GSP (Groovy Server Pages), він має теги, що дозволяють здійснювати різноманітні дії, такі як ітерація, умови, висновок даних та інші. Але ви можете самі розширювати набір тегів, створюючи свої власні бібліотеки тегів.

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

Вже раніше згадувалося, що Spring є однією зі складових Grails. Spring в своєму складі має спеціальну функціональність (Quartz) для виконання завдань за розкладом, тобто робити якусь необхідну нам роботу через певні інтервали часу (зрозуміло можна виконувати завдання і в чітко фіксований час). Створюючи завдання таким чином, ви набагато меншою мірою залежите від операційної системи, ніж, наприклад, у випадку з використанням Cron.

Тепер можна перейти до практики. Створимо просте додаток - бібліотеку. Наша бібліотека буде просто зберігати список книг і надаватиме можливість переглядати список, видаляти, редагувати і додавати книги в нього.

Для виконання рутинних завдань - створення скелета простого додатка, доменних об'єктів, контоллеров та іншого - в комплект входить командна утиліта grails. Детально на командах зупинятися не будемо, але найважливіші розглянемо в ході написання нашого додатка. І перша команда, з якою ми познайомимося, - create-app.

bash-3.2 $ grails create-app homeLibrary

Licensed under Apache Standard License 2.0

Grails home is set to: /Library/grails-1.0.1

Base Directory: / demo / grails

Environment set to development

Note: No plugin scripts found

Running script /Library/grails-1.0.1/scripts/CreateApp.groovy

[Mkdir] Created dir: / demo / grails / homeLibrary / src

[Mkdir] Created dir: / demo / grails / homeLibrary / src / java

[Mkdir] Created dir: / demo / grails / homeLibrary / src / groovy

[Mkdir] Created dir: / demo / grails / homeLibrary / grails-app

[Mkdir] Created dir: / demo / grails / homeLibrary / grails-app / controllers

[Mkdir] Created dir: / demo / grails / homeLibrary / grails-app / services

[Mkdir] Created dir: / demo / grails / homeLibrary / grails-app / domain

[Mkdir] Created dir: / demo / grails / homeLibrary / grails-app / taglib

[Mkdir] Created dir: / demo / grails / homeLibrary / grails-app / utils

[Mkdir] Created dir: / demo / grails / homeLibrary / grails-app / views

[Mkdir] Created dir: / demo / grails / homeLibrary / grails-app / views / layouts

[Mkdir] Created dir: / demo / grails / homeLibrary / grails-app / i18n

[Mkdir] Created dir: / demo / grails / homeLibrary / grails-app / conf

[Mkdir] Created dir: / demo / grails / homeLibrary / test

[Mkdir] Created dir: / demo / grails / homeLibrary / test / unit

[Mkdir] Created dir: / demo / grails / homeLibrary / test / integration

[Mkdir] Created dir: / demo / grails / homeLibrary / scripts

[Mkdir] Created dir: / demo / grails / homeLibrary / web-app

[Mkdir] Created dir: / demo / grails / homeLibrary / web-app / js

[Mkdir] Created dir: / demo / grails / homeLibrary / web-app / css

[Mkdir] Created dir: / demo / grails / homeLibrary / web-app / images

[Mkdir] Created dir: / demo / grails / homeLibrary / web-app / META-INF

[Mkdir] Created dir: / demo / grails / homeLibrary / lib

[Mkdir] Created dir: / demo / grails / homeLibrary / grails-app / conf / spring

[Mkdir] Created dir: / demo / grails / homeLibrary / grails-app / conf / hibernate

[Propertyfile] Creating new property file: /demo/grails/homeLibrary/application.properties

[Propertyfile] Updating property file: /demo/grails/homeLibrary/application.properties

Created Grails Application at / demo / grails / homeLibrary

Виконавши команду «grails create-app homeLibrary», ми маємо скелет нашого майбутнього веб-додатки. У Grails має місце таке поняття, як Convention over configuration. Це означає, що для кожного файлу існує своє місце, де він повинен знаходитися, і кожен клас повинен мати чітко регламентоване назву (див. Рис. 2). Наприклад, файли, що містять класи контролерів, повинні мати постфікси Controller.

Малюнок 2. Структура програми

Конфігурація бази даних

В якості наступного етапу налаштуємо додаток для роботи з базою даних, нехай це буде MySQL, але підійде і будь-яка інша СУБД, з якої вміє працювати Hibernate (на даний момент існує підтримка всіх популярних СУБД). Для цього відкриємо файл conf / DataSource.groovy:

// Використовуваний нами драйвер

Як бачимо. даний файл складається з трьох секцій. dataSource, hibernate і environments. Секція dataSource призначена для настройки параметрів доступу безпосередньо до СУБД. Так як ми використовуємо MySQL, то відповідно змінимо ім'я драйвера на «com.mysql.jdbc.Driver», а сам архів з драйвером необхідно помістити в директорію «lib» нашого проекту. Дана директорія призначена для зберігання використовуваних Java-бібліотек. Наступна секція надає нам можливість настройки Hibernate і на даному етапі нецікава, тому перейдемо відразу до конфігурації оточень - environments.

Grails-додаток може виконуватися в трьох різних середовищах (режимах): режим розробки, тестування і готового продукту. Для кожного окремого режиму ми можемо поставити URL, логін, пароль для підключення до СУБД та інше. За замовчуванням під час запуску програми в режимі розробки. Якщо існує необхідність, то можна самому створити додаткові режими. Так як ми вже вибрали в якості СУБД MySQL, то визначимо рядок підключення: jdbc: mysql: //127.0.0.1: 3306 / home_library.

Як уже згадувалося, доменні об'єкти є цеглинками додатки, його базовими поняттями. Так як наш додаток покликане зберігати список книг, то створимо доменний об'єкт Book.

bash-3.2 $ grails create-domain-class Book

Licensed under Apache Standard License 2.0

Grails home is set to: /Library/grails-1.0.1

Base Directory: / demo / grails / homeLibrary

Environment set to development

Note: No plugin scripts found

Running script /Library/grails-1.0.1/scripts/CreateDomainClass.groovy

Created for Book

Created Tests for Book

Як бачите, з цим нам знову допомогла команда grails. З огляду на те, що кожен екземпляр класу Book буде являти собою інформацію про конкретну книжку, відповідно додамо необхідні поля:

String name // Назва книги

int shelfNumber // Номер полиці

name (nullable: false, blank: false, size: 1..200)

author (nullable: false, blank: false, size: 1..50)

Тепер можна запустити програму на основі нашого доменного об'єкта Grails створить в базі таблицю «book». Такий метод створення доменних об'єктів і зв'язування їх з базою видається дещо менш трудомістким, ніж традиційно використовувані в Java анотації або файли Маппінг. Щоб переконатися, виконаємо команду «grails run-app» і подивимося, що змінилося в базі.

mysql> show create table book \ G

Create Table: CREATE TABLE `book` (

`Id` bigint (20) NOT NULL auto_increment,

`Version` bigint (20) NOT NULL,

`Author` varchar (50) NOT NULL,

`Name` varchar (200) NOT NULL,

`Shelf_number` int (11) NOT NULL,

) ENGINE = MyISAM DEFAULT CHARSET = latin1

1 row in set (0.00 sec)

Як бачимо, в таблиці присутні всі певні нами поля і обмеження. Також автоматично був доданий первинний ключ і службове поле «version». Так як для оточення розробки в файлі конфігурації DataSource.groovy опція «dbCreate» має значення «create-drop», то при кожному запуску програми таблиці будуть видалятися і створюватися знову. Зрозуміло, всі дані будуть при цьому загублені. Щоб цього уникнути, необхідно замінити значення на «update». В цьому випадку, якщо будуть відбуватися якісь зміни наших доменних об'єктів, то на існуючих таблицях будуть виконуватися SQL-запити ALTER, і, відповідно, втрати даних матимуть місце лише в разі видалення будь-яких полів або класів.

Контролер і шаблони

Тепер, коли у нас є вже об'єкт предметної області - Book, ми можемо створити інтерфейс для управління книгами. Тут існує кілька шляхів - ми можемо написати все вручну, можемо використовувати так званий scaffolding, а можемо згенерувати за існуючим доменному класу все необхідне, а саме - шаблони і контролер (scaffolding - поведінка контролера, коли явно не існує жодних методів і шаблонів, але при цьому контролер може створювати, видаляти і редагувати дані. Наприклад, ми можемо створити порожній контролер, з полем «def scaffold = Book», і таким чином тепер отримаємо можливість виконувати через даний контролер прості дії з об'єктом Bo ok). Щоб продемонструвати можливості Grails, спробуємо піти третім шляхом і згенерувати код і шаблони. Знову на допомогу нам приходить утиліта grails. Виконаємо команду «grails generate-all Book» і запустимо додаток.

Відкривши браузер, ми побачимо головну сторінку з описом і списком з одного посилання - посилання на згенерований тільки що контролер (див. Рис. 3).

Малюнок 3. Головна сторінка

Перейшовши по ній, переконаємося, що наш додаток дійсно може створювати нові записи, редагувати і видаляти (див. Рис. 4).

Малюнок 4. Просте CRUD- додаток (Create Retrive Update Delete)

Щоб при зверненні до нашого додатком відразу можна було приступити до роботи з книгами, відредагуємо конфігураційний файл conf / UrlMappings.groovy:

// apply constraints here

// перевизначити поведінку за замовчуванням

// the delete, save and update actions only accept

def allowedMethods = [delete: 'POST', save: 'POST', update: 'POST']

if (! params.max) params.max = 10

[BookList: Book.list (params)]

def book = Book.get (params.id)

flash.message = "Book $ created"

Так як явно не вказано метод, за якими потрібно зателефонувати то за замовчуванням викликається метод - «index» (при бажанні можна перевизначити метод, за замовчуванням викликає такий спосіб - додати в контролер рядок: «def defaultAction = 'show'»). Як видно з наведеного коду, метод «index» просто перенаправляє користувача за допомогою HTTP-заголовків на інший метод цього ж класу - «list». Все POST- і GET-параметри доступні через поле params, яке представляє собою асоціативний масив.

У методі «list» вилучають із бази список всіх існуючих книг і повертається в якості моделі. Потім, непомітно для нас, Grails знаходить в директорії «views / book /» шаблон «list.gsp» і передає всередину тільки що згенерувала модель. Як бачите, і тут працює правило «Convention Over Configuration», коли фреймворк сам знає, де знайти необхідні шаблони. Після того як на нашу шаблоном і моделі згенерований HTML-код, до роботи приступає Sitemesh. У нашому шаблоні був використаний спеціальний GSP-тег «». Даний тег показує, що для фінального відображення сторінки необхідно використовувати лейаут «main» (все лейаути знаходяться в директорії «views / layouts»). І тепер Sitemesh застосовує до вже обробленого шаблоном сторінки зазначений лейаут і виводить результат.

Як бачите, все дуже просто і прозоро, чого, власне, і добивалися розробники. На жаль, розглянути всі можливості Grails в одній статті неможливо, тому такі речі, як сервіси, бібліотеки тегів, виконання завдань за розкладом, взаімодейтвіе з Java-кодом, тонкощі роботи з базою і багато іншого, не були розглянуті.

На завершення хотілося б оцінити переваги і недоліки даного фреймворка. Використовуючи Grails, побудувати велику веб-додаток Enterprise-рівня зі складною бізнес-логікою так само складно, як і звичайними засобами Java. Це основний недолік. Але для вирішення більшості повсякденних завдань є повний набір інструментів. До переваг, безсумнівно, варто віднести простоту розробки, можливість запуску отриманих додатків на будь-яких Java-веб-серверах (тобто контейнерах або серверах додатків) і можливість використання вже існуючого Java-коду з мінімальними витратами на його адаптацію.

Схожі статті