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.
5. WITH RISK OF ENDING 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 A SAFE CHOICE
Except the risk of dying while waiting for builds & redeployments, or
maintaining XML configurations...
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
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 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
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
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