在一个页面中对两个数据表进行Primeface,从而导致分页和过滤问题

时间:2012-12-26 02:15:52

标签: java spring jsf-2 primefaces lazy-loading

我使用Hibernate 4,Spring 3和JSF 2.0以及Weblogic 10.3.6作为服务器。

我在一个页面中有两个数据表,为了填充数据表,我正在使用延迟加载。

我面临的问题是当两个数据表都显示时,分页不起作用。它确实转到第2页和第3页,依此类推,但数据表中的记录对于两个数据表都保持相同。如果我删除其中任何一个,那么分页效果很好。

我注意到,当我有多个数据表时,偶数过滤器也无效。两个数据表都是单一形式,它们都有两个不同的ManagedBeans,两者都是视图范围。我已尝试过请求范围,但没有解决我的问题。

如何解决此问题?

JSF代码

<h:form id="form">
    <!-- Master form -->
        <p:dataTable id="dataTable" var="req" lazy="true" value="#{emp.lazyModel}"
            paginator="true" rows="10" 
                         selection="#{emp.selectedRequest}"
                        selectionMode="single">                             
      <p:ajax event="rowSelect" listener="#{emp.onRowSelect}" />            
            <p:column id="empNo" filterBy="#{req.empNo}"   
                headerText="Request No" footerText="contains"  
                filterMatchMode="endsWith">                 
                <h:outputText value="#{req.empNo}" />
            </p:column>         
            other columns
                    </p:dataTable>              
        <!-- Detail form -->
        <p:dataTable id="dataTableDet" var="reqAct" lazy="true" value="#{dept.lazyModel}"
            paginator="true" rows="1"
            rowsPerPageTemplate="5,10">
            <f:facet name="header">                  
            Emp Details  
        </f:facet>
       <p:column>
                <f:facet name="header">
                    <h:outputText value="SLNo" />
                </f:facet>
                <h:outputText value="#{reqAct.slNo}" />
            </p:column>        
            <p:column id="empNo" filterBy="#{reqAct.empNo}"   
                headerText="Request No" footerText="contains"  
                filterMatchMode="endsWith">                 
                <h:outputText value="#{reqAct.empNo}" />
            </p:column>
        other columns
        </p:dataTable>      
        </h:form> 

Managedbean First Datatable

@Named("emp")
@Scope("view")
@PostConstruct
    public LazyDataModel<Employee> getLazyModel() {
        if (lazyModel == null) {
            lazyModel = new LazyRequestDataModel(empList, empService) {

            };          
        }

        return lazyModel;
    }

Managedbean Second Datatable

@Named("dept")
@Scope("view")
@PostConstruct
    public LazyDataModel<Department> getLazyModel() {
        if (lazyModel == null) {
            lazyModel = new LazyRequestActivitiesDataModel(deptList,
                    deptService) {

            };
        }

        return lazyModel;
    }

1 个答案:

答案 0 :(得分:2)

不确定它会有所帮助,但无论如何它是一种更好的方法

将您的@PostConstruct更改为公共空白,就像这样(对两个豆都这样做)

@PostConstruct
public void init(){
    initTable();
}

private void initTable(){
    lazyModel = new LazyRequestActivitiesDataModel(deptList,deptService);
}

public LazyDataModel<Department> getLazyModel() {
    return lazyModel;

}