论坛首页 Web前端技术论坛

RAP[2] RAP应用的Session问题

浏览 1977 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-06-28  
由于RAP是服务器端的应用,在这点上与一般的WEB应用没有什么区别。所以,RAP应用也需要解决Session问题。

[1]. 传统的单件模式
public class UserSession {
	private Integer number = 0;
	private static UserSession instance = new UserSession();
	public static getInstance() {
		return instance ;
	}
	public Integer getNumber() {
		this.number++; // 取一次值,就++
		return this.number;
	}
}

开着多个IE测试,你将会发现,多个IE任一调用getNumber(),那么,这个值会一直加。这说明普通的单件模式在RAP上要小心应用。


还好RAP提供了一个很简单的解决方案。就是:SessionSingletonBase.

SessionSingletonBase是抽象类,需要自定义的Session类去继承它。它的子类能提供针对一个user 上下文的唯一实体,也就是在一个user context中调用getInstance(Class)将会一直得到同一个对象实体,但对于不同user的context却会得到不同的对象实体。

[1]. 定义具体的Session类
public class UserSession extends SessionSingletonBase {
	private Integer number = 0; // 只是一个简单的针对单个用户的计数器

        // User currentUser;  你需要的也许是这样有意义的属性
        // Date loginTime;	

	private UserSession() { }

	public static UserSession getInstance() {
		return (UserSession) SessionSingletonBase.getInstance(UserSession.class);
	}
	
	public Integer getNumber() {
		this.number++; // 取一次值,就++. 当然,你也可以改成一个setNumber方法。
		return this.number;
	}
}


请注意中间的这段代码,这就是关键.SessionSingletonBase.getInstance(UserSession.class)如果值存在就一直返回这个,如果不存在将会new一个UserSession返回。
public static UserSession getInstance() {
	return (UserSession) SessionSingletonBase.getInstance(UserSession.class);
}


[2]. 自定义Session类的使用
// 拿值
UserSession.getInstance().getNumber();

好了,你可以开多个IE去测试,看看,每个UserSession的number是否只与单个IE相关联。


###################
RAP[1]RAP环境的安装
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics