JSF会话范围的托管bean列表

时间:2011-10-21 20:12:42

标签: java jsf

我在请求范围中定义了我的JSF Handler,如下所示

public class JsfHandler {
  private List<ManagedBean>  managedBeanList;   // managed bean List in session scope
}

    <managed-bean>
        <managed-bean-name>jsfHandler</managed-bean-name>
        <managed-bean-class>com.test.JsfHandler</managed-bean-class>
         <managed-bean-scope>request</managed-bean-scope>
        <managed-property>
            <property-name>managedBeanList</property-name>
            <value>#{managedBeanList}</value>
        </managed-property>
      </managed-bean>

我在JSF中有一个会话范围的JSF托管bean列表,定义如下。

   <managed-bean>
      <managed-bean-name>managedBeanList</managed-bean-name>
      <managed-bean-class>java.util.ArrayList</managed-bean-class>
      <managed-bean-scope>session</managed-bean-scope>
   </managed-bean>

方法1:

managedBeanList.clear();
managedBeanList.addAll(service.getResultList());  
// assuming service.getResultList() would return a new ArrayList();

方法2:

managedBeanList =  service.getResultList();
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("managedBeanList",managedBeanList);

我们目前正在使用方法1.

方法2是否正确?在appraoch 2中调用Java Garabage收集器时,在内存使用方面是否有任何优势。

1 个答案:

答案 0 :(得分:1)

两者都不正确。该列表必须是会话作用域托管bean的属性。您应该尽可能避免手动摆弄会话地图。

这两者中没有一个比另一个更“GC友好”。在方法1中,您最终会在service.getResultList()返回的列表中找到未引用的实例。在方法2中,您最终得到了一个未引用的列表实例,该实例之前由managedBeanList引用。在这两种情况下,GC都必须完成相同的工作:清理未引用的实例。