Upload
guest092df8
View
561
Download
5
Embed Size (px)
DESCRIPTION
Citation preview
Grails. Поиски закончены.
Сергей Нековаль
«Грамант»
Заголовок слайдаТекст слайда, рисунки. Старайтесь не захламлять текст лишними данными, параметрами. Вот немного тезисов:
• Для демонстрации используются плазмы – соотношение сторон 16:9!;
• Залы будут длинными (в среднем около 20 метров), поэтому текст должен быть заметным;
• Код на слайде – плохая идея, он плохо читается издалека;
• Не забывайте выделять ключевые моменты;
• Формат презентации – Microsoft Power Point (как 2003, так и 2007) и PDF.
Зоопарк Что выбрать?
RapidDynamicRobust
Grails• Динамический язык Groovy
• Rapid! Все лучшее из Ruby on Rails
• Проверенные решения: Spring, Hibernate, SiteMesh
Умные слова• MVC Model-View-Controller• DSL Domain-Specific Language• DI Dependency Injection• DDD Domain Driven Design• ORM Object-Relational Mapping• CC Convention over configuration
Компилируется…
«Мой код компилируется»ОТМАЗКА #1
отлынивающего от работы программиста
Groovy• Компилируется в байт-код• Динамический с необязательной типизацией• Вызов любого Java-кода и наоборот• Поддерживает closures
def myClosure = { a,b -> a + b }
Подарки от Groovy• Можно не ставить ; и return• Можно игнорировать null: person?.name• Можно не объявлять исключения!• Можно не ставить скобки при вызове метода!• value ?: defaultValue
Все, что так хотели Java-программисты,
но боялись попросить
Grails• 90% кода динамически перекомпилируется• Старый добрый Servlet• Hibernate• Spring MVC + Spring WebFlow• SiteMesh
Базовое Grails-приложениеgrails-app
confcontrollersdomainservicestaglibviews
srcgroovyjava
testweb-app
WEB-INF
MVC в Grails• Основано на Spring MVC/Spring WebFlow• SiteMesh• GSP – вариант JSP для языка Groovy• Настраивается абсолютно все!
Сущность• Валидация полей• Основа для схемы БД (hbm2ddl)• Основа для scaffolding
class Book {String titlestatic constraints = {
title(blank:false, nullable:false, size:5..150)
} }
GORM (Grails ORM)• Очень мощный фантик для Hibernate 3• Можно использовать отдельно от Grails• Версионирование• Mapping DSL• Criteria DSL, HQL, транзакции и т.д.
Примерыclass Book {
String titleString contentsstatic mapping = {
contents type: "text“}
}
class Book {String contentsstatic mapping = {
if (environment == PRODUCTION) { contents type: "text“
}}
}
Many-to-oneclass Book {
String titlestatic belongsTo = [author:Author]
}One-to-many
static hasMany = [books:Book]
def pushkin = Author.get(1)def onegin = Book.findByTitle(«Евгений Онегин»)def onegin = Book.findByAuthorAndTitleLike
(pushkin, «%Онегин%»)
println «Пушкин написал \ ${Book.countByAuthor(pushkin)} книг.»
Транзакции?
ЛЕГКО!Book.withTransaction {
def book = new Book(title: «Метель»)pushkin.addToBooks(book).save()
}
Scaffolding• Генерация controller + view• Быстро создать скелет приложения• Что-то поправить
Сборка
• На выходе – WAR файл• Управление сборкой: Gant• Зависимости: Maven, Ivy
Build DSLgrails.project.dependency.resolution = {
dependencies {runtime 'postgresql:postgresql:8.3-
604.jdbc4‘}
}
Артефакт Maven
Тесты• Unit• Integration
Причины популярности• Низкий порог входа• Быстрая разработка• Поддержка IDE: NetBeans, IDEA, Eclipse• Стабильность и переносимость платформы• Плагины