在带有lazyLoading的数据表中使用List for source

时间:2017-02-06 13:39:27

标签: primefaces datatable

我有非常数据的列表。我想在延迟加载能力的Primeface数据表中显示数据。现在我在数据表中显示数据正常,但速度很慢。 如何使用延迟加载能力?

XHTML文件:

<ui:composition template="template.xhtml">
<ui:define name="content">
    <p:panel id="pnlLogInformationPage">
        <h:form id="logInformation">
            <div class="contentContainer-full-left">
                <p:dataTable var="log" value="#{logInformationMB.logInformationList}" id="logTable"
                    width="100%" liveResize="true">
                    <p:column headerText="ID" sortBy="Id">
                        <h:outputText value="#{logInformation.Id}" />
                    </p:column>
                    <p:column headerText="Name" sortBy="Name">
                        <h:outputText value="#{logInformation.Name}" />
                    </p:column>
                </p:dataTable>
            </div>
        </h:form>
    </p:panel>
</ui:define>

ManageBean文件:

@ManagedBean(name = "logInformationMB")
@ViewScoped
public class LogManagedBean implements Serializable {
    @PostConstruct
    public void initComponents() {
        loadLogInformation();
    }
    public List<LogInformationDTO> getLogInformationList() {
        return logInformationList;
    }
    public void setLogInformationList(final List<LogInformationDTO> pLogInformationList) {
        logInformationList = pLogInformationList;
    }
    public void loadLoagInformation(final ComponentSystemEvent event) {
        setLogLInformationlist(getLogInformationList();
    }
    public void loadInformationProtokolle() {
        loadInformationProtokolle(null);
    }
    public List<LogInformationDTO> getLogInformation() {
        final List<LogInformationDTO> lcResult = new ArrayList<LogInformationDTO>();
        ....
        return lcResult;
    }
}

1 个答案:

答案 0 :(得分:2)

根据您的代码,您没有使用延迟加载。你只需要获得所有数据。 当你的数据太大时,它会很慢。

请参阅以下步骤:

1 - 您需要创建一个扩展 LazyDataModel 类的新类,而不是使用#{logInformationMB.logInformationList},并创建一个可以逐页获取数据的服务

    public class LogInformationDataModel extends LazyDataModel<LogInformationDTO> {
          private List<LogInformationDTO> logInformationList;
          private LogInformationService logInformationService = new LogInformationService();

          @Override
            public List<LogInformationDTO> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {
                // TODO implement sort

                setRowCount(logInformationService.count(filters));                  
                logInformationList = logInformationService.list(first / pageSize, pageSize, sortField, sort, filters);
                return logInformationList;
            }

          @Override
          public LogInformationDTO getRowData(String rowKey) {
              for(LogInformationDTO logInformation : logInformationList) {
                  if(logInformation.getId().equals(rowKey))
                      return logInformation;
              }
              return null;
          }

          @Override
          public Object getRowKey(LogInformationDTO logInformation) {
              return logInformation.getId();
          }
    }

2 - 在Manage bean中注册数据模型

    @ManagedBean(name = "logInformationMB")
    @ViewScoped
    public class LogManagedBean implements Serializable {

        private LogInformationDataModel dataModel = new LogInformationDataModel();

        public LogInformationDataModel getDataModel() {
          return dataModel;
        }

    }

3 - 将lazy attribe( lazy =“true”)添加到您的p:dataTable并使用分页

    <p:dataTable var="log" value="#{logInformationMB.dataModel}" var="logInformation" id="logTable"
        width="100%" 
        lazy="true"
        paginator="true" 
        paginatorPosition="bottom" 
        paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
        rowsPerPageTemplate="10,50,100"
        >
        <p:column headerText="ID" sortBy="Id">
            <h:outputText value="#{logInformation.Id}" />
        </p:column>
        <p:column headerText="Name" sortBy="Name">
            <h:outputText value="#{logInformation.Name}" />
        </p:column>
    </p:dataTable>

我希望我的回答可以解决你的问题。

以下是您可以查看的链接:

Primefaces lazydatamodel