ApplicationScoped托管bean属性未在数据表

时间:2017-03-30 16:02:02

标签: jsf primefaces

好吧,我有一个使用JavaEE5的OLD jsp系统

其中一个屏幕向用户显示了从数据库每个视图调用的大数据表,因为这些表是巨大的,它们需要15个miutus来呈现所需的所有数据

为了解决这个问题,我选择使用AplicationScoped ManagedBean,将列表存储在List myList中,并加入用户界面的支持bean

到目前为止,非常好,它有效。

当应用程序添加另一个ecord时,我在过程中添加了一行来将新对象添加到列表myList.add(Object)

当我调试应用程序时,对象被正确放入列表中(列表增长一个记录)

但是当我注销并登录或刷新网格时,列表不会续订。

可能不是最好的解决方案(使用应用程序范围的bean)

我正在使用JSF 2.2,Primefaces 6.0和javaEE5

我的aPPScoped bean(未显示getter和setter以节省空间)

@ManagedBean(eager=true)
@ApplicationScoped
public class AplicationBean {

   public static List<Object> myList = new ArrayList();

   @PostConstruct
   public void iniciar() {
        myList=  est.getALLDATA();
   }
}

支持豆

@ManagedBean
@SessionScoped
public class jsfbean {

    private List<Object> myList= new ArrayList();

    @PostConstruct
    public void init(){
        this.myList =  AplicationBean.getALLDATA();
    }
}     

网格

                   

                     paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {Exporters}"                      
                     paginator="true"
                     rows="40"
                     >

在插入创建的对象后,我将其添加到列表中:

System.out.println("size"+AplicationBean.getMylist().size()); //(size is 1000)
AplicationBean.getMyList().add(P);

System.out.println("NEW SIZE"+AplicationBean.getMyList().size());

1 个答案:

答案 0 :(得分:1)

EJB和静态属性是个坏主意。我提出以下结构。

@Startup
@Singleton
public class ApplicationBean {

    public List<Object> myList = new ArrayList();

    @PostConstruct
    public void iniciar()
    {
        myList=  est.getALLDATA();
    }

    public void add(Object o){
        this.myList.add(o);
    }

}

@ManagedBean
@SessionScoped
public class SessionBean {

    @EJB
    ApplicationBean applicationBean;

    List<Object> list;

    // Cached for the session
    public List<Object> getObjectList(){
        if(list==null){
            list = applicationBean.getObjectList();
        }
        return list;
    }

    // Always fresh data
    public List<Object> getObjectListNotCached(){
        return applicationBean.getObjectList();
    }
    ...
}

列表属性与会话一样长。 但是这个设计也存在问题,例如,更新基本列表后的内容是什么?并且解决方案不是线程安全的。