grails presentations
TRANSCRIPT
2006 JavaOneSM Conference | Session BOF-2521 |
Rapid Web Application Development with Grails
Graeme RocherManaging DirectorAgilize ithttp://www.agilizeit.com
Session ID# BOF-2521
2006 JavaOneSM Conference | Session BOF-2521 | 2
Learn how to rapidly create web applications using the agile web application framework Grails
Rapid Web Application Development with GrailsGoal of this Talk
2006 JavaOneSM Conference | Session BOF-2521 | 3
Agenda
Groovy & GrailsGetting StartedThe Application DomainControllersGroovy Servers Pages (GSP)Tag LibrariesAjax SupportScaffoldingJava Integration
2006 JavaOneSM Conference | Session BOF-2521 | 4
Agenda
Groovy & GrailsGetting StartedThe Application DomainControllersGroovy Servers Pages (GSP)Tag LibrariesAjax SupportScaffoldingJava Integration
2006 JavaOneSM Conference | Session BOF-2521 | 5
Groovy & Grails
● Grails: MVC web framework inspired by:● Convention over Configuration● Don’t Repeat Yourself (DRY)● Ruby on Rails
● Built on solid foundations:● Spring IoC, MVC and WebFlow● Hibernate● SiteMesh
● Why Groovy?● Meta-Programming● Closure Support● Syntactically Expressive● Java Integration
Source: Please add the source of your data here
2006 JavaOneSM Conference | Session BOF-2521 | 6
Agenda
Groovy & GrailsGetting StartedThe Application DomainControllersGroovy Servers Pages (GSP)Tag LibrariesAjax SupportScaffoldingJava Integration
2006 JavaOneSM Conference | Session BOF-2521 | 7
Getting Started
● Grails available from http://grails.org● Stable & Development snapshots available● Simple installation:
● Download & extract zip● Set GRAILS_HOME variable● Add $GRAILS_HOME\bin to PATH variable
● Run “grails create-app”
Source: Please add the source of your data here
2006 JavaOneSM Conference | Session BOF-2521 | 8
+ PROJECT_HOME+ grails-app
+ conf+ controllers+ domain+ i18n+ services+ taglib+ views
+ lib+ spring+ hibernate+ src+ web-app
Project Infrastructure
Main Grails resources
Additional Spring configuration
Additional Hibernate mapping
Web resources e.g. CSS, JavaScript etc.
Java sources
Jar archive libraries
2006 JavaOneSM Conference | Session BOF-2521 | 9
Command Line Targets
● Apache Ant bundled with Grails● Many useful targets available:
● create-* (for creating Grails artifacts)● generate-controller● generate-views● run-app● test-app● run-webtest
Source: Please add the source of your data here
2006 JavaOneSM Conference | Session BOF-2521 | 10
The Data Source
// data source located in grails-app/conf
Class ApplicationDataSource {
@Property pooled = false
@Property dbCreate = “create-drop”
@Property url = “jdbc:hsqldb:mem:testDb”@Property driverClassName = “org.hsqldb.jdbcDriver”@Property username = “sa”@Property password = “sa”
}
Whether connectionPooling is enabled
DB Auto creation withhbm2ddl
Remaining connectionsettings
2006 JavaOneSM Conference | Session BOF-2521 | 11
Agenda
Groovy & GrailsGetting StartedThe Application DomainControllersGroovy Servers Pages (GSP)Tag LibrariesAjax SupportScaffoldingJava Integration
2006 JavaOneSM Conference | Session BOF-2521 | 12
The Application Domain
● Domain classes hold state and implement behaviour
● They are linked together via relationships (e.g. one-to-many)
● In Java domain classes have traditionally been handled by Object-Relational Mapping (ORM)
● Grails provides simple ORM built on Hibernate
Source: Please add the source of your data here
2006 JavaOneSM Conference | Session BOF-2521 | 13
Grails ORM (GORM)● Extremely simple. No special class to extend or file to configure!
class ExpenseReport {
@Property Long id
@Property Long version
@Property relatesToMany = [items:ExpenseItem]
@Property Set items
@Property Date submissionDate
@Property String employeeName
}
Each domain class has an ‘id’ and ‘version’
Defines one-to-manyrelationship
to ExpenseItem
2006 JavaOneSM Conference | Session BOF-2521 | 14
Grails ORM (GORM)● We’ve got this far, so lets define the other side!
class ExpenseItem {
@Property Long id
@Property Long version
@Property belongsTo = ExpenseReport
@Property String type
@Property Currency currency
@Property Integer amount
}
Defines the owningside of the relationship
Each property mapsTo a column
2006 JavaOneSM Conference | Session BOF-2521 | 15
Grails Constraints
● Validation constraints can be defined using the ‘constraints’ property
class ExpenseItem {
…
@Property constraints = {type(inList:['travel', 'accomodation'])
amount(range:1..999)
}
}
Each node relates to a property
Ensures the ‘type’ propertyIs one of the values in the list‘amount’ must be
in a range greater than 0but less than 1000
2006 JavaOneSM Conference | Session BOF-2521 | 16
Dynamic Methods & Properties
● Grails injects methods and properties into domain classes at runtime:
def r = ExpenseReport.findByEmployeeName('fred')
def r = ExpenseReport
.findBySubmissionDateGreaterThan(lastMonth)
def reports = ExpenseReport.findAll()
assert ! (new ExpenseItem().validate())
def er = new ExpenseReport(employeeName: 'Edgar')
.save()
2006 JavaOneSM Conference | Session BOF-2521 | 17
Agenda
Groovy & GrailsGetting StartedThe Application DomainControllersGroovy Servers Pages (GSP)Tag LibrariesAjax SupportScaffoldingJava Integration
2006 JavaOneSM Conference | Session BOF-2521 | 18
Controllers
● Controllers handle requests and prepare responses
● Response created by either delegating to a view or writing to the response
● A controller is a class containing closure properties that act on requests
● The convention used for the name of the controller and the actions within map to URIs.
Source: Please add the source of your data here
2006 JavaOneSM Conference | Session BOF-2521 | 19
The Controller
● The controller and action name map to the URI: /expenseReport/list
class ExpenseReportController {
@Property list = {
[expenseReports : ExpenseReport.list()]
}
}
The name of theclass is the firsttoken in the URI
Each action is aclosure property
An optional modelis returned as a
map
2006 JavaOneSM Conference | Session BOF-2521 | 20
Data Binding & Flow Control
// save action
@Property save = {
def e = ExpenseItem.get(params.id)
e.properties = params
if(e.save()){
redirect(action:show,id:e.id)
} else {
render( view: 'create',
model:[expenseItem:e] )
}
}
Auto-type conversionfrom request parameters
Dynamic get methodAuto-type conversion
To id type
Example flow control
via render andredirect methods
2006 JavaOneSM Conference | Session BOF-2521 | 21
Agenda
Groovy & GrailsGetting StartedThe Application DomainControllersGroovy Servers Pages (GSP)Tag LibrariesAjax SupportScaffoldingJava Integration
2006 JavaOneSM Conference | Session BOF-2521 | 22
Groovy Server Pages
● A view technology very similar to JSP, but with Groovy as the primary language
● More expressive and concise with support for embedded GStrings & Tags
● Layout support through integration with SiteMesh
● Ability to define dynamic tag libraries
Source: Please add the source of your data here
2006 JavaOneSM Conference | Session BOF-2521 | 23
A GSP Example
● The GSP for the list action is named according to convention: grails-app/views/expenseItem/list.gsp
<html>
<body>
<g:each in="${expenseItems}">
<p>${it.type} – amount: ${it.amount}</p>
</g:each>
</body>
</html>
References the modelreturned by the
controller
Embedded GStringexpressions
2006 JavaOneSM Conference | Session BOF-2521 | 24
Agenda
Groovy & GrailsGetting StartedThe Application DomainControllersGroovy Servers PagesTag LibrariesAjax SupportScaffoldingJava Integration
2006 JavaOneSM Conference | Session BOF-2521 | 25
Dynamic Tag Libraries
● Easy definition of simple, logical and iterative tags:
class ExpenseTagLib {
@Property dateFormat = { attrs,body ->
out << new SimpleDateFormat(attrs.format)
.format(attrs.date)
}
}
The name of thetag
The body argument is a closure that can be invoked
The attributes arepassed as a map
2006 JavaOneSM Conference | Session BOF-2521 | 26
Dynamic Tag Libraries
● Using the tag requires no imports or configuration and can be reloaded at runtime!:
<p>Submitted:
<g:dateFormat date="${report.submissionDate}"
format="DD-MM-YYYY" />
</p>
<p><input type="hidden" name="submissionDate"
value="${dateFormat(
date:report.submissionDate,
format:'DD-MM-YYYY')}" />
</p>
Tag called by namewith the “g:” prefix
Tag can also becalled as a regular
method!
2006 JavaOneSM Conference | Session BOF-2521 | 27
Agenda
Groovy & GrailsGetting StartedThe Application DomainControllersGroovy Servers PagesTag LibrariesAjax SupportScaffoldingJava Integration
2006 JavaOneSM Conference | Session BOF-2521 | 28
AJAX Support
● Built in “adaptive” tag library for Ajax● Supports Prototype, Rico, and Yahoo (Dojo
coming soon)● Tags for remote linking, asynchronous form
submission etc.● Dynamic “render” method available for
rendering XML snippets, or partial templates● Save/Reload and dynamic tag libraries make
Ajax even easier
2006 JavaOneSM Conference | Session BOF-2521 | 29
Agenda
Groovy & GrailsGetting StartedThe Application DomainControllersGroovy Servers PagesTag LibrariesScaffoldingAjax SupportJava Integration
2006 JavaOneSM Conference | Session BOF-2521 | 30
DEMOScaffolding
2006 JavaOneSM Conference | Session BOF-2521 | 31
Agenda
Groovy & GrailsGetting StartedThe Application DomainControllersGroovy Servers PagesTag LibrariesScaffoldingAjax SupportJava Integration
2006 JavaOneSM Conference | Session BOF-2521 | 32
Java Integration
● Now for the important bit, with Groovy and Grails you can:
● Call any existing Java library seamlessly● Deploy as a WAR onto any JEE application
server● Write your domain model in Java, mapped with
Hibernate, and still use dynamic methods!● Take advantage of Hibernate’s power by
mapping onto legacy systems.● Use Spring’s dependency injection to integrate
Controllers with existing services
2006 JavaOneSM Conference | Session BOF-2521 | 33
DEMOECLIPSE INTEGRATION
2006 JavaOneSM Conference | Session BOF-2521 | 34
Summary
● With the advent on Web 2.0 agility is key● Dynamic frameworks (Grails, Rails, Django etc.)
provide this through quick iterative development with a clear productivity gain
● However, for large scale applications static-typing and IDE support is crucial
● Grails provides the ability to use a blended approach
● And most importantly it runs on the JVM!
2006 JavaOneSM Conference | Session BOF-2521 | 35
For More Information
● Groovy website – http://groovy.codehaus.org● Grails website – http://grails.org● Mailing lists – http://grails.org/Mailing+lists● Graeme’s Blog – http://graemerocher.blogspot.com● Upcoming books ‘The Definitive Guide to Grails’ by
Apress and ‘Groovy in Action’ by Manning
2006 JavaOneSM Conference | Session BOF-2521 | 36
Q&A