Ratpack: Classy and Compact Web...

34
James Williams Ratpack: Classy and Compact Web Apps

Transcript of Ratpack: Classy and Compact Web...

Page 1: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

James Williams

Ratpack: Classy and Compact Web Apps

Page 2: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

Where I Was From 1A - 12 Noon Today...

Page 3: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

About Me

Co-founder of Griffon

Author of "Learning HTML5Game Programming"

http://amzn.to/HTML5-Game-Book

Blog: http://jameswilliams.be

Twitter: @ecspike

Google+: +JamesWilliams

Page 4: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

About Me

What are Groovy and Ratpack?

Routes

Templates

Running the App

Deployment

Demos

••••••

Page 5: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

What is Groovy?

Dynamic language inspired by Java, Ruby, and Python

Runs on the JVM

Compiles Java source

Can mix Java and Groovy classes and libraries

http://groovy.codehaus.org

•••••

Page 6: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

What is Ratpack?

Apache 2 Licensed

Micro web framework

Inspired by Sinatra (Ruby)

Powered by Jetty

Github: https://github.com/bleedingwolf/Ratpack

•••••

Page 7: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

What is Ratpack?

Apache 2 Licensed

Micro web framework

Inspired by Sinatra (Ruby)

Powered by Jetty

Github: https://github.com/bleedingwolf/Ratpack

•••••

Page 8: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

Ratpack vs (G)rails

Page 9: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

When to use Grails?

Data-driven modelLarge number of models with differing endpointsOut of the box persistence integration is a mustPlan to use Grails plugins

••••

Page 10: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

When to use Ratpack?

Low number of domain classes

Limited number of routes/endpoints

MVC paradigm is not needed

Small but evolving REST API

••••

Page 11: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

Routes

HTTP verb, endpoint, and code blockEndpoint corresponds to URL fragment:<identifier> injects named value into urlparamsCode block is injected with:

requestresponserendererurlparams

••••

••••

Page 12: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

Routes

get(“/index”) {// code}

post(“/login”) {// code}

put(“/entry/:id”) {// code}

Page 13: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

Routes

get(“/index”) {// code}

post(“/login”) {// code}

put(“/entry/:id”) { ==> /post/3// code urlparams.id = 3}

Page 14: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

Example Ratpack App

import com.bleedingwolf.ratpack.*

class App {public static void main(String [] args) {def app = Ratpack.app {set ‘public’, ‘public’set ‘templateRoot’, ‘templates’

post(“/”) {request.toString() + “\n” + params.toString()}get(“/”) {“Hello world”}}RatpackServlet.serve(app)}}

Page 15: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

Demo

Page 16: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

Templates

Page 17: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

SimpleTemplateEngine

JSP style code blocks

<% %>

<%= %>

Relies on ${} object replacement

JQuery ($) quirks

•••

••

Page 18: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

Markdown

Markup language for converting text to (X)HTMLSupported by many frameworks and websitesLibraries exist for a number of programming languagehttp://daringfireball.net/projects/markdown

••••

Page 19: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

Markdown Basics

Headers (#)Lists (* or numbers)Code SnippetsEmphasis (* ex. *stuff*)Strong/Bold (** ex. **stuff**)Links

••••••

Page 20: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

Sample Markdown App

set ‘public’, ‘public’set ‘templates’, ‘templates’

get(‘/’) {def m = new MarkdownProcessor()def p = render ‘template.md’, [num:4]m.markdown(p)}

Page 21: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

App Structure

Page 22: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

Maven-ish

/main/src/groovy/templates/public/lib/resources/web.xml/build.gradle

Page 23: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

Standalone

/src//app/resources/scripts/app/resouces/templates/main/test

Page 24: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

Creating a Blog App with Ratpack

Page 25: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

App Essentials

Uses simple NoSQL database

UI is tweaked Tumblr them

~156 lines of Groovy code

•••

Page 26: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

Blog CRUD Routes

get(“/entry/create”) {render ‘entry/create.html’}get(“/entry/show/:id”) {def entry = db.get(urlparams.id)render ‘/entry/show.html’, [entry: entry]}get(“/entry/delete/:id”) {db.remove(urlparams.id)}

Page 27: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

Blog CRUD Routes (cont’d)

get(“/entry/list”) {def list = db.all()list.sort(sortClosure.curry(‘dateCreated’))list = list.reverse()render ‘entry/index.html’, [entries: list]}get(“/entry/save”) {def entry = new Entry(params)db.save(entry.properties, {obj ->println “Finished saving.”new JSONObject([success:true]).toString()});}

Page 28: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

App Essentials

Uses simple NoSQL database

UI is tweaked Tumblr them

~156 lines of Groovy code

•••

Page 29: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

Demo

Page 30: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

Running / Deploying the App

Page 31: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

Running the Application

gradle jettyRunWar

Page 32: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

Deploying as a War File

Page 33: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

Creating a War File

gradle war

Page 34: Ratpack: Classy and Compact Web Appss3-eu-west-1.amazonaws.com/presentations2012/15_presentation.pdf · Ratpack: Classy and Compact Web Apps. Where I Was From 1A - 12 Noon Today...

Questions ?