Download - Play framework
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) }
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/