Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 高效的JSF分页_Jsf 2_Primefaces - Fatal编程技术网

Jsf 2 高效的JSF分页

Jsf 2 高效的JSF分页,jsf-2,primefaces,Jsf 2,Primefaces,在JSF2.0应用程序中,最有效的分页方式是什么? 我使用Primefaces数据表,它足够智能,可以执行 自动分页,完全没有编码 <p:dataTable var="car" value="#{carBean.cars}" paginator="true" rows="10"> <!-- Multiple columns here--> </p:dataTable> 我看到的是,我需要将bean放置到会话范围或更大的范围 @ManagedBea

在JSF2.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
    }
}
@ManagedBean
@会议范围
公共级卡宾{
公共列表getCars(){
//从数据库返回数据
}
}
我想知道有没有其他有效的方法来实现这一点

顺便说一下,我在后端使用了EJB/JPA。想知道任何链接或教程 了解更多关于这方面的信息


谢谢。

我发现Primefaces数据表的内置分页功能是最好的功能之一,并对其进行了大量的负载测试,引入了包含30000多个Hibernate实体的记录集,发现性能不太好。这当然意味着您将有30000个实体在会话中,因此我在我的
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>

状态保存方法:“客户端”或“服务器”(=默认值)。参见JSF规范2.5.2
javax.faces.STATE_保存方法
服务器
这将减少ViewState的大小,从而大大减少请求/响应的大小,但是这样做会严重影响服务器端内存

在一些JSF实现中,另一个有助于减少ViewStat大小或会话内存使用的潜在选项是压缩。下面的链接描述了许多可以设置的SUN RI和MyFaces JSF配置参数,其中一些参数提供了会话状态压缩选项


为了进一步了解Primefaces数据表分页功能的工作原理,为什么不直接访问源代码呢?Primefaces毕竟是一个开源项目,所以只要看看代码,看看你能学到什么:

你需要使用
LazyDataModel
,以便在内存中只客户端实际需要查看的行。这会在DB级别进行分页,这是您最终想要的


RichFaces支持的方式与ArrangableDataModel相同。

重要注意事项取决于您使用的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.
private MyDataModel dataModel=null;
公共MyDataModel getDataModel(){
如果(dataModel!=null)返回dataModel;
dataModel=新的MyDataModel(一些列表);
返回数据模型;
}
公共静态类MyDataModel扩展了ListDataModel
实现SelectableDataModel{
MyDataModel(列表源){
超级(来源);
}
等
然后p:dataTable属性变为{bean.dataModel}


祝你好运。

在一个生产应用程序中,我们使用了一个惰性数据模型来处理数据库中的700000条记录。我建议使用M3,它修复了惰性数据表的情况。

嗨,BalusC,这是一个很好的建议。我会使用这个。但是,我注意到这个模型是特定于primefaces的。我只是想知道,如果我使用的是JSF数据表,会怎么样只是,那么在这种情况下分页是如何完成的呢?很抱歉,这个额外的问题引起了我的好奇心。我有一个EJB/JPA来处理我的业务逻辑。你只需要在一些助手bean中编写必要的样板代码。你可以在本文中获得一些入门示例/见解:(注意:3年前的文章和JSF 1.2目标!)@确实是BalusC。所有的样板都在某个助手bean中。为什么JSF必须如此通用?为什么JSF内置的dataTable组件在存在10年后缺少类似于
LazyDataModel
的东西?