在JSF 2.0应用程序中进行分页的最有效方法是什么? 我使用Primefaces数据表,它足够智能执行 分页本身没有编码。
<p:dataTable var="car" value="#{carBean.cars}" paginator="true" rows="10">
<!-- Multiple columns here-->
</p:dataTable>
我看到的是,我需要将我的bean放置到会话范围或更高的范围。
@ManagedBean
@SessionScoped
public class CarBean{
public List<Car> getCars(){
//return data from DB
}
}
我想知道还有另一种有效的方法来执行此操作吗?
顺便说一下,我在后端使用了EJB / JPA。想知道任何链接或教程 了解更多相关信息。
感谢。
答案 0 :(得分:19)
您需要使用LazyDataModel
才能仅客户端实际需要查看的内存行。 See also the example in PrimeFaces showcase。这会在数据库级别进行分页,这是您最终想要的。
RichFaces的支持方式与ArrangableDataModel
,here's the RichFaces showcase example相同。
答案 1 :(得分:2)
在生产应用中,我们使用了懒惰的数据模型来处理db中的700000条记录。我建议使用M3修复懒惰的数据表案例。
答案 2 :(得分:1)
我发现Primefaces数据表的内置分页功能是最好的功能之一,并对其进行了大量的负载测试,带来了超过30,000个Hibernate实体的记录集,并发现性能低迷。这当然意味着您将在会话中拥有30,000个实体,因此我在web.xml
中有以下内容来帮助您在服务器端存储会话。
<context-param>
<description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>
这将减小ViewState的大小,从而大大减少请求/响应大小,但是服务器端内存可能会因此而受到极大的影响。
某些JSF实现中的另一个潜在选项是帮助减轻ViewStat或会话内存使用的大小,这是压缩。以下链接描述了可以设置的许多SUN RI和MyFaces JSF配置参数,其中一些参数提供了压缩会话状态的选项。 http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=%2Fcom.ibm.websphere.express.doc%2Finfo%2Fexp%2Fae%2Frweb_jsfengine.html
至于了解Primefaces DataTable分页功能的工作原理,为什么不直接找到源代码呢? Primefaces毕竟是一个开源项目,所以只需查看代码并看看你可以学到什么:http://code.google.com/p/primefaces/source/browse/#svn%2Fprimefaces
答案 3 :(得分:0)
重要说明取决于您使用的Primefaces版本。从3.0.M2(我认为)开始,如果要使用行选择功能,则必须实现 SelectableDataModel 。这打破了许多遗留代码,并且有很多关于此的婊子。
最简单的方法是创建一个这样的内部类:
private MyDataModel dataModel = null;
public MyDataModel getDataModel() {
if (dataModel != null) return dataModel;
dataModel = new MyDataModel(some list);
return dataModel;
}
public static class MyDataModel extends ListDataModel<SomeRecord>
implements SelectableDataModel<SomeRecord> {
MyDataModel(List<SomeRecord> source) {
super(source);
}
etc.
然后 p:dataTable 的值属性变为#{bean.dataModel} 。
祝你好运。