好吧,我有一个使用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());
答案 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();
}
...
}
列表属性与会话一样长。 但是这个设计也存在问题,例如,更新基本列表后的内容是什么?并且解决方案不是线程安全的。