Jag har utvecklat webb-applikationer i Grails sedan 2007, efter det att jag först bekantat mig med Groovy tidigare det året.
Språket Groovy såg dagens ljus redan i augusti 2003, då James Strachan skickade ut ett meddelande (nästan lika legendariskt som det Linus Torvalds skickade ut i början på 90-talet – men då alltså om Linux) om att han börjat vidareutveckla språket Java, genom att skapa det dynamiska JVM språket Groovy.
Grails började utvecklas en bit före 2007 (av Graeme Rocher) och hade då namnet “Groovy on Rails”, vilket klart signalerade att det var en rip-off av Ruby on Rails. Efter att några jurister dykt upp med verbala påkar, ändrades namnet till kort och gott Grails. Logotypen för också tanken till the quest for the Holy Grail.
Tidigare, hade jag byggt webb-applikationer i Java m.h.a. ramverk, som Struts, WebWork och Spring-MVC. De hade alla det gemensamt att det var mycket att konfigurera. Centrala delar av applikationens arkitektur skrevs i diverse XML filer. Databas-lagret hanterades av Hibernate eller (Gud förbjude) Entity EJBs. Dessutom var man helt beroende av generator-verktyg som XDoclet, för att inte drunkna i allt manuellt arbete conf/xml skrivande.
Grails ändrade helt på allt detta genom principen on configuration by convention.
Domänklasser och databaser
Skriver man en GroovyBean klass (t.ex. Person.groovy
) och placerar den i katalogen grails-app/domain
, så är allt som har med konfigurering av DB persistens klart!
Grails hanterar via Spring Framework och Hibernate alla kopplingar och konfigureringar helt utan att man behöver lägga sig i. Man kan dock tweaka varje aspekt om det behövs, för att t.ex. anpassa sig till legacy data.
Webbaktioner
Skapar man en klass med ett gäng metoder (t.ex. PersonController.groovy
) och lägger klassen i katalogen grails-app/controllers
, så har man en färdig webb-tjänst för URI:er liknande denna
http://myhost/myapp/person/show/17
Fragmentet /person/
pekar ut PersonController och fragmentet show
pekar ut action-metoden med samma namn i just den klassen, samt 17 anger DB id for person-objektet i fråga.
GSP – Groovy Server Pages
Webb-vyer skriver man i GSP, som är samma ide som JSP, men med Groovy i stället. Det innebär att man primärt skriver HTML assisterad av ett rik flora av taglibs. Här och där spränger man in Groovy uttryck som hämtar ut data från olika GroovyBeans.
Så här hänger det ihop: Antag att URI:n ovan anropas. Först selekteras kontrollern Person varpå anropas aktionmetoden show()
där parametern params.id
har värdet 17. Metoden show() hämtar upp person-objektet från databasen på följande enkla sätt:
def thePersonFound = Person.get(params.id)
Metoden show()
förväntas sedan returnera en map med dataobjekt som ska exponeras (t.ex. [bean:thePersonFound]
. Eftersom aktionmetoden heter show, så anropas motsvarande GSP i katalogen views/person/show.gsp
, som genererar HTML och skickar (via SiteMesh – se nedan) detta till webbläsaren.
Antag att person-klassen innehåller bl.a. property:n String name, då går det att söka via namnet
def p = Person.findByName('Anna Conda')
eller
def p = Person.findByNameLike('Ann%')
Detta är så kallade dynamiska finders och genereras automatiskt baserat på vilka properties som finns deklarerade i domänklassen. Det finns också en hel del andra sätt att söka på och sammanställa databas-information.
Egna taglibs
På liknande sätt som ovan, så skapar man lekande lätt egna taglibs genom att skriva en klass (t.ex. UtilsTagLib.groovy
) och placera denna i katalogen grails-app/taglib
. Varje metod blir en tag som kan användas på en GSP-sida.
Sidlayoter
Layout för en hel webbsida hanteras (bakom kulisserna) av SiteMesh. Som Grails programmerare behöver man bara fixa till en GSP sida med övergripande layout för webbplatsen och markera ut var innehållet (content) ska petas in. Det innebär att genererad HTML från en vy strippas på HEAD sektionen och innehållet innanför BODY taggen substitueras in på rätt plats i layout GSP:n och resultatet skickas till webbläsaren.
Transaktionella tjänsteobjekt
Skapar man en klass (t.ex. BusinessService.groovy
) innehållande deklarationen
static transactional = true
samt placerar klassen i katalogen grails-app/services
, så vips har man ett transaktionellt tjänsteobjekt, som bakom kulisserna använder Springs transactional-service och transaktion-hanteringen hos databasen.
Detta innebär bl.a. att om en av metoderna kastar ett undantag (runtime exception) så görs det en roll-back på transaktionen. Vidare, så propageras aktuell transaktion om den transaktionella tjänstemetoden anropar andra tjänstemetoder i samma eller andra tjänsteobjekt.
Och mer där till…
Så här kan jag hålla på och rada upp fördelar/egenskaper, såsom att det finns mycket bra stöd för AJAX-anrop, att det är mycket enkelt att skapa REST baserade webbtjänster, o.s.v.
Det är enkelt att konfigurera stöd för 2nd-level cache och olika typer av databaser som MySQL, Oracle, PostgreSQL, MS SQL-Server etc. Det finns också stöd för ett flertal NoSQL databaser, såsom MongoDB, SimpleDB, Redis, CouchDB med flera.
Grails är rent tekniskt ett plugin-ramverk, vilket innebär att alla system-tjänster är plugins. Gillar man inte Tomcat eller Hibernate, så går de att byta ut. Det finns idag ett mycket stort utbud av Grails-plugins, som gör att arbetet går ännu snabbare, eftersom många gånger hittar man en plugin, som redan implementerar det man hade tänkt sig att göra själv.
Mitt senaste Grails projekt
När jag inte undervisar för Informator (i ämnen såsom Groovy&Grails, Android, C++, Erlang, Linux, Cloud Computing, …), så är jag CTO och lead-architect för en startup, där vi byggt en SaaS applikation i Groovy och Grails, samt driftsatt den i Amazon AWS molnet. Är du nyfiken på vad det är så kollar du in webbplatsen ProposalsFactory.
Mer om Groovy
Den 21 februari håller jag ett frukost-seminarium om Groovy och GPars. Med GPars biblioteket kan man skriva applikationer, vilka enkelt och bekvämt utnyttjar moderna datorers förmåga att exekvera många aktiviteter parallellt (multi-cpu/core/threading).
Läs hela agendan och anmäl dig här
Blev du nyfiken på Groovy och Grails, så kör jag också kursen Webbapplikationer med Groovy och Grails, för Informator under våren.