`
somefuture
  • 浏览: 1078548 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Play!2.1 提示信息flash的使用

 
阅读更多

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

 

 

0
0
分享到:
评论
2 楼 somefuture 2014-05-04  
string2020 写道
flash作用域和servlet中的request作用域有什么不同
play框架是无状态的,它的实现都是依赖cookie的。
1 楼 string2020 2014-05-03  
flash作用域和servlet中的request作用域有什么不同

相关推荐

Global site tag (gtag.js) - Google Analytics