本文是在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信息依然存在也会显示出来。