高效的JSF分页

时间:2011-09-12 01:17:34

标签: jsf-2 primefaces

在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。想知道任何链接或教程 了解更多相关信息。

感谢。

4 个答案:

答案 0 :(得分:19)

您需要使用LazyDataModel才能客户端实际需要查看的内存行。 See also the example in PrimeFaces showcase。这会在数据库级别进行分页,这是您最终想要的。

RichFaces的支持方式与ArrangableDataModelhere'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}

祝你好运。