Grails presentations

36
2006 JavaOne SM Conference | Session BOF-2521 | Rapid Web Application Development with Grails Graeme Rocher Managing Director Agilize it http://www.agilizeit.com Session ID# BOF- 2521

Transcript of Grails presentations

Page 1: Grails presentations

2006 JavaOneSM Conference | Session BOF-2521 |

Rapid Web Application Development with Grails

Graeme RocherManaging DirectorAgilize ithttp://www.agilizeit.com

Session ID# BOF-2521

Page 2: Grails presentations

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

Page 3: Grails presentations

2006 JavaOneSM Conference | Session BOF-2521 | 3

Agenda

Groovy & GrailsGetting StartedThe Application DomainControllersGroovy Servers Pages (GSP)Tag LibrariesAjax SupportScaffoldingJava Integration

Page 4: Grails presentations

2006 JavaOneSM Conference | Session BOF-2521 | 4

Agenda

Groovy & GrailsGetting StartedThe Application DomainControllersGroovy Servers Pages (GSP)Tag LibrariesAjax SupportScaffoldingJava Integration

Page 5: Grails presentations

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

Page 6: Grails presentations

2006 JavaOneSM Conference | Session BOF-2521 | 6

Agenda

Groovy & GrailsGetting StartedThe Application DomainControllersGroovy Servers Pages (GSP)Tag LibrariesAjax SupportScaffoldingJava Integration

Page 7: Grails presentations

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

Page 8: Grails presentations

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

Page 9: Grails presentations

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

Page 10: Grails presentations

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

Page 11: Grails presentations

2006 JavaOneSM Conference | Session BOF-2521 | 11

Agenda

Groovy & GrailsGetting StartedThe Application DomainControllersGroovy Servers Pages (GSP)Tag LibrariesAjax SupportScaffoldingJava Integration

Page 12: Grails presentations

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

Page 13: Grails presentations

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

Page 14: Grails presentations

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

Page 15: Grails presentations

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

Page 16: Grails presentations

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()

Page 17: Grails presentations

2006 JavaOneSM Conference | Session BOF-2521 | 17

Agenda

Groovy & GrailsGetting StartedThe Application DomainControllersGroovy Servers Pages (GSP)Tag LibrariesAjax SupportScaffoldingJava Integration

Page 18: Grails presentations

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

Page 19: Grails presentations

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

Page 20: Grails presentations

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

Page 21: Grails presentations

2006 JavaOneSM Conference | Session BOF-2521 | 21

Agenda

Groovy & GrailsGetting StartedThe Application DomainControllersGroovy Servers Pages (GSP)Tag LibrariesAjax SupportScaffoldingJava Integration

Page 22: Grails presentations

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

Page 23: Grails presentations

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

Page 24: Grails presentations

2006 JavaOneSM Conference | Session BOF-2521 | 24

Agenda

Groovy & GrailsGetting StartedThe Application DomainControllersGroovy Servers PagesTag LibrariesAjax SupportScaffoldingJava Integration

Page 25: Grails presentations

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

Page 26: Grails presentations

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!

Page 27: Grails presentations

2006 JavaOneSM Conference | Session BOF-2521 | 27

Agenda

Groovy & GrailsGetting StartedThe Application DomainControllersGroovy Servers PagesTag LibrariesAjax SupportScaffoldingJava Integration

Page 28: Grails presentations

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

Page 29: Grails presentations

2006 JavaOneSM Conference | Session BOF-2521 | 29

Agenda

Groovy & GrailsGetting StartedThe Application DomainControllersGroovy Servers PagesTag LibrariesScaffoldingAjax SupportJava Integration

Page 30: Grails presentations

2006 JavaOneSM Conference | Session BOF-2521 | 30

DEMOScaffolding

Page 31: Grails presentations

2006 JavaOneSM Conference | Session BOF-2521 | 31

Agenda

Groovy & GrailsGetting StartedThe Application DomainControllersGroovy Servers PagesTag LibrariesScaffoldingAjax SupportJava Integration

Page 32: Grails presentations

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

Page 33: Grails presentations

2006 JavaOneSM Conference | Session BOF-2521 | 33

DEMOECLIPSE INTEGRATION

Page 34: Grails presentations

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!

Page 35: Grails presentations

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

Page 36: Grails presentations

2006 JavaOneSM Conference | Session BOF-2521 | 36

Q&A