SlideShare a Scribd company logo
Grails
High-velocity development for Spring applications
About Me
David Jacobs
● Web Developer since '98

● Groovy since '06          Twitter
                            @MetaThis
● Grails focus in '08-'09
What is Grails?
Grails is an open-source framework for high-velocity
development of Spring applications
 ● Sensible defaults
 ● Convention-over-configuration
 ● DRY
 ● Dynamic metaprogramming
 ● End-to-end integrated stack
 ● Enables you to focus on the business problem
Best-of-Breed Java Technologies
●   Spring
●   Spring MVC
●   Hibernate
●   log4j
●   jUnit
●   SiteMesh
Integrated Stack
●   Layers and technologies integrated and wired
    out-of-the-box
●   Default configurations based on industry best
    practices
    ●   80/20 rule
Directory Structure
●   grails-app - top level directory for Groovy sources
     ●   conf - Configuration sources.
     ●   controller - Web controllers - The C in MVC.
     ●   domain - The application domain.
     ●   i18n - Support for internationalization (i18n).
     ●   services - The service layer.
     ●   taglib - Tag libraries.
     ●   views - Groovy Server Pages.
●   scripts - Gant/Gradle scripts.
●   src - Supporting sources
     ●   groovy - Other Groovy sources
     ●   java - Other Java sources
●   test - Unit and integration test
GORM
●   Object Relational Mapping (ORM)
●   Data access layer
●   Simplifies configuration through conventions
●   Defaults to Hibernate implementation
     ● Provided as plugin, alternatives pluggable
●   Extends and simplifies data access APIs
●   Similar to ActiveRecord in Rails
GORM
Domain Modeling
//this is a complete Hibernate mapping!
class Employee {
    String firstName
    String lastName
    Date startDate
}
GORM
Dynamic CRUD
def employee = Employee.get(1)
employee.delete()
def newEmployee = new Employee(firstName: “Joe”, lastName: ”Programmer”)
newEmployee.save()
GORM
Dynamic finders
Employee.findByLastNameAndHireDateGreaterThan(“Jones”, someDate)


findBy and findAllBy
 ●   InList - In the list of given values
 ●   LessThan - less than the given value
 ●   LessThanEquals - less than or equal a give value
 ●   GreaterThan - greater than a given value
 ●   GreaterThanEquals - greater than or equal a given value
 ●   Like - Equivalent to a SQL like expression
 ●   Ilike - Similar to a Like, except case insensitive
 ●   NotEqual - Negates equality
 ●   Between - Between two values (requires two arguments)
 ●   IsNotNull - Not a null value (doesn't require an argument)
 ●   IsNull - Is a null value (doesn't require an argument)
GORM
Hibernate HQL
Employee.findAll("from Employee as e where e.lastName like :lastName", [lastName:"Jon%"])

//with pagination and sorting
Employee.findAll("from Employee as e where e.lastName like :lastName",
                 [lastName:"Jon%", max:10, offset:20, sort:"hireDate", order:"asc"])
GORM
Simplified Hibernate Criteria API
// Find incomplete tasks assigned to Jones where the company is Monsanto
// and the project name begins with “Rubic”, order by task name
def criteria = Tasks.createCriteria()
def tasks = criteria.list {
  eq(‘completed’, false)
  project{
    like(‘name’ ‘Rubic%’)
    company{
      eq(‘name’, ‘Monsanto’)
    }
    assignedEmployees{
      eq(‘lastName’, ‘Jones’)
    }
  }
  order(‘taskName’, ‘asc’)
}
Web Layer
●   Controllers built on Spring MVC
●   URL mapping conventions map requests to controllers
●   Naming and directory conventions map actions to views
●   Built-in AOP action interceptors
     ●   Every controller provides a beforeInterceptor and afterInterceptor
     ●   Specifiable by action, optionally with patterns and exclusions
●   Servlet objects and convenience extensions injected into controller actions at runtime and
    provided as implicit variables
     ●   servletContext, session, request, response, params, flash
Spring MVC
Request parameters parsed into multidimensional params map
     ●   Easily accessed with powerful Groovy map support.

<!-- HTML form -->
<input type=”text” name=”userName” />
//controller code
def userName = params.userName

<!-- HTML form with dot-notation for complex embedded objects -->
<input type=”text” name=”user.address.zipCode” />
<input type=”text” name=”user.address.state” />
//controller code
def zipCode = params.user.address.zipCode
def state = params.user.address.state
Data Binding
def save = {
    //bind params to new instance
    def user = new User(params)

    //persist
    user.save()
}


def update = {
    //get instance from database
    def user = User.get(params.id)
    //bind params
    user.properties = params
    user.save()
}
Request Format Transparency
Grails codecs (dynamic encode/decode methods) easily automap formats like XML and JSON to
the params map.

<!-- XML request -->
<user>
  <id>42</id>
  <address>
    <zipCode>63122</zipCode>
  </address>
</user>

//transparent to the controller code
def zipCode = params.user.address.zipCode
def user = new User(params.user)


Easily create custom codecs to support specific requirements
XML & JSON Marshalling
Groovy's popular XML support
+
Grails builders and codecs
+
Convenience methods

def list = {
    render Project.list() as XML
}


def list = {
    render Project.list() as JSON
}
Groovy Server Pages (GSP)
●   Similar to JSP
     ●   Tag library like JSTL, but much more powerful
     ●   Easy custom tags
     ●   Powerful templates
●   SiteMesh is automatically configured for layout management
Groovy Server Pages (GSP)
Tags
   actionSubmit     fieldValue      layoutBody       render
   applyLayout      findAll         layoutHead       renderErrors
   checkBox         form            layoutTitle      resource
   collect          formRemote      link             select
   cookie           formatBoolean   localeSelect     set
   country          formatDate      message          sortableColumn
   countrySelect    formatNumber    meta             submitButton
   createLink       grep            pageProperty     submitToRemote
   createLinkTo     hasErrors       paginate         textArea
   currencySelect   header          passwordField    textField
   datePicker       hiddenField     radio            timeZoneSelect
   each             if              radioGroup       unless
   eachError        include         remoteField      uploadForm
   else             javascript      remoteFunction   while
   elseif           join            remoteLink
AJAX
●   Bundled with Prototype and Script.aculo.us
●   Excellent jQuery plugin
●   GSP tags for AJAX
     ●   Adapters built-in for major JavaScript frameworks
●   Plugins provide additional AJAX functionality
Configuration
Per-Environment Configuration Supports SCM
    ●    Package or run as any configured environment. Default environments and build configurations defined for
         development, test (staging) and production.
           ●    Programmatic environment detection with provided Environment class.


environments {
  development {
     dataSource {
       dbCreate = "create-drop" // one of 'create', 'create-drop','update'
       url = "jdbc:hsqldb:mem:devDB"
     }
  }
    test {
       dataSource {
          dbCreate = "update"
          url = "jdbc:hsqldb:mem:testDb"
       }
    }
    production {
      dataSource {
        dbCreate = "update"
        url = "jdbc:hsqldb:file:prodDb;shutdown=true"
      }
    }
}
Plugins
Grails extensions are provided as plugins
 ●   Created by core Grails team and community
 ●   Powerful – a plugin IS a Grails application
 ●   Plugins typically bring the idioms of convention-over-configuration and simplified APIs to
     popular libraries
 ●   Easy to create your own – provides a strong architecture for re-use across projects
 ●   Examples
      ●   Spring Security
      ●   JMS
      ●   Spring WS
      ●   LDAP
      ●   Quartz
Plugins
Plugin development is very active
The Bottom Line
●   Increases developer productivity
●   less code + less configuration = easier to maintain
●   Smaller learning curve than other Java web frameworks
●   Eases the learning curve for the underlying technologies
●   Project layout conventions and a standard technology stack promote quicker ramp-up time from one
    Grails project to another
●   Increases agility potential through rapid proto-typing and quick customer feedback
●   Guides solid technology choices by providing excellent defaults
●   Developers enjoy it, which promotes morale and retention

More Related Content

PPT
Introduction To Grails
PDF
Integrating React.js Into a PHP Application: Dutch PHP 2019
PDF
Mastering Grails 3 Plugins - Greach 2016
PDF
Application Architectures in Grails
ODP
Polyglot persistence with Spring Data
PPTX
React + Redux Introduction
PPTX
React & redux
PPTX
ReactJS for Beginners
Introduction To Grails
Integrating React.js Into a PHP Application: Dutch PHP 2019
Mastering Grails 3 Plugins - Greach 2016
Application Architectures in Grails
Polyglot persistence with Spring Data
React + Redux Introduction
React & redux
ReactJS for Beginners

What's hot (20)

PDF
AngularJS Deep Dives (NYC GDG Apr 2013)
POT
intoduction to Grails Framework
PDF
Mobile Day - React Native
PPTX
Getting Started With ReactJS
PDF
Using React with Grails 3
PDF
OSGi and Spring Data for simple (Web) Application Development - Christian Bar...
PPTX
Angular beans
PDF
A Closer Look At React Native
PPT
Scripting Oracle Develop 2007
PDF
Dropwizard Spring - the perfect Java REST server stack
PDF
HTML5 New and Improved
PDF
Implement react pagination with react hooks and react paginate
PDF
GraphQL in Symfony
PDF
DevQA: make your testers happier with Groovy, Spock and Geb
PPTX
React vs Angular: ups & downs (speaker Oleksandr Kovalov, Binary Studio)
PPTX
React JS part 1
PPTX
IndexedDB and Push Notifications in Progressive Web Apps
PDF
ReactJS presentation
AngularJS Deep Dives (NYC GDG Apr 2013)
intoduction to Grails Framework
Mobile Day - React Native
Getting Started With ReactJS
Using React with Grails 3
OSGi and Spring Data for simple (Web) Application Development - Christian Bar...
Angular beans
A Closer Look At React Native
Scripting Oracle Develop 2007
Dropwizard Spring - the perfect Java REST server stack
HTML5 New and Improved
Implement react pagination with react hooks and react paginate
GraphQL in Symfony
DevQA: make your testers happier with Groovy, Spock and Geb
React vs Angular: ups & downs (speaker Oleksandr Kovalov, Binary Studio)
React JS part 1
IndexedDB and Push Notifications in Progressive Web Apps
ReactJS presentation
Ad

Viewers also liked (7)

PDF
Curso de Grails
PDF
PPTX
Introdução a Grails: Um framework veloz e poderoso
PPT
Grails, o que isso quer dizer?
PDF
Oficina groovy grails - infoway
PDF
Grails Simple Login
PDF
AngularJS 101 - Everything you need to know to get started
Curso de Grails
Introdução a Grails: Um framework veloz e poderoso
Grails, o que isso quer dizer?
Oficina groovy grails - infoway
Grails Simple Login
AngularJS 101 - Everything you need to know to get started
Ad

Similar to Grails 101 (20)

ODP
Groovygrailsnetbeans 12517452668498-phpapp03
PPTX
Introduction to Grails 2013
PPTX
Grails
PPTX
Grails
PPTX
Groovy on Grails by Ziya Askerov
PDF
Groovy - Grails as a modern scripting language for Web applications
PDF
ODP
Groovy and Grails intro
PDF
Grails Launchpad - From Ground Zero to Orbit
PDF
Java Edge.2009.Grails.Web.Dev.Made.Easy
PDF
Groovy and Grails talk
PPT
Fast web development using groovy on grails
PPT
JavaOne 2008 - TS-5764 - Grails in Depth
PPTX
Grails Advanced
PPT
Introduction To Groovy 2005
PPT
Grails Introduction - IJTC 2007
ODP
Agile web development Groovy Grails with Netbeans
KEY
Introduction To Grails
PDF
Groovy & Grails for Spring/Java developers
KEY
groovy & grails - lecture 9
Groovygrailsnetbeans 12517452668498-phpapp03
Introduction to Grails 2013
Grails
Grails
Groovy on Grails by Ziya Askerov
Groovy - Grails as a modern scripting language for Web applications
Groovy and Grails intro
Grails Launchpad - From Ground Zero to Orbit
Java Edge.2009.Grails.Web.Dev.Made.Easy
Groovy and Grails talk
Fast web development using groovy on grails
JavaOne 2008 - TS-5764 - Grails in Depth
Grails Advanced
Introduction To Groovy 2005
Grails Introduction - IJTC 2007
Agile web development Groovy Grails with Netbeans
Introduction To Grails
Groovy & Grails for Spring/Java developers
groovy & grails - lecture 9

Recently uploaded (20)

PPTX
MYSQL Presentation for SQL database connectivity
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PPTX
Cloud computing and distributed systems.
PPT
Teaching material agriculture food technology
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
cuic standard and advanced reporting.pdf
PDF
Approach and Philosophy of On baking technology
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PPTX
Big Data Technologies - Introduction.pptx
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PDF
NewMind AI Monthly Chronicles - July 2025
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Machine learning based COVID-19 study performance prediction
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
MYSQL Presentation for SQL database connectivity
NewMind AI Weekly Chronicles - August'25 Week I
Cloud computing and distributed systems.
Teaching material agriculture food technology
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
Reach Out and Touch Someone: Haptics and Empathic Computing
Chapter 3 Spatial Domain Image Processing.pdf
cuic standard and advanced reporting.pdf
Approach and Philosophy of On baking technology
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
Big Data Technologies - Introduction.pptx
20250228 LYD VKU AI Blended-Learning.pptx
Per capita expenditure prediction using model stacking based on satellite ima...
CIFDAQ's Market Insight: SEC Turns Pro Crypto
NewMind AI Monthly Chronicles - July 2025
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Machine learning based COVID-19 study performance prediction
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...

Grails 101

  • 2. About Me David Jacobs ● Web Developer since '98 ● Groovy since '06 Twitter @MetaThis ● Grails focus in '08-'09
  • 3. What is Grails? Grails is an open-source framework for high-velocity development of Spring applications ● Sensible defaults ● Convention-over-configuration ● DRY ● Dynamic metaprogramming ● End-to-end integrated stack ● Enables you to focus on the business problem
  • 4. Best-of-Breed Java Technologies ● Spring ● Spring MVC ● Hibernate ● log4j ● jUnit ● SiteMesh
  • 5. Integrated Stack ● Layers and technologies integrated and wired out-of-the-box ● Default configurations based on industry best practices ● 80/20 rule
  • 6. Directory Structure ● grails-app - top level directory for Groovy sources ● conf - Configuration sources. ● controller - Web controllers - The C in MVC. ● domain - The application domain. ● i18n - Support for internationalization (i18n). ● services - The service layer. ● taglib - Tag libraries. ● views - Groovy Server Pages. ● scripts - Gant/Gradle scripts. ● src - Supporting sources ● groovy - Other Groovy sources ● java - Other Java sources ● test - Unit and integration test
  • 7. GORM ● Object Relational Mapping (ORM) ● Data access layer ● Simplifies configuration through conventions ● Defaults to Hibernate implementation ● Provided as plugin, alternatives pluggable ● Extends and simplifies data access APIs ● Similar to ActiveRecord in Rails
  • 8. GORM Domain Modeling //this is a complete Hibernate mapping! class Employee { String firstName String lastName Date startDate }
  • 9. GORM Dynamic CRUD def employee = Employee.get(1) employee.delete() def newEmployee = new Employee(firstName: “Joe”, lastName: ”Programmer”) newEmployee.save()
  • 10. GORM Dynamic finders Employee.findByLastNameAndHireDateGreaterThan(“Jones”, someDate) findBy and findAllBy ● InList - In the list of given values ● LessThan - less than the given value ● LessThanEquals - less than or equal a give value ● GreaterThan - greater than a given value ● GreaterThanEquals - greater than or equal a given value ● Like - Equivalent to a SQL like expression ● Ilike - Similar to a Like, except case insensitive ● NotEqual - Negates equality ● Between - Between two values (requires two arguments) ● IsNotNull - Not a null value (doesn't require an argument) ● IsNull - Is a null value (doesn't require an argument)
  • 11. GORM Hibernate HQL Employee.findAll("from Employee as e where e.lastName like :lastName", [lastName:"Jon%"]) //with pagination and sorting Employee.findAll("from Employee as e where e.lastName like :lastName", [lastName:"Jon%", max:10, offset:20, sort:"hireDate", order:"asc"])
  • 12. GORM Simplified Hibernate Criteria API // Find incomplete tasks assigned to Jones where the company is Monsanto // and the project name begins with “Rubic”, order by task name def criteria = Tasks.createCriteria() def tasks = criteria.list { eq(‘completed’, false) project{ like(‘name’ ‘Rubic%’) company{ eq(‘name’, ‘Monsanto’) } assignedEmployees{ eq(‘lastName’, ‘Jones’) } } order(‘taskName’, ‘asc’) }
  • 13. Web Layer ● Controllers built on Spring MVC ● URL mapping conventions map requests to controllers ● Naming and directory conventions map actions to views ● Built-in AOP action interceptors ● Every controller provides a beforeInterceptor and afterInterceptor ● Specifiable by action, optionally with patterns and exclusions ● Servlet objects and convenience extensions injected into controller actions at runtime and provided as implicit variables ● servletContext, session, request, response, params, flash
  • 14. Spring MVC Request parameters parsed into multidimensional params map ● Easily accessed with powerful Groovy map support. <!-- HTML form --> <input type=”text” name=”userName” /> //controller code def userName = params.userName <!-- HTML form with dot-notation for complex embedded objects --> <input type=”text” name=”user.address.zipCode” /> <input type=”text” name=”user.address.state” /> //controller code def zipCode = params.user.address.zipCode def state = params.user.address.state
  • 15. Data Binding def save = { //bind params to new instance def user = new User(params) //persist user.save() } def update = { //get instance from database def user = User.get(params.id) //bind params user.properties = params user.save() }
  • 16. Request Format Transparency Grails codecs (dynamic encode/decode methods) easily automap formats like XML and JSON to the params map. <!-- XML request --> <user> <id>42</id> <address> <zipCode>63122</zipCode> </address> </user> //transparent to the controller code def zipCode = params.user.address.zipCode def user = new User(params.user) Easily create custom codecs to support specific requirements
  • 17. XML & JSON Marshalling Groovy's popular XML support + Grails builders and codecs + Convenience methods def list = { render Project.list() as XML } def list = { render Project.list() as JSON }
  • 18. Groovy Server Pages (GSP) ● Similar to JSP ● Tag library like JSTL, but much more powerful ● Easy custom tags ● Powerful templates ● SiteMesh is automatically configured for layout management
  • 19. Groovy Server Pages (GSP) Tags actionSubmit fieldValue layoutBody render applyLayout findAll layoutHead renderErrors checkBox form layoutTitle resource collect formRemote link select cookie formatBoolean localeSelect set country formatDate message sortableColumn countrySelect formatNumber meta submitButton createLink grep pageProperty submitToRemote createLinkTo hasErrors paginate textArea currencySelect header passwordField textField datePicker hiddenField radio timeZoneSelect each if radioGroup unless eachError include remoteField uploadForm else javascript remoteFunction while elseif join remoteLink
  • 20. AJAX ● Bundled with Prototype and Script.aculo.us ● Excellent jQuery plugin ● GSP tags for AJAX ● Adapters built-in for major JavaScript frameworks ● Plugins provide additional AJAX functionality
  • 21. Configuration Per-Environment Configuration Supports SCM ● Package or run as any configured environment. Default environments and build configurations defined for development, test (staging) and production. ● Programmatic environment detection with provided Environment class. environments { development { dataSource { dbCreate = "create-drop" // one of 'create', 'create-drop','update' url = "jdbc:hsqldb:mem:devDB" } } test { dataSource { dbCreate = "update" url = "jdbc:hsqldb:mem:testDb" } } production { dataSource { dbCreate = "update" url = "jdbc:hsqldb:file:prodDb;shutdown=true" } } }
  • 22. Plugins Grails extensions are provided as plugins ● Created by core Grails team and community ● Powerful – a plugin IS a Grails application ● Plugins typically bring the idioms of convention-over-configuration and simplified APIs to popular libraries ● Easy to create your own – provides a strong architecture for re-use across projects ● Examples ● Spring Security ● JMS ● Spring WS ● LDAP ● Quartz
  • 24. The Bottom Line ● Increases developer productivity ● less code + less configuration = easier to maintain ● Smaller learning curve than other Java web frameworks ● Eases the learning curve for the underlying technologies ● Project layout conventions and a standard technology stack promote quicker ramp-up time from one Grails project to another ● Increases agility potential through rapid proto-typing and quick customer feedback ● Guides solid technology choices by providing excellent defaults ● Developers enjoy it, which promotes morale and retention