2017-07-27 27 views
0

有一个JSF 1.2应用程序,在可见的将来无法切换到另一个版本/技术。通常需要显示一个小的(模态)表单,它需要在几个请求中保留一些状态。工作完成后(确认或取消),这个状态不需要,直到表单再次打开。有很多这样的表单和会话对象(单独的每个表单会话bean或特殊的巨大会话bean的成员)用于保持其状态。这些会议可能会持续很长时间,可能是整个工作日。所以很多对象不必要地加载会话范围。JSF 1.2:太多的小会话bean:是否不好,以及有什么替代方案

当不再需要清理会话对象时,是否有简单的标准方法?你有什么解决方案?

+0

我们现在正在做什么。与anil的建议类似,我们有一个会话Bean,它包含这些小型表单特定对象的字段和访问方法(在JSP中像'#{containerBean.formBean}'中一样访问)。但是这种方法需要特殊的手动编程来解决并发问题。另外我的IDE(Eclipse)经常挂在这个容器bean上的代码导航(因为成员数量已经很大)。 – Alex

回答

1

@亚历克斯,

正如你刚才提到你有多个视图/要渲染/在多个请求维护和保持持续到用户会话不会过期的页面。 这只是因为bean作用域是会话,可能是你已经做了避免多个数据库调用来实现性能,只是避免从每个请求的数据库重新加载相同的信息。

我认为你在用户会话bean或任何其他会话bean中创建了一个你最好的集合(根据你的选择,但我会建议仅为此创建New 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"); 
    } 
} 

要从届型号1数据只设置了一个空值的键“P1info”在上面的代码时,你可以使用WeakHashMap中,如果你不想从Map.But删除键确认删除事件触发器上的值部分,之后您不想在会话中保留Model1值。

我希望这会适用于您的情况。请让我知道在执行中的任何问题,因为我没有共享工作代码,但只显示概念。

0

试图给看看这里 link 我上一次“工作完成”的所有对象运行删除。