Zróbmy to szybko - Groovy i Grails w akcji



Podobne dokumenty
WYKORZYSTANIE JĘZYKA GROOVY W TESTACH JEDNOSTKOWYCH, INTEGRACYJNYCH I AUTOMATYCZNYCH. Mirosław Gołda, Programista Java

KOTLIN. Język programowania dla Androida

Zwinne i lekkie aplikacje webowe z. Jacek Laskowski

Programowanie obiektowe

Programowanie obiektowe

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Tworzenie aplikacji w języku Java

Grails. v 1.1 Web Framework

Programowanie obiektowe zastosowanie języka Java SE

Wstęp Opis języka Dodatkowe możliwości Jak to działa Podsumowanie. Groovy. Michał Lenart 15.XII.2008

Programowanie obiektowe

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Dokumentacja do API Javy.

Produktywne tworzenie aplikacji webowych z wykorzystaniem Groovy i

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

1 Atrybuty i metody klasowe

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

Klasy abstrakcyjne, interfejsy i polimorfizm

JAVA. Platforma JSE: Środowiska programistyczne dla języka Java. Wstęp do programowania w języku obiektowym. Opracował: Andrzej Nowak

Umieszczanie kodu. kod skryptu

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Java Programowanie Obiektowe Ćwiczenie 1- wprowadzenie

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Platformy Programistyczne Podstawy języka Java

Wykład 1: Wprowadzenie do technologii Java

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Programowanie obiektowe

Programowanie obiektowe

Wprowadzenie do języka Java

JavaScript funkcyjność

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Programowanie Obiektowe GUI

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Java - wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

Na przykładzie języków Java, C# i odrobiny C++ Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Aplikacje w środowisku Java

Google Web Toolkit. Piotr Findeisen

Wykład 4: Klasy i Metody

Multimedia JAVA. Historia

Co jeszcze mogą nam dać adnotacje? Adam Warski

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL III TI 4 godziny tygodniowo (4x30 tygodni =120 godzin ),

AKADEMIA GÓRNICZO-HUTNICZA Wydział Elektrotechniki, Automatyki, Elektroniki i Informatyki

Podstawowe wykorzystanie Hibernate

Języki i metody programowania Java Lab1 Zofia Kruczkiewicz

Podstawowe części projektu w Javie

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Programowanie w Internecie. Java

Podstawy JavaScript ćwiczenia

MeetingHelper. Aplikacja Android ułatwiająca przekazywanie materiałów pomiędzy uczestnikami spotkania. Instrukcja obsługi dla programisty

Podejście obiektowe. Tablice obiektów Przykład 1 metody i atrybuty statyczne oraz niestatyczne

Wprowadzenie db4o - podstawy db4o - technikalia Przydatne wiadomości. Wprowadzenie. db4o. Norbert Potocki. 1 czerwca Norbert Potocki db4o

Programowanie w Ruby

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Projektowanie aplikacji internetowych laboratorium

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

PROGRAMOWANIE W ŚRODOWISKU FLASH wykład 2

Wykorzystywanie parsera DOM w programach Java i PL/SQL

Architektury Usług Internetowych. Laboratorium 2. Usługi sieciowe

Interfejsy i klasy wewnętrzne

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Wykład 7: Pakiety i Interfejsy

Poznaj ASP.NET MVC. Kamil Cieślak Microsoft Student Partner

Programowanie w Ruby

Kurs WWW. Paweł Rajba.

Zaawansowane aplikacje WWW - laboratorium

Java Język programowania

Katedra Architektury Systemów Komputerowych Wydział Elektroniki, Telekomunikacji i Informatyki Politechniki Gdańskiej

Wprowadzenie. Narzędzia i środowiska programistyczne. Laboratorium 1. Prowadzący: Kierunek: Semestr: Rok: Tomasz Gądek Informatyka Zimowy 2

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

OpenLaszlo. OpenLaszlo

Języki i metody programowania Java INF302W Wykład 2 (część 1)

Programowanie w Javie cz. 1 Wstęp. Łódź, 24 luty 2014 r.

Wykład 2: Podstawy Języka

2. Składnia, środowisko i konwencje w Javie

Java Podstawy JUST JAVA Michał Bereta Intytu Modelowania Komputerowego Wydział Fizyki, Matematyki i Informatyki Stosowanej

Testy jednostkowe - zastosowanie oprogramowania JUNIT 4.0 Zofia Kruczkiewicz

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Spis treści. 1 Java T M

Programowanie obiektowe

Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf. Materiały poprawione

[Android] Podstawy programowania

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Zrąb Grails. Bartosz Bekier

Programowanie obiektowe

Dawid Gierszewski Adam Hanasko

Programowanie obiektowe

1. Co będzie wynikiem wykonania poniŝszych instrukcji? g2d.gettransform().scale(1, -1); g2d.gettransform().translate(4, -8); g2d.drawline(4, 0, 4, 4);

Akademia ETI. Wprowadzenie do programowania w Javie PG Java User Group Przemysław Kulesza

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Zaawansowane aplikacje internetowe laboratorium

SZKOLENIE TWORZENIE SYSTEMÓW

Microsoft IT Academy kurs programowania

Programowanie w Javie

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Krótka Historia. Co to jest NetBeans? Historia. NetBeans Platform NetBeans IDE NetBeans Mobility Pack Zintegrowane moduły. Paczki do NetBeans.

Pierwsze kroki. Algorytmy, niektóre zasady programowania, kompilacja, pierwszy program i jego struktura

Transkrypt:

Zróbmy to szybko - Groovy i Grails w akcji Adam Dudczak ( adudczak@gmail.com ) Poznań Java User Group

Plan prezentacji 1 Wprowadzenie 2 Najciekawsze konstrukcje języka Klasy i skrypty Domknięcia Pozostałe 3 Making things more Groovy Groovy Builders Operacje I/O GSQL Ant, GAnt i Maven Czy coś jeszcze? 4 Grails Quest for the Holy Grails Pierwsza aplikacja 5 Zakończenie

Wprowadzenie Groovy is like a super version of Java. It can leverage Java s enterprise capabilities but also has cool productivity features like closures, builders and dynamic typing. If you are a developer, tester or script guru, you have to love Groovy. Czym jest Groovy? JSR 241: The Groovy Programming Language Łatwość programowania, najlepsze pomysły z wielu języków The code look like what it does Łatwy do opanowania dla programistów Javy Dynamicznie typowany

Wprowadzenie Co to znaczy dynamicznie typowany? Jeżeli nie zadeklarujesz typu, tak naprawdę nigdy nie wiesz jaki typ przypisało mu Groovy Jeżeli dostarczymy infromacje o typie, Groovy dopilnuje, żeby wszystko było jak w Javie.

Plan prezentacji 1 Wprowadzenie 2 Najciekawsze konstrukcje języka Klasy i skrypty Domknięcia Pozostałe 3 Making things more Groovy Groovy Builders Operacje I/O GSQL Ant, GAnt i Maven Czy coś jeszcze? 4 Grails Quest for the Holy Grails Pierwsza aplikacja 5 Zakończenie

Piszemy w Groovy? Dwa podstawowe sposoby pisania kodu: klasy - zupełnie jak w Javie skrypty - trochę inaczej niż w Javie Pakiety, importy, metody - tak samo jak w Javie Groovy domyślnie importuje następujące pakiety: java.lang, java.io, java.math, java.net, java.util, groovy.lang, groovy.util Najważniejsza różnica : Groovy domyślnie zakłada, że wszystko jest public. Niektóre rzeczy są opcjonalne np. średniki na końcu wyrażenia, nawiasy w wywołaniach metod czy instrukcja return.

I tak wszyscy skończymy jako bytecode... :) Na poziomie JVM klasy Groovy wyglądają tak samo jak klasy Javowe. Model dziedziczenia w Groovy jest taki sam jak w Javie. Co z tego wynika? Możemy dziedziczyć, implementować, odwoływać się do klas Groovy w Javie. Działa to w obie strony, tak długo jak długo nie występują zależności cykliczne

Skrypty Groovy Nie musimy tworzyć klas aby pisać w Groovy. println "Witajcie na PJUG u!" >> Witajcie na PJUG u! Wszystkie zmienne w skryptach są deklarowane w zakresie lokalnym. W skryptach (tylko!) istnieją wiązania (ang. bindings) String localvar = "I am a local variable" bindingvar = "I am a binding variable"

Zasięg deklarowanych zmiennych Klasy Zasięg zmiennych w klasie class GroovyClass { def static prefix = "Mr. " def static printer(def name, def surname) { println prefix+ " "+ name + " " + surname; static void main(args) { printer("name","surname") Wynik działania Mr. Name Surname

Zasięg deklarowanych zmiennych Skrypty Użycie wiązania prefix = "Mr. " def printer(def name, def surname) { println prefix+ " "+ name + " " + surname; printer("name","surname") Wynik działania Mr. Name Surname

Zasięg deklarowanych zmiennych Skypty Wszystkie zmienne deklarowane w skrypcie mają zasięg lokalny! def prefix = "Mr. " def printer(def name, def surname) { println prefix+ " "+ name + " " + surname; printer("name","surname") Wynik działania Exception in thread main groovy.lang.missingpropertyexception: No such property: prefix

Deklarowanie zmiennych Deklarując zmienne musimy podać nazwę typu lub użyć słowa kluczowego def. Użycie def oznacza, że: Nie interesuje mnie jakiego typu jest to zmienna. Aby ułatwić zrozumienie, potraktuj def jako Javowy Object (!). Przykład def dynamic = 1 dynamic = "String w zmiennej typowanej dynamicznie" int typed = 2 typed = "Czy da się wrzucić String do zmiennej typu int?" // throws ClassCastException

Deklarowanie metod Deklarowanie metod def concat(def name, def surname) { name + " " + surname; //return i ; są opcjonalne!! int adder(int first, int second){ first + second void concatvoid(def name, def surname) { name + " " + surname; println adder(1,3) +" "+ concat("adam","dudczak") println concatvoid("adam","dudczak") Wynik działania metody 4 Adam Dudczak null

Domknięcia A closure in Groovy is an anonymous chunk of code that may take arguments, return a value, and reference and use variables declared in its surrounding scope. Pod wieloma względami przypomina klasy anonimowe Czym się to różni od zwykłego nie nazwanego bloku kodu? Gdy JVM napotka zwykły blok kodu wykonuje go od razu. Domknięcie jest wywoływane dopiero gdy nastąpi do niego odwołanie. Składnia wygląda tak: { [closurearguments->] statements

Zmienne it Zmienna specjalna it jest automatycznie deklarowane wewnątrz domknięcia (ang. closure). Zostaje jej przypisana wartość pierwszego parametru albo null - jeżeli nie ma parametrów. def c = { it assert c() == null assert c(1) == 1 Zagnieżdzone domknięcia i wartość it def outer = { def inner = { it+1 inner(it+1) assert outer(1) == 3

Domknięcia przykłady Przypisanie domknięcia do zmiennej def c = { println it; //wywolania c("test") c.call("test2") Obsługa zdarzeń Button b = new Button ("Push Me"); b.onclick { buttonclicked()

Domknięcia przykłady Przekazywanie domknięć do metod (1..3).each { i -> println "Hello ${i" Wynik Hello 1 Hello 2 Hello 3

Domknięcia przykłady Przekazywanie domknięć do metod def map = [ad:"be", ce:"de"] map.each { println it.key +" value "+it.value Wynik ce value de ad value be

Domknięcia przykłady Domknięcie mogą być kluczami w mapie f = { println "f called" m = [ (f): 123 ] println m.get(f) // 123 println m[f] // 123 Domknięcie jako wartości w mapie m = [ f: { println "f called" ] (m.f)() // f called

Instrukcje warunkowe i pętle Instrukcje warunkowe (if/switch) są kompatybilne z składnią Javy. Największa różnica jest w składni switch a: switch ( x ) { case "foo": result = "found foo" break case [4, 5, 6, inlist ]: result = "list" break case Integer: result = "integer" break

Instrukcje warunkowe i pętle Pętla for wygląda trochę inaczej... def x = 0 for ( i in 0..9 ) { x += i //iterowanie po znakach w Stringu def text = "abc" def list = [] for (c in text) { list.add(c)

Kolekcje Składnia Groovy oferuje wiele rozszerzeń w stosunku do kolekcji znanych z Javy. Kolekcje w Groovy def list = [5, 6, 7, 8] assert list.get(2) == 7 assert list[2] == 7 assert list instanceof java.util.list def range = 5..8 assert range.size() == 4 def map = [name:"gromit", likes:"cheese", id:1234] def emptymap = [:]

Smaczki Operacje na każdym elemencie kolekcji: assert [1, 3, 5] == [ a, few, words ]*.size() Przeciążanie operatorów :) Wystarczy, że dodasz do swojego obiektu odpowiednią metodę np. plus(twój typ a). Dodawanie metod do obiektów w runtime.

Plan prezentacji 1 Wprowadzenie 2 Najciekawsze konstrukcje języka Klasy i skrypty Domknięcia Pozostałe 3 Making things more Groovy Groovy Builders Operacje I/O GSQL Ant, GAnt i Maven Czy coś jeszcze? 4 Grails Quest for the Holy Grails Pierwsza aplikacja 5 Zakończenie

Groovy Builders Struktury drzewiaste w programowaniu spotykamy na każdym kroku. Groovy wspiera: Tworzenie wszelkiego XML a: skryptów Ant a, Jelly, XHTML, XSD, konfiguracja Spring. Budowanie GUI: Swing, SWT, sceny Java3d (!). Można oczywiście tworzyć własne implementacje, dziedzicząc z groovy.util.buildersupport - implementujemy w Javie.

MarkupBuilder Tworzenie XML a import groovy.xml.*; writer = new StringWriter() builder = new MarkupBuilder(writer) builder.document(name:"a document") { chapter(name:"first one") { page1("first page") page2("second page") chapter(name:"first two") { page1("page 1") page2("page 2" ) println(writer.tostring())

MarkupBuilder Wynik <document name="a document"> <chapter name="first one"> <page1>first page</page1> <page2>second page</page2> </chapter> <chapter name="first two"> <page1>page 1</page1> <page2>page 2</page2> </chapter> </document>

SwingBuilder Wynik import javax.swing.*; import java.awt.* swing = new groovy.swing.swingbuilder() frame = swing.frame(defaultcloseoperation : JFrame.EXIT_ON_CLOSE, title : "pjug Frame", size : new Dimension(400, 100)) { label = label(text:"groovy!", constraints: BorderLayout.NORTH) panel { button(text: "More groove!", actionperformed : { label.settext("groovy!!!")) label.font = label.font.derivefont(label.font.size2d + 10 as Float) frame.visible = true

SwingBuilder Wynik import javax.swing.*; import java.awt.* swing = new groovy.swing.swingbuilder() frame = swing.frame(defaultcloseoperation : JFrame.EXIT_ON_CLOSE, title : "pjug Frame", size : new Dimension(400, 100)) { label = label(text:"groovy!", constraints: BorderLayout.NORTH) panel { button(text: "More groove!", actionperformed : { label.settext("groovy!!!")) label.font = label.font.derivefont(label.font.size2d + 10 as Float) frame.visible = true

SwingBuilder Wynik import javax.swing.*; import java.awt.* swing = new groovy.swing.swingbuilder() frame = swing.frame(defaultcloseoperation : JFrame.EXIT_ON_CLOSE, title : "pjug Frame", size : new Dimension(400, 100)) { label = label(text:"groovy!", constraints: BorderLayout.NORTH) panel { button(text: "More groove!", actionperformed : { label.settext("groovy!!!")) label.font = label.font.derivefont(label.font.size2d + 10 as Float) frame.visible = true

Operacje na plikach Czytanie pliku w jednej linii kodu? new File("foo.txt").eachLine { line -> println(line) Można też tak... new File("foo.txt").withReader { reader -> while (true) { def line = reader.readline()

Czytanie XML a Przykład sieciowy import groovy.util.*; def rssfeed = "http://www.jug.werla.pl/?feed=rss2"; def xmlfeed = new XmlParser().parse(rssFeed); (0..< xmlfeed.channel.item.size()).each { def item = xmlfeed.channel.item.get(it); def title = item.title.value[0]; def link = item.link.value[0]; println title + " : " + link;

Czytanie XML a przykład sieciowy Przykład sieciowy wyniki \Zróbmy to szybko" - Groovy i Grails : http://www.jug.werla.pl/?p=16 Logo PJUG : http://www.jug.werla.pl/?p=10 Nowy serwis JUG Poznań : http://www.jug.werla.pl/?p=5 Java 6 : http://www.jug.werla.pl/?p=7

GSQL users = xml.users { sql.eachrow( "select USER_LOGIN, USER_TYPE, USER_ID from USERS") { row -> user( id:row[ USER_ID ], type:row[ USER_TYPE ]) { email(row[ USER_LOGIN ]) Szybki przykład na to co zostało z JDBC import groovy.sql.sql; import groovy.xml.markupbuilder def xml = new MarkupBuilder() def sql = Sql.newInstance( "jdbc:hsqldb:file:e://temp//groovy//eval", "sa","", "org.hsqldb.jdbcdriver")

GSQL Wyniki <users> <user type="10" id="1"> <email>adudczak@gmail.com</email> </user> <user type="1" id="2"> <email>test@test.pl</email> </user> </users>

GSQL - Datasets Dataset - przykład def users = sql.dataset( USERS ) users.each { println it.user_login users.add(user_login: jug@poznan.pl, USER_TYPE: 1, USER_PASS: test ); users.each { println it.user_login Można jeszcze : findall, createview... http://groovy.codehaus.org/apidocs/groovy/sql/ DataSet.html

Groovy i Ant Jednym z głównych celów do jakich na początku było używane/wymyślane Groovy było usprawnienie budowania projektów. Groovy oferuje sporo rozwiązań umożliwiających integrację z Ant em. Groovy Ant Task Groovyc Ant Task - zadanie wywołuje kompilator groovyc. AntBuilder

Groovy Ant Task Wymagania : groovy-all-xxx.jar w classpath Deklaracja zadania w naszym projekcie: <taskdef name="groovy" classname="org.codehaus.groovy.ant.groovy" classpathref="my.classpath"/> Do czego mamy dostęp: instancji AntBuilder a (obiekt: ant) skonfigurowanego dla naszego projektu obiekty: project, properties, target, task Możemy tworzyć skrypt pomiędzy znacznikami groovy korzystając z dostępnych obiektów. Wskazać zewnętrzny plik z kodem Groovy.

Groovy Ant Task Groovy Ant Task - przykłady <groovy> println("hello World") </groovy> <groovy> ant.echo("hello World") </groovy> <groovy src="/some/directory/some/file.groovy"> <classpath> <pathelement location="/my/groovy/classes/directory"/> </classpath> </groovy>

Ant Builder i Gant Ant Builder pozwala zastąpić xml kodem Groovy. Właśnie na tym bazuje GAnt - kod groovy zamiast xml a. build.gant zamiast build.xml. AntBuilder - przykład ant.echo("hello World!") ant.mkdir(dir:"/home/ad/jug")

Ant Builder i Gant AntBuilder - przykład includetargets << gant.targets.clean //predefined task cleanpattern << [ **/*~, **/*.bak ] cleandirectory << build //domyślne zadanie rozponawane jest po nazwie task ( default : The default target. ) { println ( Default ) depends ( clean ) Ant.echo ( message : A default message from Ant. ) otherstuff ( ) task ( otherstuff : Other stuff ) { println ( OtherStuff ) Ant.echo ( message : Another message from Ant. ) clean ( )

Ant Builder i Gant But then Gant is not about replacing Ant, it is about having a different way of working with the tasks and infrastructure that Ant provides. Więcej informacji można znaleźć : http://groovy.codehaus.org/gant

Groovy Maven Plugin Pozwala wykonywać i kompilować kod Groovy w Maven2 <plugin> <groupid>org.codehaus.mojo</groupid> <artifactid>groovy-maven-plugin</artifactid> <executions> <execution> <phase>generate-resources</phase> <goals> <goal>execute</goal> </goals> <configuration> <source> <!-- groovy+ant+maven :) --> <body> if (project.packaging!= "pom") { log.info("copying some stuff...") def ant = new AntBuilder() def dir = "${project.basedir/target/classes/meta-inf"... ant.mkdir(dir: dir) ant.copy(todir: dir) { fileset(dir: "${project.basedir") { include(name: "LICENSE.txt") include(name: "NOTICE.txt") </body>

Czy coś jeszcze? Groovlets COM Scripting Google Data Support Gram - narzędzie al a xdoclet. Groovy Jabber-RPC Groovy Monkey - skryptowanie w Eclipse IDE, oparte na Eclipse Jobs API. Groovy SOAP GSP - o tym jeszcze będzie. Native Launcher - tworzenie natywnych plików wykonywalnych (nasz.exe). XMLRPC

Plan prezentacji 1 Wprowadzenie 2 Najciekawsze konstrukcje języka Klasy i skrypty Domknięcia Pozostałe 3 Making things more Groovy Groovy Builders Operacje I/O GSQL Ant, GAnt i Maven Czy coś jeszcze? 4 Grails Quest for the Holy Grails Pierwsza aplikacja 5 Zakończenie

Quest for the Holy Grails DRY (Don t Repeat Yourself) Convention-over-configuration, configuration by excpetion... Łatwość dokonywania zmian i ich natychmiastowy efekt Wykorzystanie tego wszystkiego co zostało już napisane (w Javie).

Grails Kilka słów wstępu Grails zostało oparte na sprawdzonych rozwiązaniach Javowych: Hibernate Spring SiteMesh GROOVY! GORM, GSP Ant, Jetty Do tego : Prototype, Dojo, Yahoo UI jako wsparcie dla tworzenie aplikacji AJAX owych. Funkcjonalność Grails budują wtyczki - używamy tylko tego co potrzebne.

Grails prosto z pudełka Bezproblemowa instalacja - http://grails.org/installation. Możemy praktycznie od razu przystąpić do pracy! Grails to wszystko czego nam trzeba - nie ma potrzeby instalować dodatkowego oprogramowania np. Tomcat a czy bazy danych.... Grails to narzędzie którym operujemy z konsoli, to tak naprawdę zestaw całkiem sprytnych skryptów Ant/GAnt.

Pierwsza aplikacja Pierwsze kroki... projects> grails create-app... create-app: [input] Enter application name: jug-app... BUILD SUCCESSFUL projects> cd jug-app jug-app> grail run-app... Co się dzieje? Grails startuje Jetty, przeprowadza deployment naszej aplikacji, inicjalizuje i uruchamia...

Grails Pierwsza aplikacja http://localhost:8080/jug-app :

Grails Struktura projektu Struktura wygenerowanego projektu:

Grails Rozwijanie aplikacji Tworzenie klasy domenowej jug-app>grails create-domain-class... name not specified. Please enter: Meeting... Co zostało wygenerowane? Stworzone zostaną dwie klasy : jug-app/grails-app/domain/meeting.groovy, jug-app/grails-tests/meetingtests.groovy. Po utworzeniu są puste.

Grails Rozwijanie aplikacji Tworzenie klasy domenowej class Meeting { String topic String place static hasmany = [attendies:attendee] Static...? Za pomocą takich właśnie statycznych pól modeluje się relacje między klasami domenowymi. W tym wypadku oznajmiamy, że Meeting może mieć wielu Attendee, a informacja o nich będzie składowana w zmiennej attendies.

Grails Rozwijanie aplikacji Tworzenie klasy domenowej Attendee class Attendee { Meeting meeting String name String surname String address static belongsto = Meeting static optionals = ["address"] Własności opcjonalne Domyślnie wszystkie pola są wymagane. Pole statyczne optionals zawiera informację o polach opcjonalnych. Natomiast pole belongsto indetyfikuje stronę posiadającą w relacji 1 do n.

GORM Skąd Grails wie co ma być wrzucane do bazy? GORM zakłada, że do bazy danych trafia wszystko co znajduję się w katalogu z klasami domenowymi!! Domyślną bazą danych jest HSQLDB który jest wbudowany w Grails. Można to zmienić w plikach: grails-app/conf/developemntdatasource.groovy grails-app/conf/testdatasource.groovy grails-app/conf/productiondatasource.groovy

Grails Tworzenie kontrolerów Tworzenie kontrolerów - Meeting jug-app>grails create-controller... create-controller: [input] Enter controller name: Meeting... [echo] Created controller : grails-app/controllers/meetingcontroller.groovy... Analogicznie postępujemy dla klasy Attendee.

Grails Scaffold Scaffold class AttendeeController { def scaffold = Attendee Scaffold - czyli rusztowanie albo szafot :) Grails powinien dynamicznie wygenerować kontroler (wraz z widokami) pozwalający na realizacje podstawowych operacji CRUD ( ang. create-read-update-delete)

Grails Walidacja Meetings - walidacja class Meeting { //... static constraints = { topic(maxlength:70,blank:false) place(inlist:[ pub, zoo ], blank:false)

Grails Kolejność kolumn w formularzach Meetings - Kolejność kolumn w formularzach class Meeting { //... String tostring() {" ${this.topic : ${this.place Kolejny ciekawy mechnizm w Groovy - GStrings. Zmienne z dolarami zostaną podmienione przez odpowiednie wartości.

Plan prezentacji 1 Wprowadzenie 2 Najciekawsze konstrukcje języka Klasy i skrypty Domknięcia Pozostałe 3 Making things more Groovy Groovy Builders Operacje I/O GSQL Ant, GAnt i Maven Czy coś jeszcze? 4 Grails Quest for the Holy Grails Pierwsza aplikacja 5 Zakończenie

Podsumowanie Mimo iż Groovy jest projektem dość młodym (Groovy 1.0 w styczniu 2007) to istnieje już spora liczba projektów związanych z tym jezykiem. Grails nie osiągnął jeszcze wersji 0.5, a już sprawdza się w zastosowaniach komercyjnych/produkcyjnych. W sieci można znaleźć całkiem sporo przykładów.

Podsumowanie Dokumentacja na stronach projektu jest również bardzo bogata choć zawiera sporo błędów/zaszłości. Eclipse, Netbeans jak i IntelliJ Idea oferują wtyczki do pracy z Groovy Ant i Maven są również gotowe do współpracy z G.

Czytanki Groovy Project Site : http://groovy.codehaus.org Grails Project Site : http://grails.codehaus.org Groovy Closures : http://groovy.codehaus.org/closures Practically Groovy: JDBC programming with Groovy by Andrew Glover http://www-128.ibm.com/developerworks/java/library/ j-pg01115.html Groovy Ant Scripting : http://docs.codehaus.org/display/groovy/ant+scripting Groovy Javadocs : http://groovy.codehaus.org/apidocs/index.html

Czytanki Getting Started with Grails by Jason Rudolph http://www.infoq.com/minibooks/grails More Java3D and Groovy Builders http://langexplr.blogspot.com/2007/03/ more-java3d-and-groovy-builders.html Persistence Made Easy with Groovy and JPA by Romain Guy http://www.curious-creature.org/2007/03/25/ persistence-made-easy-with-groovy-and-jpa/

Czytanki Interview with Dr. Paul King and Jon Skeet about Groovy http://javaposse.com/index.php?post_id=175667 Grails Podcast http://grails.codehaus.org/grails+podcast Grails Screencasts http://grails.codehaus.org/grails+screencasts

Pytania?