由于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环境的安装