Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an...
Transcript of Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an...
![Page 1: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/1.jpg)
Grails – In Depth
Graeme Rocher, CTO – G2One Inc
TS-5764
![Page 2: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/2.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 2
Learn how to dramatically simplify web development on the Java™ platform with Groovy & Grails
![Page 3: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/3.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 3
Your Speaker
Graeme Rocher• Project Lead of Grails• CTO of G2One Inc – The
Groovy/Grails Company• Member of JSR-241 Expert
Group• Author of “The Definitive
Guide to Grails”
![Page 4: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/4.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 4
Agenda
Introduction to Groovy & GrailsWhy Groovy?Getting StartedSimplified ORMThe Web LayerWeb ServicesEasy Ajax
![Page 5: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/5.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 5
What is Groovy?
Groovy is a dynamic language for the Java Virtual Machine (JVM™)Takes inspiration from Small Talk, Python and Ruby Integrates with the Java languageand platform at every level
![Page 6: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/6.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 6
What is Grails?
A Web platform that implements the full stack from build system down to ORM layerLeverages existing technologies like Spring, Hibernate, Quartz etc. avoiding re-inventing the wheelFeatures and extensible plug-in system and an environment for runtime configuration built on Spring
![Page 7: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/7.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 7
Solid Foundations
SpringHibernateGroovyQuartzSiteMeshJettyApache AntJava Technology
![Page 8: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/8.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 8
Why Groovy & Grails?
All the power of frameworks from other platforms like Ruby on Rails, Django and TurboGearsBuilt from the ground up on Java technologies. • Design for Java technology by Java technology developers
Leverage existing tools and technologies• Distributed caches, replicating technologies etc.• Profiling, monitoring and debugging tools• IDEs
Reduce context switching
![Page 9: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/9.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 9
Getting Started
Download from http://grails.org/DownloadExtract zip to diskSet GRAILS_HOME variable to location on diskAdd $GRAILS_HOME/bin to your environment variables
Download from http://groovy.codehaus.orgExtract zip to diskSet GROOVY_HOME variable to location on diskAdd $GROOVY_HOME/bin to your environment variables
![Page 10: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/10.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 10
Grails – The Basics
Creating and Running
Grails will load by default with an in-memory HSQLDBThe default container is an embedded Jetty ContainerGrails is configured for automatic hot-reloading at runtime
WAR’ing and Deploying
Grails deploys as a standard WAR file deployable onto modern Java EE platform containers In production mode Grails is fully compiled byte code
> grails create-app gtunes> cd gtunes> grails run-app
> grails run-war // or> grails war
![Page 11: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/11.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 11
Getting Started with GrailsCreating and Running
![Page 12: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/12.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 12
A Grails Project
Ant Build
JAR files
Grails Sources
Web Sources
Java Sources
![Page 13: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/13.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 13
Grails Headline Features
GORM - ORM Layer built on HibernateRich conversation support with Web FlowDomain Specific Languages• Validation Rules• ORM Mapping• URL Mapping
Vibrant Plug-in community• http://grails.org/Plugins• Over 40 user contributed plug-ins• Everything from web services to RIA with Flex
![Page 14: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/14.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 14
Grails – The Platform
Java 2 Platform, Enterprise Edition (J2EE™ platform) was too complex. Spring and Hibernate reduced that complexity and became very successfulGrails represents the next level of abstraction for the Java EE platformBuilt on Spring and Hibernate, but dramatically simplifying their usage
![Page 15: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/15.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 15
Easy ORM with GORMclass Album { String title String artist Date releaseDate static hasMany = [songs:Song]}class Song { String title Double duration}
id title artist release_datetable - album
id title duration album_id
table - song
GORM classes, also known as domain classes, go in the domain directory
![Page 16: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/16.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 16
GORM in ActionQuerying and Persistence with GORM
![Page 17: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/17.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 17
The Grails ConsoleActivate with: grails console
![Page 18: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/18.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 18
Persistence Methods
GORM classes automatically provided with CRUD capabilities:• save• get• delete
new Album(title:"Tourist", artist:"Athlete") .addToSongs(title:"Wires", duration:4.20) .save()
def album = Album.get(1)
album.title ="Hot Fuss" album.save()
album.delete()
![Page 19: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/19.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 19
Dynamic Finders & Criteria
def albums = Album.list()
def recentAlbums = Album.findAllByReleaseDateGreaterThan(new Date()-7)
def albumsStartingWithA = Album.findAllByTitleLike("A%")
def albumsWithSongsAboutSummer = Album.withCriteria { songs { like("title", "%Summmer%") } }
List all records
Form method expressions
Use “like” queries
Construct criteria on the fly to query associations
![Page 20: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/20.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 20
GORM Features
Dynamic finder and persistence methodsCriteria with a Groovy builderObject-relational Mapping DSL• Caching• Legacy mapping• Locking strategy (optimistic/pessimistic)
Built on Hibernate
+
![Page 21: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/21.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 21
Easy MVC with Grails
Comprehensive MVC framework built on Spring• Command objects• Data binding• Zero configuration• URL Mappings• Groovy Server Pages (GSP) • Tag libraries• CRUD (Scaffolding)• Internationalization (i18n)
![Page 22: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/22.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 22
Mapping URLs to Controllers
Default URL Mapping:
Maps patterns like /album/list to list action of AlbumController
"/$controller/$action?/$id?”()
UrlMappings file defines the default mapping, but is completely configurable
![Page 23: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/23.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 23
Controllers in ActionEasy MVC with Grails
![Page 24: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/24.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 24
Grails Controllers
class AlbumController {
def search = { def albums= Album.findByTitleLike("%${params.q}%")
[albumResults:albums] }}
Return a model as a map
Actions are properties assigned a block or closure
Controllers go in the “controllers” directory
![Page 25: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/25.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 25
Trivial Tag Libraries
Tag Code Viewdef cache = {attrs,body-> def content= store[attrs.id] if(!content) content = body() store[attrs.id]= content } out << content }
<g:cache id="test"> expensive lazy loaded content goes here</g:cache>
Write to the response
Read tag attributes
Invoke the body
Tag name matches closure name
Pass tag attributes
Tag libraries go in the taglib directory
![Page 26: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/26.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 26
Web Services
Grails features built in support for REST• REST = Representational State Transfer
Optional support for SOAP via plug-ins (another example of not re-inventing the wheel!)• Xfire – http://grails.org/XFire+plugin • Axis 2 – http://grails.org/Apache+Axis2+Plugin
![Page 27: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/27.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 27
RESTful URL Mappings
Maps to actions based on HTTP method
"/$controller/$id?" { action = [GET:"show", POST:"update", PUT:"save"]}
Defined in URLMappings.groovy file
![Page 28: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/28.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 28
RESTful MarshallingEasy Web Services with Grails
![Page 29: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/29.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 29
RESTful Marshalling
To Marshall:
To Unmarshall:
import grails.converters.*…def album = Album.get(params.id)render album as XML
def album = new Album(params.album)
send XML to the response
Read XML from the request when the root node is <album>
![Page 30: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/30.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 30
Content Negotiation
Process different request types based on ACCEPT / CONTENT_TYPE header:
def a = Album.get(params.id)withFormat { html album:a xml { render a as XML } json { render a as JSON }}
Request format obtained from ACCEPT header
Different response sent based on content type
Supported content types configurable in Config.groovy
![Page 31: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/31.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 31
Easy Ajax with Adaptive Tags
Prototype enabled by default• Yahoo UI and Dojo available as plug-ins!
<g:remoteLink action="showAlbum" /><g:formRemote action="updateAlbum" /><g:remoteField action="changeTitle" update="titleDiv" name="title" value="${album?.title}"/>
![Page 32: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/32.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 32
Ajax Plug-ins a Plenty
Echo 2: http://grails.org/Echo2+PluginGWT: http://grails.org/GWT+PluginOpenLaszlo: http://grails.org/OpenLaszlo+pluginZK: http://grails.org/ZK+PluginFlex: http://grails.org/Flex+PluginULC: http://grails.org/ULC+PluginYahoo UI: http://grails.org/YUI+PluginDWR: http://grails.org/DWR+Plugin
![Page 33: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/33.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 33
Summary
Grails is not just a web framework, but a web platformGrails is the next generation abstraction of the Java EE platform built on Spring and HibernateGroovy and Grails integrate tightly with Java technology, the Java Virtual Machine at every level providing an easy migration pathGrails == Simplifying Java EE platform on the web
![Page 34: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/34.jpg)
2008 JavaOneSM Conference | java.sun.com/javaone | 34
For More Information
Grails• TS-5793 – Groovy and Grails: Changing the Landscape of
Java Platform, Enterprise Edition (Java EE Platform) Patterns, TS-6457 - Choosing Your Java Technology-Based Web Framework: A Comparison
• Web Site: http://grails.org• User Guide: http://grails.org/doc/1.0.x/
Groovy• Sessions, Panel Discussions, BOFs: PAN-5435, TS-5815, TS-
6050, TS-5274, BOF-5102, BOF-5110, TS-5693, BOF-5101• http://groovy.codehaus.org
![Page 35: Grails – In DepthGrails – The Basics Creating and Running Grails will load by default with an in-memory HSQLDB The default container is an embedded Jetty Container Grails is configured](https://reader034.fdocuments.us/reader034/viewer/2022042307/5ed3cdf0558ce84bfe1d408a/html5/thumbnails/35.jpg)
Grails – in DepthGraeme Rocher
TS-5764