On Github jamesward / introduction_to_the_play_framework-java
typesafe.com/platform/getstarted
Create a New Play App
activator new
IDE Support
activator idea
Run the App
activator ~run
Open the App
http://localhost:9000VERB PATH CONTROLLER_METHOD GET / controllers.Application.index() GET /foo controllers.Application.foo()
public static Result index() {
    return ok(index.render("hello, world"));
}
@(message: String)
@main("Welcome to Play 2.0") {
    @message
}
Run All Tests Once
activator test
Run All Tests Continuously
activator ~test
Run One Test
activator "test-only my.namespace.MySpec"
Run Failed Tests
activator test-quick
@Test
public void indexTemplate() {
    Content html = views.html.index.render("test");
    assertThat(contentType(html)).isEqualTo("text/html");
    assertThat(contentAsString(html)).contains("test");
}
@Test
public void callIndex() {
    running(fakeApplication(), new Runnable() {
        public void run() {
            Result result = callAction(controllers.routes.ref.Application.index());
            assertThat(status(result)).isEqualTo(OK);
            assertThat(contentType(result)).isEqualTo("text/html");
            assertThat(charset(result)).isEqualTo("utf-8");
            assertThat(contentAsString(result)).contains("Your new application is ready.");
        }
    });
}
@Test
public void fooRoute() {
    running(fakeApplication(), new Runnable() {
        public void run() {
            Result result = route(fakeRequest("GET", "/foo"));
            assertThat(result).isNotNull();
        }
    });
}
db.default.driver=org.h2.Driver db.default.url="jdbc:h2:mem:play" ebean.default="models.*"
package models;
import play.db.ebean.Model;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Bar extends Model {
    @Id
    public String id;
    public String name;
}
@Test
public void create() {
    running(fakeApplication(), new Runnable() {
        public void run() {
            Bar bar = new Bar();
            bar.name = "Write a test";
            bar.save();
            assertThat(bar.id).isNotNull();
        }
    });
}
public static Result addBar() {
    Bar bar = Form.form(Bar.class).bindFromRequest().get();
    bar.save();
    return redirect(routes.Application.index());
}
POST /bars controllers.Application.addBar()
@helper.form(action = routes.Application.addBar()) {
    <input name="name"/>
    <input type="submit"/>
}
public static Result getBars() {
    List<Bar> bars = new Model.Finder(String.class, Bar.class).all();
    return ok(toJson(bars));
}
GET /bars controllers.Application.getBars()
@Constraints.Required public String name;
public static Result addBar() {
    Form<Bar> form = form(Bar.class).bindFromRequest();
    if (form.hasErrors()) {
        return badRequest(index.render(form));
    }
    else {
        // save
    }
}
<script src='@routes.Assets.at("javascripts/foo.min.js")'></script>
                    $ ->
    $.get "/bars", (data) ->
        $.each data, (index, bar) ->
            $("#bars").append $("<li>").text bar.name
<script src='@routes.Assets.at("javascripts/index.min.js")'>
"org.webjars" %% "webjars-play" % "2.2.0", "org.webjars" % "bootstrap" % "2.3.1"Create Route for WebJarAssets Controller
GET /webjars/*file controllers.WebJarAssets.at(file)Use a WebJar
<script src='@routes.WebJarAssets.at(WebJarAssets.locate("jquery.min.js"))'></script>
                    public static Result index() {
    return ok(views.html.index.render("hello"));
}
public static F.Promise<Result> index() {
    return F.Promise.promise(new F.Function0<Result>() {
        public Result apply() {
            return ok(views.html.index.render("hello"));
        }
    });
}
public static F.Promise<Result> index() {
    return F.Promise.delayed(new F.Function0<Result>() {
        public Result apply() throws Throwable {
            return ok(views.html.index.render("hello"));
        }
    }, 5, TimeUnit.SECONDS);
}
public static F.Promise<Result> index() {
    F.Promise<WS.Response> jw = WS.url("http://www.jamesward.com").get();
    return jw.map(new F.Function<WS.Response, Result>() {
        public Result apply(WS.Response response) throws Throwable {
            return ok(response.getBody());
        }
    });
}
public static F.Promise<Result> index() {
    final F.Promise<WS.Response> jw = WS.url("http://www.jamesward.com").get();
    final F.Promise<WS.Response> tw = WS.url("http://www.twitter.com").get();
    return jw.flatMap(new F.Function<WS.Response, F.Promise<Result>>() {
        public F.Promise<Result> apply(final WS.Response jwR) throws Throwable {
            return tw.map(new F.Function<WS.Response, Result>() {
                public Result apply(WS.Response twR) throws Throwable {
                    return ok(twR.getBody() + jwR.getBody());
                }
            });
        }
    });
}
public static Result events() {
    EventSource eventSource = new EventSource() {
        public void onConnected() {
            sendData("hello");
        }
    };
    return ok(eventSource);
}
$ ->
  events = new EventSource("/events")
  events.onmessage = (e) ->
    console.log(e.data)
public static WebSocket<String> echo() {
    return new WebSocket<String>() {
        public void onReady(final In<String> in, final Out<String> out) {
            in.onMessage(new F.Callback<String>() {
                public void invoke(String message) throws Throwable {
                    out.write(message);
                }
            });
        }
    };
}
$ ->
    ws = new WebSocket("ws://localhost:9000/echo")
    ws.onopen = () ->
        ws.send("foo")
    ws.onmessage = (message) ->
        console.log(message.data)