Playframework(5)Java Project and SQL Database

Playframework(5)Java Project and SQL Database

8. Accessing an SQL Database
Configuring JDBC connection pools
conf/application.conf

# Default database configuration
db.default.driver=org.h2.Driver
db.default.url="jdbc:h2:mem:play"

#Orders database
db.orders.driver=org.h2.Driver
db.orders.url="jdbc:h2:mem:order"

#customers database
db.customers.driver=org.h2.Driver
db.customers.url="jdbc:h2:mem:customers"

Accessing the JDBC database: Database ds = DB.getDatasource();

Obtaining a JDBC connection Connection connection = DB.getConnection();

Exposing the datasource through JNDI
db.default.driver=org.h2.Driver
db.default.url="jdbc:h2:men:play"
db.default.jndiName=DefaultDS

Using Ebean ORM
http://www.avaje.org/

conf/application.conf:
ebean.default="models.*"

ebean.orders="models.Order, models.OrderItem"
ebean.customer="models.Customer, models.Address"

Using the play.dv.ebean.Model Superclass
@Entity
public class Task extends Model{
@Id
@Constraints.Min(10)
public Long id;

@constraints.Required
public String name;

public boolean done;

@Format.DateTime(pattern="dd/MM/yyyy")
public Data dueDate = new Date();

public static Finder<Long,Task> find = new Finder<Long, Task>(
Long.class, Task.class
);
}

Allmost like hibernate

Transactional actions
We need to enable the helper for that on Ebean.

Intergrating with JPA
Exposing the datasource through JNDI

Adding a JPA implementation to my project
"org.hibernate" % "hibernate-entitymanager" % "3.6.9.Final"

Creating a persistence unit
conf/META-INF/persistence.xml

Annotating JPA actions with @Transactional

Using the play.db.jpa.JPA helper
public static Company findById(Long id){
return JPA.em().find(Company.class, id);
}

9 The Play Cache API
The default cache API uses EHCache. play.cache.Cache
Cache.set("item.key", frontPageNews);

News news = Cache.get("item.key");

Remove the cache, Cache.set("item.key", null, 0) Cache.remove("item.key")

Caching HTTP Responses
@Cached("homePage")
public static Result index(){
return ok("Hello world");
}

10. Calling WebService
play.libs.WS provides a way to make asynchronous HTTP calls.

We will use promise then.

11. Integration with Akka

12. Internationalization

13. Application Global Settings
The Global Object
We need to define a global object in the root package
import play.*;
public class Global extends GlobalSettings{
}

Intercepting application start-up and shutdown
public class Global extends GlobalSettings{
public void onStart(Application app){
Logger.info("Application has started");
}

public void onStop(Application app){
Logger.info("Application shutdown...");
}
}

Providing an application error page
When an exception occurs in my application, the onError operation will be called.

public class Global extends GlobalSettings{
public Result onError(Throwable t){
return internalSeverError(
views.html.errorPage(t)
);
}
}

Handling action not found
If the framework doesn't find an action method for a request, the onHandlerNotFound operation will be called:
public class Global extends GlobalSettings{
public Result onHandlerNotFound(String uri){
return notFound(
views.html.pageNotFound(uri)
);
}
}

The onBadRequest operation will be called if a route was found, but it was not possible to bind the request parameters.
public class Global extends GlobalSettings{
public Result onBadRequest(String uri, String error){
return badRequest("Don't try to hack the URI!");
}
}

Intercepting Requests
One important aspect of the GlobalSettings class is that it provides a way to intercept requests and execute business logic before a request is dispatched to an action.

public class Global extends GlobalSettings{
public Action onRequest(Request request, Method actionMethod){
System.out.println("before each request…" + request.toString());
return super.onRequest(request, actionMethod);
}
}

14. Testing Your Application
Using JUnit and Running a fake application

fakeApplication(inMemoryDatabase())

Writing functional tests
Testing a template
@Test
public void renderTemplate(){
Content html = views.html.index.render("Coco");
assertThat(contentType(html)).isEqualTo("text/html");
assertThat(ContentAsString(html)).contains("Coco");
}

Testing your controllers
@Test
public void callIndex(){
Result result = callAction(
controllers.routes.ref.Application.index("Kiko");
);
assertThat(status(result)).isEqualTo(OK);
assertThat(contentType(result)).isEqualTo("text/html");
assertThat(charset(result)).isEqualTo("utf-8");
assertThat(contentAsString(result)).contains("Hello Kiki");
}

Testing the router
Instead of calling the Action, we can let the Router do it.
@Test
public void badRoute(){
Result result = routeAndCall(fakeRequest(GET, "/xx/Kiki"));
assertThat(result).isNull();
}

Starting a real HTTP server
@Test
public void testInServer(){
running(testServe(3333), new Callback0(){
assertThat(
WS.url("http://localhot:3333").get().get().status
).isEqualTo(OK);
});
}

Testing from within a web browser
Selenium WebDriver
@Test
public void runInBrowser(){
running(testServer(3333), HTMLUNIT, new Callback<TestBrowser>(){
public void invoke(TestBrowser browser){
browser.goTo("http://localhost:3333");
assertThat(browser.$("#title").getTexts().get(0)).isEqualTo("Hello Guest");
browser.$("a").click();

assertThat(browser.url()).isEqualTo("http://localhost:3333/Coco");
assertThat(browser.$("#title", 0).getText()).isEqualTo("Hello Coco");
}
})
}

References:
http://www.playframework.org/documentation/2.0.4/JavaHome
http://www.playframework.org/documentation/2.0.4/JavaDatabase
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值