Groovy и Grails. Практические советы

Башар Абдул-Джавад

Платформа ]ava топчется на месте довольно долгое время. При этом язык программирования ]ava начинает устаревать. Сейчас для ]аvа-разработчиков наступает время к переходу в сторону мышления в терминах динамических языков. Groovy является одним из самых лучших динамических языков доступных на платформе Java. После нескольких лет работы с Groovy я твёрдо убедился, что всем ]аvа-разработчикам следует по крайней мере познакомиться с Groovy. Количество кода, которое можно сократить с помощью динамического языка подобного Groovy, действительно поражает, особенно, работая с коллекциями и файлами. Именно по этой причине я решил написать эту книгу. Я хочу поделиться с]аvа-разработчиками огромным выигрышем в эффективности, которая достигается с помощью Groovy. Динамические языки подобные Groovy делают реальностью такие фреймворки как Grails. Grails - это глоток свежего воздуха для ]аvа-разработчиков. и это одна из основных причин моей заинтересованности динамическими языками. Я помню первые дни разработки Ha ]ava с использованием Struts и Tapestгy. Но я по lJИМ не скучаю. Лично мне эти фреймворки всегда казались излишне сложными. Я просто не мог определить объёмы конфигурационного и шаблонного кода, необходимые для того, чтобы хоть что­то сделать. Это не те фреймворки, о которых стоит думать. Фреймворки должны делатьвещи проще и позволять сосредоточиться на логике. Это то, что делает Grails. Grails является осмысленной технологией, что для меня является первым, что я ищу в новой' технологии. Grails является столь простым и одновременно мощным фреймворком, что нельзя не удивляться, почему о нём никто не подумал раньше. Одна из сильных сторон Groovy и Grails - это то, что виртуальная машина ]ava Является для них родной Учитывая вездесущность ]ava в наше время, было бы Глупо предлагать ]аvа-разработчикам отказаться от всей ]аvа-инфраструктуры, APIs, библиотек и фреймворков и начать всё сначала. По этой причине Groovy и Grails обязаны быть успешными в мире корпоративных приложений, где платформа ]ava успешно обосновалась. Их идеальная интеграция с ] ava - огромное подспорье в 'распространении. В одной из организаций мы обсуждали, следует ли использовать Ruby оп Rails или Groovy и Grails. К концу дня победу одержали Groovy и Grails. Их отличное взаимодействие c ]ava и лёгкость изучения для Jаvа-разработчиков стали ключевыми факторами, повлиявшими на окончательное решение.

ЧАСТЬ 1 Groovy в примерах

ГЛАВА 1 Начало работы с Groovy Что такое Groovy? Что не так с Java? Как Groovy устраняет недостатки Java? Как загрузить и установить Groovy? Какие инструменты поставляются вместе с Groovy? Как использовать Gгооvy-оболочку? Как использовать Gгооvy-консоль? Как использовать groovyc и groovy? Есть ли подцержка Groovy вIDЕ? Как добавить поддержку Groovy в Eclipse? Как добавить поддержку Groovy в IntelliJ IDЕА? Резюме

ГЛАВА 2 От Java к Groovy Чем схожи Java и Groovy? Чем отличаются Java и Groovy?

Необязательные синтаксические элементы Новые и усовершенствованные синтаксические элементы, структуры и конструкции Новые хелперы, библиотеки и APls Другие отличия Как интегрировать Groovy с Java? Компиляция в байткод Использование GroovyShel1 Использование Gr06vyScriptEngine Использование GroovyClassLoader Испqльзование JSR 223 Резюме.

ГЛАВА 3 Типы данных Groovy и управляющие структуры Какие виды строк есть в Groovy и как их использовать? Как использовать регулярные выражения в Groovy? Чем отличаются числа в Groovy и Java? Как использовать списки в Groovy? Как реализовать сортировку слиянием в Groovy? Как использовать карты в Groovy? Что такое диапазоны и как их использовать в Groovy? Что является истинностным значением в Groovy? Чем отличается оператор switch в Groovy и Java?. Как организовать циклы в Groovy? Резюме.

ГЛАВА 4 Объектно-ориентированный Groovy. Чем отличаются классы и скрипты? Один общедоступный класс на файл Несколько классов на файл Только скриптовый код Классы и скриптовый код В одном файле Выбор стратегии Как использовать пакеты? Что такое синонимия типов и как её использовать? Как использовать наследование в Groovy? Как использовать интерфейсы в Groovy? Что такое мульти методы и как их использовать? Что такое категории и как их использовать? Чем отличаются поля и локальные переменные в Groovy и Java? Чем отличаются методы в Groovy и Java? Использование позиционных параметров Использование списка в качестве единственного аргумента Использование массива для необязательных параметров Использование параметров в виде карты Чем отличаются конструкторы в Groovy и Java? Что такое GroovyBeans? Что такое GPaths? как использовать класс Expando? Что такое Metaclass и как его использовать? Как перехватить все вызовы методов объекта? Как перехватить методы, которые отсутствуют в классе? Как привнести в класс дополнительное поведение с помощью ExpandoMetaClass? Резюме

ГЛАВА 5 Замыкания Что такое замыкание? Зачем нужны замыкания? Можно ли сравнить замыкания с анонимными 'внутренними Классами? Как создать замыкание? Как вызвать замыкание? Как вернуть значение из замыкания? Как повторно использовать метод в качестве замыкания? Как передать замыкание в качестве аргумента метода? Какова область видимости замыкания? Что означают зарезервированные слова this, оwnег и delegate внутри замыкания? Как из замыкания вернуть результат? Что означает каррирование замыканий? Как использовать замыкание внутри оператора switch? Как получить дополнительную информацию о параметрах,

переданных в замыкание? Как использовать замыкания внутри карт? Как использовать замыкания с файлами? Резюме

ГЛАВА 6 Бипдеры. Что такое билдеры? Зачем нужны билдеры? Как использовать MarkupBuilder для генерации XML? Как использовать MarkupBuilder для генерации НТМL? Как с помощью NodeBuilder создать дерево объектов? Как использовать ObjectGraphBuilder для генерации

дерева объектов? Как использовать AntBuilder для генерации Ant-заданий? Как с помощью SwingBuilder создать Swiпg-виджеты? Как использовать менеджеры размётки вместе со SwingBuilder? Как добавить экшен к Swiпg-виджету? Как совместно использовать экшены из виджетов? Как использовать Swiпg-модепи? как создать свой собственный билдер? Резюме

ГЛАВА 7 Работа с базами данных. Как установить соединение с базой данных? Как использовать пул соединений?. Как создать новую таблицу? Как добавить, обновить и удалить данные? Как извлечь данные из таблиц? Как получить метаданные таблицы? Как использовать DataSet? Как использовать DataSet с объединением таблиц? Резюме

ГЛАВА 8 Тестирование с Groovy Как в Groovy создать встраиваемый тест? Как в Groovy создать тестовый класс? Как использовать Groovy для тестирования Java-Koдa? Как объединить и выполнить тесты из IDE? Как использовать Ant для выполнения тестов? Как использовать Maven для выполнения тестов? Какие передовые методики тестирования предоставляет Groovy? Как использовать карты для тестирования кода? Как использовать объект Expando ДI1я тестирования кода? Как использовать заглушки и макеты в Groovy? Как использовать Groovyl..ogTestCase? Как измерить покрытие кода с помощью Cobertura? Резюме

ГЛАВА 9 Разнообразные советы Как использовать шаблоны Groovy для генерации динамического повторно используемого содержимого? Как использовать грувлеты для генерации динамического Web-содержимого? Как загрузить и обработать XML с помощью XmIParser? Как загрузить и обработать XML с помощью XmISlurper? Как использовать XPath? Как загрузить ХМL-содержимое RSS-ленты? Как исполЬЗовать Groovy из командной строки? Как использовать ConfigSlurper для создания конфигурационных фаилов Как с помощью Groovy запустить внешний процесс? Как в Groovy загрузить файл? Как обработать все файлы в каталоге? Как подсчитать все вхождения слова в строке? Резюме

ЧАСТЬ 2 Grails в примерах

ГЛАВА 10 Начало работы с Grails Что такое Grails? Зачем нужен ещё один фреймворк Как загрузить и установить Grails? Как в Grails создать первое приложение? Как использовать GrailsB Eclipse? Как использовать Grails в IпtеlliJ IDЕА? Какие основные команды есть в Grails? Резюме

ГЛАВА 11 Web-Уровень Как создать контроллер? Что такое серверные страницы Groovy? Как связаны контроллеры и GSPs Как передать переменные из контроллера в GSP?. Как использовать теги в качестве вызовов методов? Как в контроллере создать несколько экшенов? Какие неявные объекты ~оступны внутри контроллера и GSP? Как для пользователя создать несколько представлений? Как последовательно вызвать экшены? Как перехватить экшены контроллера? Как выполнить привязку входных параметров? Как вернуть в качестве результата JSON? Как сохранить доменные классы в виде XML или JSQN (сериализовать)? Как выгрузить и загрузить файлы? Что такое шаблоны и как их использовать? Как изменить размётку и внешний вид приложения? Как создать собственные пользовательские теги? Как использовать фильтры? Как использовать Ajax? Резюме

ГЛАВА 12 Уровень данных Как настроить использование базы данных? Как создать доменный класс? Как установить отношения? Как использовать композицию? Как выполнять СRUD-операции доменных классов? Как выполнять запросы с использованием GORM? Как использовать динамические файндеры? Как использовать критерии? Как использовать HQL? Как использовать наследование? Что такое оптимистическое и пессимистическое блокирование Как использовать события? Как использовать метки времени? Как использовать кэширование? Как использовать пользовательский идентификатор базы данных? Как использовать составной первичный ключ? Как добавить индекс к полю? Резюме.

ГЛАВА 13 Скафолдинг Как использовать динамический скафолдинг? Как динамически выполнить скафолдинг отношений? Как настроить созданные представления? Какие в Grails есть встроенные ограничения? Как переопределить в рамках скафолдинга экшены и представления? Как использовать статический скафолдинг? Как изменить шаблоны скафолдинга? Как добавить собственный редактор свойств? Как использовать скафолдинг С классами, отображёнными с помощью Hibemate? Резюме.

ГЛАВА 14 Безопасность. Как защитить приложение от атак на основе SQL-инъекций? Как защитить приложение от межсайтового скриптинга (XSS)? Как использовать кодеки? Как ограничить методы НПР-запроса, которые Могут вызвать экшен? Как в приложении реализовать аутентификацию? Как использовать плагин AcegiSecurity? Как использовать ОрепlD? Резюме

ГЛАВА 15 Тестирование. как выполнить модульное тестирование приnожения? Как создать интеграционные тесты? Как выполнить тестирование методов render и redirect? Как выполнить тестирование библиотек тегов? Как выполнить тестирование доменных классов? Как создать функциональный тест с помощью Сапоо WebТest?. 356 Резюме

ГЛАВА 16 Разнообразные советы Для чего нужен сервисный уровень? Как в Grails можно использовать некоторые передовые возможности Spring? Как настроить приложение с помощью внешних файлов? Как в приложении настроить журнaлирование? Как использовать Grails вместе с Maven 2? Как использовать Grails вместе с REsn. Как в Grails создать Web-сервисы SOAP с помощью CXF? Резюме