30
Groovy & Grails Scripting for Modern Web Applications Rohit Nayak Talentica Software

Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

  • Upload
    dodiep

  • View
    229

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

Groovy & GrailsScripting for Modern Web Applications

Rohit Nayak

Talentica Software

Page 2: Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

Agenda Demo: Quick intro to Grails Scripting, Web Applications and Grails/Groovy REST service in Grails

− Demo

− Internals

Web Client in Grails− Demo

− Internals

Perspective

Page 3: Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

Demo

Quick Intro to Grails

Page 4: Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

Maggi

grails create-app Maggi Domain class: Noodle, Packaging grails generate-all Noodle, Packaging grails run-app

Page 5: Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

Web Frameworks with Scripting

Ruby on Rails (2004)

CakePHP (2005)

Django / Python (2005)

Groovy on Grails (2006)

Page 6: Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

Power of these frameworks

Baked Experience

The Language

Agility / Productivity

Page 7: Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

Baked Experience

Model View Controller Object-Relational Mapping Templates Layout URL rewriting Ajax support XML / JSON support

Page 8: Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

The Language

Dynamic More expressive code Smaller code Native support for Lists, Hashmaps Lang. support for IO, Net, XML Idioms for common Design Patterns

Page 9: Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

Agile

Scaffolding Unit tests No compile cycles Built-in webservers Fail faster!

Page 10: Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

http://www.zacker.org/ruby-on-rails (Nov 2nd)

Page 11: Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

http://www.zacker.org/ruby-on-rails (Nov 2nd)

Page 12: Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

HelloWorld.javapublic class HelloWorld {

String name;

public void setName(String name){ this.name = name; }

public String getName() { return name; }

public String hello(){ return “Hello “+ name; }

public static void main(String args[]) {

HelloWorld helloWorld = new HelloWorld();

helloWorld.setName(“Java”);

System.out.println( helloWorld. hello() );

}

}

Page 13: Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

HelloWorld.groovy

class HelloWorld {

String name

def hello() { "Hello $name" }

}

def helloWorld = new HelloWorld(name:"Groovy")

println helloWorld.hello()

Page 14: Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

Key Groovy Features Java-like syntax Complements Java Object-oriented Targets Java VM (JSR-241)

− Invoke Java class within Groovy− Invoke Groovy class within Java

Dynamic Scripting (JSR-223) Brevity

Page 15: Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

Brevity

Optional semicolons, package prefixes Automatic imports (java.util.*, java.net.*,

java.io.*, groovy…) GroovyBeans (generated accessors) Optional typing Optional return

Page 16: Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

Groovy Gravy GStrings: ”$book.title: $book.author (${book.reviewers.length})”

Regular expressions: assert ‘12345’ =~ /\d+/

Only objects: primitives converted to Reference Types

Lists: def list = [1, 2, 'hello', new java.util.Date()]

Maps: def map = ['name':‘Indic Threads', 'location':‘Pune']

Closures [1,2,3].collect {it*2} ===> [2, 4, 6]

String literals – single, double, triple quotes

Page 17: Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

Closures

Block of statements First class objects Parameters including default values Carries local context

def foo(n) { // method

return { n += it } // returns closure

}

def accumulator = foo(1) //curried closure

assert accumulator(2) == 3 //assert used for self-documenting, unit-testing

assert accumulator(1) == 4

Page 18: Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

Dynamic Programming

Add methods, properties to classes/objects at run-time

Mixins to inject behaviour Can extend class field-access mechanism Dynamic method invocation

Page 19: Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

Poolster

Online “football pools” application Entities: Game, User Game Stake, Option, Ends To join User chooses an Option REST Webservice backend Clients: iPhone, Grails, Android, Silverlight

Page 20: Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

Demo

The Poolster Webservice

Page 21: Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

Grails – Philosophy Convention over Configuration

− Magic directories

− Implicit table names, column names Don’t Repeat Yourself

− Database maps to domain

− hasMany defines relationship & declares variable

− Layout, form validations Lightweight

− Modify and F5 Strong shoulders

− Spring (Grails MVC, DI, Transactions)

− Hibernate (GORM)

− Ant, JUnit, SiteMesh

Page 22: Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

Grails – Key Features

Database constraints, composition MySQL integration URL Mapping Authentication / Filters Bootstrapping Unit test Logging

Page 23: Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

Demo

Poolster Web Client

Page 24: Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

Grails Web Application

Custom Tag libraries Session variables Sitemesh layout Templates Internationalization

Page 25: Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

Unseen Gravy

JUnit test cases, Mocking/Stubbing Web testing with Canoo Webtest Bootstrapping Pagination

Page 26: Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

Cons

Learning curve Performance ?! Early adopter issues

Page 27: Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

Scripted In Groovy

Canoo WebTest Tellurium Ant / Maven config files SoapUI script step Spring beans <YOUR APP HERE>

Page 28: Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

Invoking Groovy Scriptsimport java.io.File;import groovy.lang.Binding;import groovy.util.GroovyScriptEngine;

public class ScriptEngineEmbedGroovy{public static void main(String args[]) throws Throwable{String[] paths = {"C:\\groovy"};GroovyScriptEngine gse = new GroovyScriptEngine(paths);Binding binding = new Binding();Object[] path = {"C:\\music\\mp3"};binding.setVariable("args",path);gse.run("Songs.groovy", binding);}

}

Page 29: Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

Getting Started

groovy.codehaus.org grails.org Free e-books

− Beginning Groovy and Grails (Apress)− Getting started with Grails (InfoQ)

refcardz.com cheat sheets

ibm.com Mastering Grails, Practically Groovy

Page 30: Groovy & Grails Scripting for Modern Web Applicationsj09.indicthreads.com/.../12/IndicThreads-Java-Webapps-with-Grails.pdf · Agenda Demo: Quick intro to Grails Scripting, Web Applications

Thanks