本文是在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信息依然存在也会显示出来。
版权声明
本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。




