本文是在Play2.1下进行的,不过很可能也适合Play2的各个版本。
=======================================
play2.1的业务操作返回信息可以使用Ajax的结果由alert向用户展示。
如果需要这种方法,可以参考http://somefuture.iteye.com/blog/1983621
(请一定注意:这种方法仅仅适合于Play!2.1,其他版本几乎是不可能这样做的。)
我写了一个通用方法,可以进行增删改:
import java.util.concurrent.Callable;
import play.db.jpa.JPA;
import play.libs.F.Function;
import play.libs.F.Function0;
import play.libs.F.Promise;
import play.mvc.Result;
import play.mvc.Results;
public class AsyncTransanctionUtil{
public static final Integer PERSIST = 1;
public static final Integer MERGE = 2;
public static final Integer REMOVE = 3;
public static Result asyncResult(final Integer type, final Object object) {
Promise<Boolean> promiseOfInt = play.libs.Akka
.future(new Callable<Boolean>() {
public Boolean call() {
if (type == PERSIST) {
try {
JPA.withTransaction(new Function0<Void>() {
@Override
public Void apply() throws Throwable {
JPA.em().persist(object);
return null;
}
});
} catch (Throwable e) {
return false;
}
}else if (type == MERGE) {
try {
JPA.withTransaction(new Function0<Void>() {
@Override
public Void apply() throws Throwable {
JPA.em().merge(object);
return null;
}
});
} catch (Throwable e) {
return false;
}
}else if (type == REMOVE) {
try {
JPA.withTransaction(new Function0<Void>(){
public Void apply() throws Throwable {
Object obj = JPA.em().merge(object);
JPA.em().remove(obj);
return null;
};
});
} catch (Throwable e) {
return false;
}
}
return true;
}
});
return Results.async(promiseOfInt.map(new Function<Boolean, Result>() {
public Result apply(Boolean result) {
if (result) {
return Results.ok("success");
}else {
return Results.badRequest("fail");
}
}
}));
}
}
==========================================以上是异步处理
Play还可以使用flash进行操作提示。
业务处理结束后,通过一句即可
flash("success", "完成了,啊哈哈哈");
比如:
@Transactional
public static Result deletedp(Long sid, Long pid){
Deployment deployment = (Deployment) JPA.em()
.createQuery("from Deployment where sid=? and pid=?")
.setParameter(1, sid).setParameter(2, pid).getResultList()
.get(0);
// return AsyncTransanctionUtil.asyncResult(AsyncTransanctionUtil.REMOVE, deployment);
JPA.em().remove(deployment);
flash("success", "呃,就这样吧,主公快走");
return redirect("/index");
}
这样页面会收到flash信息。
因为flash信息是一种HTTP内容,保存进了cookie中:
package play.mvc;
import java.io.*;
...
/**
* Defines HTTP standard objects.
*/
public class Http {
...
/**
* HTTP Flash.
* <p>
* Flash data are encoded into an HTTP cookie, and can only contain simple String values.
*/
public static class Flash extends HashMap<String,String>{...}
...
}
上面是Flash类的定义。
页面的获取方式很简单:
@if(flash.containsKey("success")){
<div>
@flash.get("success")
</div>
}
把想要展示的东西if出来就行。
======================存在的问题:
如果从该页面跳转后再返回来,由于不是重新请求,flash信息依然存在也会显示出来。