Grails — это платформа веб-приложений с открытым исходным кодом , использующая язык программирования Apache Groovy [1] : 757, §18 (который, в свою очередь, основан на платформе Java ). Он задуман как высокопроизводительная среда, следуя парадигме « кодирования по соглашению », предоставляя автономную среду разработки и скрывая большую часть деталей конфигурации от разработчика. [ нужна цитата ]
Grails ранее был известен как «Groovy on Rails»; в марте 2006 года это имя было исключено в ответ на запрос Дэвида Хайнемейера Ханссона , основателя платформы Ruby on Rails . [2] Работа началась в июле 2005 г., выпуск версии 0.1 состоялся 29 марта 2006 г., а выпуск версии 1.0 был анонсирован 18 февраля 2008 г.
Grails был разработан для решения ряда задач:
У Grails есть три свойства, которые отличают его от традиционных веб-фреймворков Java:
Создание веб-приложений на Java традиционно предполагает настройку сред и платформ в начале и во время разработки. Эта конфигурация очень часто выражается в XML-файлах, чтобы упростить настройку и избежать внедрения конфигурации в код приложения.
Изначально XML приветствовался, поскольку он обеспечивал большую согласованность настройки приложений. Однако в последние годы стало очевидно, что, хотя XML отлично подходит для настройки, настройка среды может быть утомительной. Это может снизить производительность, поскольку разработчики тратят время на понимание и поддержку конфигурации платформы по мере роста приложения. Добавление или изменение функциональности в приложениях, использующих конфигурацию XML, добавляет дополнительный шаг к процессу изменений, что снижает производительность и может снизить гибкость всего процесса.
Grails устраняет необходимость добавлять конфигурацию в XML-файлы. Вместо этого платформа использует набор правил или соглашений при проверке кода приложений на основе Grails. Например, имя класса, которое заканчивается на Controller
(например BookController
), считается веб-контроллером.
При использовании традиционных веб-инструментариев Java разработчикам приходится собирать модули разработки, что может быть утомительно. Grails предоставляет среду разработки, включающую веб-сервер, позволяющий разработчикам сразу приступить к работе. Все необходимые библиотеки входят в состав дистрибутива Grails, и Grails автоматически подготавливает веб-среду Java к развертыванию.
В Grails реализованы динамические методы в нескольких классах посредством примесей. Миксин — это метод, который динамически добавляется в класс, как если бы его функциональность была скомпилирована в программу.
Эти динамические методы позволяют разработчикам выполнять операции без необходимости реализации интерфейсов или расширения базовых классов. Grails предоставляет динамические методы в зависимости от типа класса. Например, в доменных классах есть методы для автоматизации операций сохранения, таких как сохранение, удаление и поиск.
Веб-фреймворк Grails был разработан в соответствии с парадигмой MVC .
Grails использует контроллеры для реализации поведения веб-страниц. Ниже приведен пример контроллера:
класс BookController { def list () { [ books: Book . список () ] } }
В приведенном выше контроллере есть list
действие, которое возвращает модель , содержащую все книги в базе данных. Для создания этого контроллера grails
используется команда, как показано ниже:
Книга Grails Create-Controller
Эта команда создает класс в grails-app/controller
каталоге проекта Grails. Создание класса контроллера достаточно, чтобы Grails распознал его. Действие list
отображается http://localhost:8080/book/list
в режиме разработки.
Grails поддерживает JSP и GSP. В приведенном ниже примере показано представление, написанное на GSP, в котором перечислены книги в модели, подготовленной контроллером выше:
<html> <head> <title> Наши книги </title> </head> <body> <ul> <g:each in= "${books}" > <li> ${it.title} (${ it.author.name}) </li> </g:each> </ul> </body> </html>
Это представление следует сохранить начиная grails-app/views/book/list.gsp
с проекта Grails. Это местоположение соответствует действию BookController
и list
. Размещение файла в этом месте достаточно, чтобы Grails распознал его.
Также доступна ссылка на тег GSP.
Grails предоставляет большое количество библиотек тегов «из коробки». [1] : 758-763, §18-2 Однако вы также можете легко создавать и повторно использовать свои собственные библиотеки тегов [1] : 792, §18-13 : [3]
класс ApplicationTagLib { def formatDate = { attrs , body -> out << new java . текст . SimpleDateFormat ( attrs . format ). формат ( attrs.date ) } } _ _
Приведенная formatDate
выше библиотека тегов форматирует java.util.Date
объект в формат String
. Эту библиотеку тегов следует добавить в grails-app/taglib/ApplicationTagLib.groovy
файл или файл, заканчивающийся на TagLib.groovy
в grails-app/taglib
каталоге.
Ниже приведен фрагмент файла GSP, в котором используется formatDate
библиотека тегов:
<g:formatDate format="ггггММдд" date="${myDate}"/>
Чтобы использовать библиотеку динамических тегов в GSP, не нужно использовать теги импорта. Библиотеки динамических тегов также можно использовать в файлах JSP , хотя для этого потребуется немного больше работы. [1] Архивировано 17 октября 2010 г. в Wayback Machine.
Модель предметной области в Grails сохраняется в базе данных с помощью GORM (реляционное сопоставление объектов Grails). Классы домена сохраняются в grails-app/domain
каталоге и могут быть созданы с помощью grails
команды, как показано ниже:
Книга Grails Create-Domain-Class
Эта команда запрашивает имя класса домена и создает соответствующий файл. Ниже Book
показан код класса :
class Book { String title Человек автор }
Создание этого класса — это все, что требуется для постоянного управления им с помощью Grails. В Grails 0.3 GORM был улучшен и, например, добавляет идентификатор свойства и саму версию в класс домена, если они отсутствуют. Свойство id используется в качестве первичного ключа соответствующей таблицы. Свойство версии используется для оптимистической блокировки.
Когда класс определяется как доменный класс, то есть управляемый GORM, методы динамически добавляются, чтобы помочь сохранить экземпляры класса. [2]
Метод save()
сохраняет объект в базу данных:
def book = новая книга ( название: «Код да Винчи» , автор: Author . findByName ( «Дэн Браун» )) book . сохранять ()
Метод delete()
удаляет объект из базы данных:
Защитная книга = Книга . Книга findByTitle ( «Код да Винчи» ) . удалить ()
Метод refresh()
обновляет состояние объекта из базы данных:
Защитная книга = Книга . Книга findByTitle ( «Код да Винчи» ) . обновить ()
Метод ident()
извлекает идентификатор объекта, присвоенный из базы данных:
Защитная книга = Книга . findByTitle ( «Код да Винчи» ) def id = book . идентификатор ()
Метод count()
возвращает количество записей в базе данных для данного класса:
защита bookCount = Книга . считать ()
Метод exists()
возвращает true, если в базе данных существует объект с заданным идентификатором:
Защиту bookExists = Книга . существует ( 1 )
Метод find()
возвращает первый объект из базы данных на основе оператора запроса объекта:
Защитная книга = Книга . find ( "из Книги b, где b.title =?" , [ 'Код да Винчи' ])
Обратите внимание, что синтаксис запроса — Hibernate HQL .
Метод findAll()
возвращает все объекты, существующие в базе данных:
def book = Книга . найти все ()
Этот findAll()
метод также может использовать оператор запроса объекта для возврата списка объектов:
def book = Книга . findAll ( «из книги» )
Методы findBy*()
возвращают первый объект из базы данных, соответствующий определенному шаблону:
Защитная книга = Книга . findByTitle ( «Код да Винчи» )
Также:
Защитная книга = Книга . findByTitleLike ( "%Да Винчи%" )
Методы findAllBy*()
возвращают список объектов из базы данных, соответствующих определенному шаблону:
def book = Книга . findAllByTitleLike ( «%» )
Методы findWhere*()
возвращают первый объект из базы данных, соответствующий набору именованных параметров:
Защитная книга = Книга . findWhere ( название: «Код да Винчи» )
Grails поддерживает формирование шаблонов для поддержки операций CRUD (создание, чтение, обновление, удаление). Любой доменный класс может быть сформирован путем создания контроллера формирования каркаса, как показано ниже:
класс BookController { статический каркас = true }
Создав этот класс, вы можете выполнять операции CRUD над файлами http://localhost:8080/book
. Это работает, поскольку BookController следует тому же соглашению об именах, что и доменный класс Book. Чтобы создать шаблон для определенного доменного класса, мы могли бы ссылаться на этот класс непосредственно в свойстве scaffold:
класс SomeController { статический каркас = Книга }
В настоящее время Grails не предоставляет основу для ассоциаций.
Механизм сохранения в GORM реализован через Hibernate . Таким образом, устаревшие базы данных могут быть сопоставлены с классами GORM с использованием стандартных файлов сопоставления Hibernate.
Целевая аудитория Grails:
Grails построен на основе платформы Java и является ее частью, что означает, что его очень легко интегрировать с библиотеками, платформами и существующими базами кода Java. Grails предлагает прозрачную интеграцию классов, отображаемых с помощью инфраструктуры Hibernate ORM . Это означает, что существующие приложения, использующие Hibernate, могут использовать Grails без перекомпиляции кода или перенастройки классов Hibernate при использовании методов динамического сохранения, описанных выше. [3] Архивировано 16 июля 2011 г. в Wayback Machine.
Одним из последствий этого является то, что формирование шаблонов можно настроить для классов Java, отображаемых с помощью Hibernate. Другим следствием является то, что возможности веб-платформы Grails полностью доступны для этих классов и приложений, которые их используют.
Grails также использует Spring Inversion of Control Framework; На самом деле Grails — это приложение Spring MVC. [4] Фреймворк Spring можно использовать для предоставления дополнительных bean-компонентов Spring и введения их в контекст приложения. Платформа SiteMesh используется для управления уровнем представления, упрощая разработку страниц с помощью надежной системы шаблонов. [5]
Приложения Grails упаковываются как военные артефакты, которые можно развернуть в любом контейнере сервлетов или на серверах приложений Java EE . [1] : 763, §18-2