有一个JSF 1.2应用程序无法在可观察的未来切换到另一个版本/技术。通常需要显示一个小(模态)表单,需要在多个请求中保留一些状态。工作完成(确认或取消)后,在表单再次打开之前不需要此状态。有很多这样的表单和会话对象(单独的每个表单会话bean或特殊的大型会话bean的成员)用于保持其状态。会议可能会持续很长时间,可能是整个工作日。因此,许多对象不必要地加载会话范围。
是否有一种简单,标准的方法可以在不再需要时清理会话对象?你有什么解决方案?
答案 0 :(得分:1)
@ Alex,
正如您所提到的,您有多个视图/页面要在多个请求中呈现/保留,并且在用户会话未到期之前一直保持不变。 这只是因为bean范围是会话,可能你已经做到了它是为了避免多次db调用来实现性能,只是避免在每次请求时从数据库重新加载相同的信息。
我认为您在用户会话bean或任何其他最适合的会话bean中创建一个集合(根据您的选择,但我建议仅为此目的创建新Bean)。 在此集合中,您只需将要显示的模型数据放在页面上,就不要在上下文文件中注册此bean。坚持你需要的对象,就像你有三页.P1,P2& P3和P3之后你想要从会话中删除model1(你的pojo)然后在导航事件中从集合中删除model1。
//Sample code which help to understand what I am saying
@Session
UserBean {
Map tempBean<Obejct,String>=new HashMap<Object,String>();
//just for example suppose you want to load Model1
public Model1 viewP1() {
if(tempBean.get("P1info")==null){//key for P1 view
Model1 m1=db.getP1info();
tempBean.put("P1info",m1);
}
return (m1)tempBean.get("P1info");
}
}
要从会话中删除Model1数据,只需将值设置为null,即键#34; P1info&#34;在上面代码的情况下,您可以使用WeakHashMap,如果您不想从Map中删除键。但是请确保删除事件触发器上的值部分,之后您不希望在会话中保留Model1值。
我希望这会对你的情况有所帮助。如果我没有共享工作代码,只是显示概念,请告诉我实施方面的任何问题。
答案 1 :(得分:0)
试着看看这里 link 我会在“工作完成”后对所有对象进行删除。