play framework

Post on 27-Nov-2014

3.914 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

 

TRANSCRIPT

PLAY FRAMEWORKIntroduction & highlights of v2.1

WHO AM I?Andrew Skiba

I work in Tikal as the leader of Java group.

With over 50 Java experts, we meet, share, contribute, and code together on a monthly

basis.

YES! WE START A NEW PROJECT!

NEW PROJECT DILEMMA

WITH RISK OF ENDING UP WITH POLYGLOT PROJECT WITH MIX OF LANGUAGES AND TECHNOLOGIES - OR EVEN

REWRITING PARTS OF YOUR APPLICATION LATER...

WHAT HAPPENED, TWITTER?

• Bill Venners: I’m curious, and the Ruby folks will want it spelled out: Can you elaborate on what you felt the Ruby language lacked in the area of reliable, high performance code?

• Steve Jenson: One of the things that I’ve found throughout my career is the need to have long-lived processes. And Ruby, like many scripting languages, has trouble being an environment for long lived processes. But the JVM is very good at that, because it’s been optimized for that over the last ten years.

JAVA IS A SAFE CHOICEExcept the risk of dying while waiting for builds & redeployments, or

maintaining XML configurations...

CAN YOU HAVE YOUR CAKE AND EAT IT, TOO?

PLAY FRAMEWORKCombine them all!

STRONG & FASTFast turnaround - just save and refresh browser

REACTIVE

Text

Event driven non blocking IO

SCALABLEStateless, non blocking, web-friendly architecture

COMPLETEEasy things are easy, complicated things are possible

DEMO OF А NEW PROJECT

IT LOOKS LIKE A MAGIC!

SO JAVA OR SCALA?

FUNCTIONAL/OO BLEND

EXPRESSIVENESS

val qsort: List[Int] => List[Int] = { case Nil => Nil case pivot :: tail => val (smaller, rest) = tail.partition(_ < pivot) qsort(smaller) ::: pivot :: qsort(rest) }

JAVA COMPATIBILITY

UNPRECEDENTED TYPE SAFETY

DSLS

COMMUNITY

'NOUGH SAID!

• Charles Nutter, creator of JRuby: "Scala, it must be stated, is the current heir apparent to the Java throne. No other language on the JVM seems as capable of being a "replacement for Java" as Scala, and the momentum behind Scala is now unquestionable."

• James Strachan, creator of Groovy: "I can honestly say if someone had shown me the Programming in Scala book by by Martin Odersky, Lex Spoon & Bill Venners back in 2003 I'd probably have never created Groovy."

DEMO OF SCALA POWER

New JSON API with REPL

def index = Action { import play.api.libs.json._

val json = Json.obj( "status" -> "OK", "message" -> "Hello", "framework" -> Json.obj( "name" -> "Play"))

val jsonTransformer = ( __ \ 'framework).json.update( __.read[JsObject].map { o => o ++ Json.obj("version" -> "2.1.0") })

Ok( json.transform(jsonTransformer).get ) }

ORDER OF THINGS

ANATOMY OF A PLAY APPLICATION

app → Application sources └ assets → Compiled asset sources └ stylesheets → Typically LESS CSS sources └ javascripts → Typically CoffeeScript sources └ controllers → Application controllers └ models → Application business layer └ views → Templatesconf → Configurationurations files and other non-compiled resources └ application.conf → Main configuration file └ routes → Routes definitionpublic → Public assets └ stylesheets → CSS files └ javascripts → Javascript files └ images → Image filesproject → sbt configuration files └ build.properties → Marker for sbt project └ Build.scala → Application build script └ plugins.sbt → sbt plugins

POWERFUL URL ROUTING

# The home pageGET / controllers.Projects.index

# AuthenticationGET /login controllers.Application.loginPOST /login controllers.Application.authenticateGET /logout controllers.Application.logout # ... # Tasks GET /projects/:project/tasks controllers.Tasks.index(project: Long)POST /projects/:project/tasks controllers.Tasks.add(project: Long, folder: String)PUT /tasks/:task controllers.Tasks.update(task: Long)DELETE /tasks/:task controllers.Tasks.delete(task: Long)

# ...

# Javascript routingGET /assets/javascripts/routes controllers.Application.javascriptRoutes

# Map static resources from the /public folder to the /assets pathGET /assets/*file controllers.Assets.at(path="/public", file)

POWERFUL TEMPLATE ENGINE

UNIFIED ERROR REPORTING

TASTING MENU

SPRING WITH PLAY

@org.springframework.stereotype.Servicepublic class HelloService {

public String hello() { return "Hello world!"; }}//////////////////@org.springframework.stereotype.Controllerpublic class Application extends Controller {

@Autowired private HelloService helloService;

public Result index() { return ok(index.render(helloService.hello())); }}

DEMO OF REQUIREJS

TESTINGincluding a browser simulator!

DEMO OF SUBROUTES

in main project

# The home pageGET / controllers.Application.index# Include a sub-project-> /my-subproject my.subproject.Routes

in conf/my.subproject.routes

GET / my.subproject.controllers.Application.index

now just surf to /my-subproject and get called my.subproject.controllers.Application.index

DEMO OF REACTIVE MONGO

val query = BSONDocument("firstName" -> BSONString("Jack"))

// get a Cursor[DefaultBSONIterator] val cursor = collection.find(query) // let's enumerate this cursor and print a readable // representation of each document in the response cursor.enumerate.apply(Iteratee.foreach { doc => println("found document: " + BSONDocument.pretty(doc)) })

// or, the same with getting a list val cursor2 = collection.find(query) val futurelist = cursor2.toList futurelist.onSuccess { case list => val names = list.map(_.getAs[BSONString]("lastName").get.value) println("got names: " + names) }

top related