我们的页面有一个数据表,显示来自Web服务的记录。 Web服务查询数据库,查询可能需要10秒到100秒。
我最初加载绑定到支持bean构造函数中的数据表的arraylist:
private ArrayList myList;
public MyBean
{
myList = WebServices.getList();
}
在这种情况下,只有在Web服务返回所有数据后,整个页面才会开始呈现。
我应该在哪里调用webservice(即,myList = WebServices.getList();
)以使页面的其余部分并行加载,并在webservice运行时在数据表中显示进度条或其他内容?
我想我关于JSF / IceFaces生命周期的概念并不清楚......
此外,这不是关于延迟加载,因为我们还必须在数据库查询中实现分页。
谢谢!
答案 0 :(得分:0)
我找到了一个使用Threads的工作。
public class MyBean
{
private ArrayList myList;
private PersistentFacesState state;
public MyBean
{
state = PersistentFacesState.getInstance();
myList = new ArrayList();
new Thread(new RunService()).start();
}
public class RunService implements Runnable
{
public void run()
{
try
{
list = WebServices.getList();
state.executeAndRender(); //Need to do this to update view
}
catch(Exception e)
{
}
}
}
}
最初我不知道PersistentFacesState
和executeAndRender();
,所以即使线程更新数组列表,视图也不会被刷新。这是因为JSF / IceFaces生命周期已经结束。
坚持视图然后重新渲染它也解决了这个问题。
希望此解决方案可以帮助某人。