PLAY FRAMEWORK
 Introduction & 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 CHOICE
Except the risk of dying while waiting for builds & redeployments, or
                  maintaining XML configurations...
CAN YOU HAVE YOUR CAKE AND
        EAT IT, TOO?
PLAY FRAMEWORK
   Combine them all!
STRONG & FAST
Fast turnaround - just save and refresh browser
Text




     REACTIVE
Event driven non blocking IO
SCALABLE
Stateless, non blocking, web-friendly architecture
COMPLETE
Easy things are easy, complicated things are possible
DEMO OF А NEW PROJECT
IT LOOKS LIKE A MAGIC!
SO JAVA OR SCALA?
FUNCTIONAL/OO BLEND
val qsort: List[Int] => List[Int] = {
    case Nil => Nil
    case pivot :: tail =>
      val (smaller, rest) = tail.partition(_ < pivot)
      qsort(smaller) ::: pivot :: qsort(rest)
  }




             EXPRESSIVENESS
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."
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
      )
  }




      DEMO OF SCALA POWER
                    New JSON API with REPL
ORDER OF THINGS
app                 → Application sources
 └ assets            → Compiled asset sources
   └ stylesheets       → Typically LESS CSS sources
   └ javascripts      → Typically CoffeeScript sources
 └ controllers       → Application controllers
 └ models            → Application business layer
 └ views             → Templates
conf                → Configurationurations files and other non-compiled
resources
 └ application.conf → Main configuration file
 └ routes            → Routes definition
public              → Public assets
 └ stylesheets        → CSS files
 └ javascripts       → Javascript files
 └ images            → Image files
project             → sbt configuration files
 └ build.properties    → Marker for sbt project
 └ Build.scala       → Application build script
 └ plugins.sbt        → sbt plugins



ANATOMY OF A PLAY APPLICATION
# The home page
GET     /                                   controllers.Projects.index

# Authentication
GET     /login                              controllers.Application.login
POST    /login                              controllers.Application.authenticate
GET     /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 routing
GET     /assets/javascripts/routes          controllers.Application.javascriptRoutes

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




              POWERFUL URL ROUTING
POWERFUL TEMPLATE ENGINE
UNIFIED ERROR REPORTING
TASTING MENU
@org.springframework.stereotype.Service
public class HelloService {

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

    @Autowired
    private HelloService helloService;

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




     SPRING WITH PLAY
DEMO OF REQUIREJS
TESTING
including a browser simulator!
in main project

# The home page
GET /               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 SUBROUTES
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)
}




DEMO OF REACTIVE MONGO
LINKS

•   http://www.playframework.com/ (Doh!)

•   http://typesafe.com/stack

•   http://blog.typesafe.com/scala-akka-and-play-framework-at-devoxx-2012

•   http://typesafe.com/public/case-studies/LinkedInCase_v8.pdf

•   http://docs.cloudfoundry.com/frameworks/play/java-mongodb.html

•   https://github.com/wsargent/play-2.0-spring-module

•   http://jonasboner.com/2008/10/06/real-world-scala-dependency-injection-di/

Play framework

  • 1.
    PLAY FRAMEWORK Introduction& highlights of v2.1
  • 2.
    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.
  • 3.
    YES! WE STARTA NEW PROJECT!
  • 4.
  • 5.
    WITH RISK OFENDING UP WITH POLYGLOT PROJECT WITH MIX OF LANGUAGES AND TECHNOLOGIES - OR EVEN REWRITING PARTS OF YOUR APPLICATION LATER...
  • 6.
    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.
  • 7.
    JAVA IS ASAFE CHOICE Except the risk of dying while waiting for builds & redeployments, or maintaining XML configurations...
  • 8.
    CAN YOU HAVEYOUR CAKE AND EAT IT, TOO?
  • 9.
    PLAY FRAMEWORK Combine them all!
  • 10.
    STRONG & FAST Fastturnaround - just save and refresh browser
  • 11.
    Text REACTIVE Event driven non blocking IO
  • 12.
    SCALABLE Stateless, non blocking,web-friendly architecture
  • 13.
    COMPLETE Easy things areeasy, complicated things are possible
  • 14.
    DEMO OF АNEW PROJECT
  • 15.
    IT LOOKS LIKEA MAGIC!
  • 16.
    SO JAVA ORSCALA?
  • 17.
  • 18.
    val qsort: List[Int]=> List[Int] = { case Nil => Nil case pivot :: tail => val (smaller, rest) = tail.partition(_ < pivot) qsort(smaller) ::: pivot :: qsort(rest) } EXPRESSIVENESS
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
    '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."
  • 24.
    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 ) } DEMO OF SCALA POWER New JSON API with REPL
  • 25.
  • 26.
    app → Application sources └ assets → Compiled asset sources └ stylesheets → Typically LESS CSS sources └ javascripts → Typically CoffeeScript sources └ controllers → Application controllers └ models → Application business layer └ views → Templates conf → Configurationurations files and other non-compiled resources └ application.conf → Main configuration file └ routes → Routes definition public → Public assets └ stylesheets → CSS files └ javascripts → Javascript files └ images → Image files project → sbt configuration files └ build.properties → Marker for sbt project └ Build.scala → Application build script └ plugins.sbt → sbt plugins ANATOMY OF A PLAY APPLICATION
  • 27.
    # The homepage GET / controllers.Projects.index # Authentication GET /login controllers.Application.login POST /login controllers.Application.authenticate GET /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 routing GET /assets/javascripts/routes controllers.Application.javascriptRoutes # Map static resources from the /public folder to the /assets path GET /assets/*file controllers.Assets.at(path="/public", file) POWERFUL URL ROUTING
  • 28.
  • 29.
  • 30.
  • 31.
    @org.springframework.stereotype.Service public class HelloService{ public String hello() { return "Hello world!"; } } ////////////////// @org.springframework.stereotype.Controller public class Application extends Controller { @Autowired private HelloService helloService; public Result index() { return ok(index.render(helloService.hello())); } } SPRING WITH PLAY
  • 32.
  • 33.
  • 34.
    in main project #The home page GET / 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 SUBROUTES
  • 35.
    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) } DEMO OF REACTIVE MONGO
  • 37.
    LINKS • http://www.playframework.com/ (Doh!) • http://typesafe.com/stack • http://blog.typesafe.com/scala-akka-and-play-framework-at-devoxx-2012 • http://typesafe.com/public/case-studies/LinkedInCase_v8.pdf • http://docs.cloudfoundry.com/frameworks/play/java-mongodb.html • https://github.com/wsargent/play-2.0-spring-module • http://jonasboner.com/2008/10/06/real-world-scala-dependency-injection-di/