370 likes | 658 Views
Rapid Web Application Development with Grails. Graeme Rocher Managing Director Agilize it http://www.agilizeit.com. Session ID# BOF-2521. Goal of this Talk. Rapid Web Application Development with Grails.
E N D
Rapid Web Application Development with Grails Graeme Rocher Managing DirectorAgilize ithttp://www.agilizeit.com Session ID# BOF-2521
Goal of this Talk Rapid Web Application Development with Grails Learn how to rapidly create web applications using the agile web application framework Grails
Agenda Groovy & Grails Getting Started The Application Domain Controllers Groovy Servers Pages (GSP) Tag Libraries Ajax Support Scaffolding Java Integration
Agenda Groovy & Grails Getting Started The Application Domain Controllers Groovy Servers Pages (GSP) Tag Libraries Ajax Support Scaffolding Java Integration
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
Agenda Groovy & Grails Getting Started The Application Domain Controllers Groovy Servers Pages (GSP) Tag Libraries Ajax Support Scaffolding Java Integration
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
Project Infrastructure • + PROJECT_HOME • + grails-app • + conf • + controllers • + domain • + i18n • + services • + taglib • + views • + lib • + spring • + hibernate • + src • + web-app Main Grails resources Jar archive libraries Additional Spring configuration Additional Hibernate mapping Java sources Web resources e.g. CSS, JavaScript etc.
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
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 connection Pooling is enabled DB Auto creation with hbm2ddl Remaining connection settings
Agenda Groovy & Grails Getting Started The Application Domain Controllers Groovy Servers Pages (GSP) Tag Libraries Ajax Support Scaffolding Java Integration
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
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-many relationship to ExpenseItem
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 owning side of the relationship Each property maps To a column
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’ property Is one of the values in the list ‘amount’ must be in a range greater than 0 but less than 1000
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()
Agenda Groovy & Grails Getting Started The Application Domain Controllers Groovy Servers Pages (GSP) Tag Libraries Ajax Support Scaffolding Java Integration
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
The Controller • The controller and action name map to the URI: /expenseReport/list class ExpenseReportController { @Property list = { [expenseReports : ExpenseReport.list()] } } The name of the class is the first token in the URI Each action is a closure property An optional model is returned as a map
Data Binding & Flow Control Dynamic get method Auto-type conversion To id type // 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 conversion from request parameters Example flow control via render and redirect methods
Agenda Groovy & Grails Getting Started The Application Domain Controllers Groovy Servers Pages (GSP) Tag Libraries Ajax Support Scaffolding Java Integration
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
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 model returned by the controller Embedded GString expressions
Agenda Groovy & Grails Getting Started The Application Domain Controllers Groovy Servers Pages Tag Libraries Ajax Support Scaffolding Java Integration
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 body argument is a closure that can be invoked The name of the tag The attributes are passed as a map
Dynamic Tag Libraries • Using the tag requires no imports or configuration and can be reloaded at runtime!: <p>Submitted: <g:dateFormatdate="${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 name with the “g:” prefix Tag can also be called as a regular method!
Agenda Groovy & Grails Getting Started The Application Domain Controllers Groovy Servers Pages Tag Libraries Ajax Support Scaffolding Java Integration
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
Agenda Groovy & Grails Getting Started The Application Domain Controllers Groovy Servers Pages Tag Libraries Scaffolding Ajax Support Java Integration
DEMO • Scaffolding
Agenda Groovy & Grails Getting Started The Application Domain Controllers Groovy Servers Pages Tag Libraries Scaffolding Ajax Support Java Integration
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 stilluse dynamic methods! • Take advantage of Hibernate’s power by mapping onto legacy systems. • Use Spring’s dependency injection to integrate Controllers with existing services
DEMO • ECLIPSE INTEGRATION
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!
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