SlideShare ist ein Scribd-Unternehmen logo
1 von 17
Groovy  on Grails Groovy  — объектно-ориентированный язык программирования, разработанный для платформы Java, как альтернатива языку  Java  с возможностями  Python ,  Ruby  и  Smalltalk . «Меньше «скучного» оформительского   кода  –  больше простых, читаемых и элегантных решений» HelloWorld: println  "Hello world!"  // ";" можно не ставить
Строки def  age = 20 def  simpleStr =  'My age is $age'  //  Значение  - "My age is $age" def  interpStr =  "My age is $age"  //  Значение  - "My age is 20" def  multiline =  ''' First line Second line Third line '''
Ranges def  rng = 1..10 rng. size ()  // Получение длины rng. contains (5)  // Проверить наличие элемента rng. from   // Получить начало rng. top   // Получить конец
Списки def  someList = [1,2,3,4]  // Создание списка def  emptyList = []  // Создание пустого списка someList[0]  // Обращение к элементу по индексу someList[5] = 6  // Добавление элемента в список someList << 7 << 8  // Добавление элементов в конец списка someList += [ 9, 10 ]  // &quot;Приклеивание&quot; списка someList[1..3]  // &quot;Срезка&quot; списка - получение подсписка someList[2..4] = [ 12, 13, 14 ]  // Изменение подсписка someList[1,3,5..7,9]  // Получение подсписка for  ( e  in  someList ) { println e  // Распечатываем все элементы списка someList }
Коллекции других типов def  linkedList = [1,2,3] as LinkedList def  set = [1,2,3] as Set def  array = [1,2,3] as Integer[] Spread Operator:   [1,2,3] * .Plus (5)  // Результат [6,7,8]
Maps def  someMap = [  'a'  : 1,  'b'  : 2 ]  // Объявление def  emptyMap = [:]  // Объявление пустого отображения   someMap[ 'a' ]   // Доступ к элементу someMap.a  // Доступ к элементу как к полю   someMap[ 'a' ] = 2  // Изменение элемент someMap.a = 2  // Изменение элемента, как поля
Замыкания new  File( 'file.txt' ).eachLine( { line -> println line } )  // Распечатываем каждую строку файла def  plus = { a, b -> a + b } def  do = { println  &quot;done&quot;  } def  forEvery3rd( list, block ) { def  i = 0 for  ( e  in  list ) { if  ( i % 3 == 0 ) block( i ) i ++ } }
Встроенные переменные ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Currying  и динамические объекты C urring  — возможность получить новое замыкание, зафиксировав часть аргументов старого. Например:   def  add = { a, b -> a + b }  // Замыкание - сложение двух объектов def  add1 = add.curry( 1 )  // Замыкание - сложение единицы и одного из объектов Expando.  Суть этих объектов в том, что они не имеют предопределенных полей и методов, однако они могут быть определены прямо в процессе выполнения def obj =  new  Expando(); obj.a = 1  // Создаем новое поле obj.b = 2  // Создаем новое поле obj. do  = { println  &quot;done&quot;   }  // Добавляем новый метод к объекту
Создание классов и «фишка» оператора  If class  Greet { def  name Greet(who) { name = who[0].toUpperCase() + who[1..-1] }   def  salute() { println  &quot;Hello $name!“ } } g =  new  Greet( 'world' )  // create object g.salute()  // Output &quot;Hello World!“ def   x=1 if (x=2) println  “x=2″   // Exception
Особенности и «вкусности» ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Идеологическая поддержка
Grails ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Grails – Controller.  Примеры class  TripController { ... def  list = { if(!params.max) params.max = 10 [ tripList: Trip.list( params ) ] } … } def  save = { def  trip = new Trip(params) if(!trip.hasErrors() && trip.save()) { flash.message =  &quot;Trip ${trip.id} created&quot; redirect(   action:show,   id:trip.id   ) } else { render(   view: 'create' ,   model:[trip:trip]   ) } }
Grails – Views.  Примеры < g:each  in =&quot;${tripList}&quot;  status= &quot;i&quot;  var= &quot;trip&quot; > <tr class=&quot;${(i % 2) == 0 ?  'odd'  :  'even' }&quot;> <td> <g:link action=&quot;show&quot; id=&quot;${ trip.id }&quot;>${ trip.id?.encodeAsHTML() }</g:link> </td> </tr> </ g:each >
Grails – Model.  Примеры class  Airline {  static  constraints = { name (blank:false, maxSize:100) url (url:true) frequentFlyer (blank:true) notes (maxSize:1500)  } static  hasMany = [trip:Trip] String  name String  url String  frequentFlyer String  notes String  toString(){ return name } }
Grails – TagLib.  Примеры class  DateTagLib { def  thisYear = { out << Calendar.getInstance().get(Calendar.YEAR) } } <div id=&quot;copyright&quot;> &copy; 2002 - <g:thisYear />, FakeCo Inc. All Rights Reserved. </div> class  DateTagLib { def  thisYear = { out << Calendar.getInstance().get(Calendar.YEAR) } def  copyright = { attrs, body -> out <<  &quot;<div id='copyright'>&quot; out <<  &quot;&copy; ${attrs['startYear']} - ${thisYear()}, ${body()}&quot; out <<  &quot; All Rights Reserved.&quot; out <<  &quot;</div>&quot; } }

Weitere ähnliche Inhalte

Was ist angesagt?

Как перестать отлаживать асинхронный код и начать жить / Андрей Саломатин (Pr...
Как перестать отлаживать асинхронный код и начать жить / Андрей Саломатин (Pr...Как перестать отлаживать асинхронный код и начать жить / Андрей Саломатин (Pr...
Как перестать отлаживать асинхронный код и начать жить / Андрей Саломатин (Pr...Ontico
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование LinuxAnthony Shoumikhin
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование LinuxAnthony Shoumikhin
 
хитрости выведения типов
хитрости выведения типовхитрости выведения типов
хитрости выведения типовcorehard_by
 
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияSergey Platonov
 
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf Conference
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Sergey Platonov
 
"Инструментарий разработчика iOS: Xcode, AppCode и сторонние инструменты". Ма...
"Инструментарий разработчика iOS: Xcode, AppCode и сторонние инструменты". Ма..."Инструментарий разработчика iOS: Xcode, AppCode и сторонние инструменты". Ма...
"Инструментарий разработчика iOS: Xcode, AppCode и сторонние инструменты". Ма...Yandex
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptSergey Platonov
 
JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)Mikhail Davydov
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castRoman Orlov
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Sergey Platonov
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Yauheni Akhotnikau
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеPython Meetup
 
DI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыDI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыPlatonov Sergey
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаSergey Platonov
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
 
Аскетичная разработка браузера
Аскетичная разработка браузераАскетичная разработка браузера
Аскетичная разработка браузераPlatonov Sergey
 
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияPlatonov Sergey
 

Was ist angesagt? (20)

Как перестать отлаживать асинхронный код и начать жить / Андрей Саломатин (Pr...
Как перестать отлаживать асинхронный код и начать жить / Андрей Саломатин (Pr...Как перестать отлаживать асинхронный код и начать жить / Андрей Саломатин (Pr...
Как перестать отлаживать асинхронный код и начать жить / Андрей Саломатин (Pr...
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
 
хитрости выведения типов
хитрости выведения типовхитрости выведения типов
хитрости выведения типов
 
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизация
 
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
"Инструментарий разработчика iOS: Xcode, AppCode и сторонние инструменты". Ма...
"Инструментарий разработчика iOS: Xcode, AppCode и сторонние инструменты". Ма..."Инструментарий разработчика iOS: Xcode, AppCode и сторонние инструменты". Ма...
"Инструментарий разработчика iOS: Xcode, AppCode и сторонние инструменты". Ма...
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
 
JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_cast
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгирование
 
DI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыDI в C++ тонкости и нюансы
DI в C++ тонкости и нюансы
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладка
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++
 
Аскетичная разработка браузера
Аскетичная разработка браузераАскетичная разработка браузера
Аскетичная разработка браузера
 
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализация
 

Ähnlich wie Groovy On Grails

Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.Infinity
 
Groovy presentation on Exception #7 conference
Groovy presentation on Exception #7 conferenceGroovy presentation on Exception #7 conference
Groovy presentation on Exception #7 conferencevoituk
 
Принципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DПринципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DAndreyGeonya
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf Conference
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptSmartTools
 
JavaScript: хороший тон клиентской разработки
JavaScript: хороший тон клиентской разработкиJavaScript: хороший тон клиентской разработки
JavaScript: хороший тон клиентской разработкиGetDev.NET
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияYandex
 
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.DrupalCampDN
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияYandex
 
Михаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxМихаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxYandex
 
Present saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasovPresent saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasovPavel Vlasov
 
Js Http Request дмитрий котеров
Js Http Request   дмитрий котеровJs Http Request   дмитрий котеров
Js Http Request дмитрий котеровMedia Gorod
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Sergey Schetinin
 
Проникновение в Docker с примерами
Проникновение в Docker с примерамиПроникновение в Docker с примерами
Проникновение в Docker с примерамиДмитрий Столяров
 
Юрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWЮрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWPositive Hack Days
 

Ähnlich wie Groovy On Grails (20)

Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.
 
Perl in practice
Perl in practicePerl in practice
Perl in practice
 
Groovy presentation on Exception #7 conference
Groovy presentation on Exception #7 conferenceGroovy presentation on Exception #7 conference
Groovy presentation on Exception #7 conference
 
Принципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DПринципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.D
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and Doctrine
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
 
JavaScript: хороший тон клиентской разработки
JavaScript: хороший тон клиентской разработкиJavaScript: хороший тон клиентской разработки
JavaScript: хороший тон клиентской разработки
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знания
 
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знания
 
Михаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxМихаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajax
 
Perl 5.10 и 5.12
Perl 5.10 и 5.12Perl 5.10 и 5.12
Perl 5.10 и 5.12
 
Present saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasovPresent saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasov
 
Ruby
RubyRuby
Ruby
 
Js Http Request дмитрий котеров
Js Http Request   дмитрий котеровJs Http Request   дмитрий котеров
Js Http Request дмитрий котеров
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование
 
Clojure #2 (2014)
Clojure #2 (2014)Clojure #2 (2014)
Clojure #2 (2014)
 
Docker penetration
Docker penetrationDocker penetration
Docker penetration
 
Проникновение в Docker с примерами
Проникновение в Docker с примерамиПроникновение в Docker с примерами
Проникновение в Docker с примерами
 
Юрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWЮрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWW
 

Groovy On Grails

  • 1. Groovy on Grails Groovy — объектно-ориентированный язык программирования, разработанный для платформы Java, как альтернатива языку  Java с возможностями Python , Ruby  и Smalltalk . «Меньше «скучного» оформительского   кода – больше простых, читаемых и элегантных решений» HelloWorld: println &quot;Hello world!&quot; // &quot;;&quot; можно не ставить
  • 2. Строки def age = 20 def simpleStr = 'My age is $age' // Значение - &quot;My age is $age&quot; def interpStr = &quot;My age is $age&quot; // Значение - &quot;My age is 20&quot; def multiline = ''' First line Second line Third line '''
  • 3. Ranges def rng = 1..10 rng. size () // Получение длины rng. contains (5) // Проверить наличие элемента rng. from // Получить начало rng. top // Получить конец
  • 4. Списки def someList = [1,2,3,4] // Создание списка def emptyList = [] // Создание пустого списка someList[0] // Обращение к элементу по индексу someList[5] = 6 // Добавление элемента в список someList << 7 << 8 // Добавление элементов в конец списка someList += [ 9, 10 ] // &quot;Приклеивание&quot; списка someList[1..3] // &quot;Срезка&quot; списка - получение подсписка someList[2..4] = [ 12, 13, 14 ] // Изменение подсписка someList[1,3,5..7,9] // Получение подсписка for ( e in someList ) { println e // Распечатываем все элементы списка someList }
  • 5. Коллекции других типов def linkedList = [1,2,3] as LinkedList def set = [1,2,3] as Set def array = [1,2,3] as Integer[] Spread Operator:   [1,2,3] * .Plus (5) // Результат [6,7,8]
  • 6. Maps def someMap = [ 'a' : 1, 'b' : 2 ] // Объявление def emptyMap = [:] // Объявление пустого отображения   someMap[ 'a' ] // Доступ к элементу someMap.a // Доступ к элементу как к полю   someMap[ 'a' ] = 2 // Изменение элемент someMap.a = 2 // Изменение элемента, как поля
  • 7. Замыкания new File( 'file.txt' ).eachLine( { line -> println line } ) // Распечатываем каждую строку файла def plus = { a, b -> a + b } def do = { println &quot;done&quot; } def forEvery3rd( list, block ) { def i = 0 for ( e in list ) { if ( i % 3 == 0 ) block( i ) i ++ } }
  • 8.
  • 9. Currying и динамические объекты C urring — возможность получить новое замыкание, зафиксировав часть аргументов старого. Например:   def add = { a, b -> a + b } // Замыкание - сложение двух объектов def add1 = add.curry( 1 ) // Замыкание - сложение единицы и одного из объектов Expando. Суть этих объектов в том, что они не имеют предопределенных полей и методов, однако они могут быть определены прямо в процессе выполнения def obj = new Expando(); obj.a = 1 // Создаем новое поле obj.b = 2 // Создаем новое поле obj. do = { println &quot;done&quot; } // Добавляем новый метод к объекту
  • 10. Создание классов и «фишка» оператора If class Greet { def name Greet(who) { name = who[0].toUpperCase() + who[1..-1] }   def salute() { println &quot;Hello $name!“ } } g = new Greet( 'world' ) // create object g.salute() // Output &quot;Hello World!“ def x=1 if (x=2) println “x=2″ // Exception
  • 11.
  • 13.
  • 14. Grails – Controller. Примеры class TripController { ... def list = { if(!params.max) params.max = 10 [ tripList: Trip.list( params ) ] } … } def save = { def trip = new Trip(params) if(!trip.hasErrors() && trip.save()) { flash.message = &quot;Trip ${trip.id} created&quot; redirect( action:show, id:trip.id ) } else { render( view: 'create' , model:[trip:trip] ) } }
  • 15. Grails – Views. Примеры < g:each in =&quot;${tripList}&quot; status= &quot;i&quot; var= &quot;trip&quot; > <tr class=&quot;${(i % 2) == 0 ? 'odd' : 'even' }&quot;> <td> <g:link action=&quot;show&quot; id=&quot;${ trip.id }&quot;>${ trip.id?.encodeAsHTML() }</g:link> </td> </tr> </ g:each >
  • 16. Grails – Model. Примеры class Airline { static constraints = { name (blank:false, maxSize:100) url (url:true) frequentFlyer (blank:true) notes (maxSize:1500) } static hasMany = [trip:Trip] String name String url String frequentFlyer String notes String toString(){ return name } }
  • 17. Grails – TagLib. Примеры class DateTagLib { def thisYear = { out << Calendar.getInstance().get(Calendar.YEAR) } } <div id=&quot;copyright&quot;> &copy; 2002 - <g:thisYear />, FakeCo Inc. All Rights Reserved. </div> class DateTagLib { def thisYear = { out << Calendar.getInstance().get(Calendar.YEAR) } def copyright = { attrs, body -> out << &quot;<div id='copyright'>&quot; out << &quot;&copy; ${attrs['startYear']} - ${thisYear()}, ${body()}&quot; out << &quot; All Rights Reserved.&quot; out << &quot;</div>&quot; } }