在primefaces数据表中选择行时重新加载列表
我正在做一个从mysql数据库检索数据列表的示例。这一切都很好。 问题发生在我加载页面时,数据恢复方法在页面第一次加载时运行两次。 当我从dataTable中选择一条记录时,从列表中检索数据的方法会根据所选记录执行多次。例如,如果我选择注册号4,它将运行4次,直到到达所选索引,以显示该记录的详细信息。 有什么想法吗?。如何解决方法运行一次? Primefaces 5.0.RC2+Spring4,JPA,注释在primefaces数据表中选择行时重新加载列表,primefaces,datatable,Primefaces,Datatable,我正在做一个从mysql数据库检索数据列表的示例。这一切都很好。 问题发生在我加载页面时,数据恢复方法在页面第一次加载时运行两次。 当我从dataTable中选择一条记录时,从列表中检索数据的方法会根据所选记录执行多次。例如,如果我选择注册号4,它将运行4次,直到到达所选索引,以显示该记录的详细信息。 有什么想法吗?。如何解决方法运行一次? Primefaces 5.0.RC2+Spring4,JPA,注释 package com.maosdel.rgi.web.controllers; im
package com.maosdel.rgi.web.controllers;
import java.io.Serializable;
import java.util.List;
import javax.faces.bean.SessionScoped;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.maosdel.rgi.dto.OperatorDTO;
import com.maosdel.rgi.model.exception.RgiBusinessException;
import com.maosdel.rgi.model.services.OperatorService;
@SessionScoped
@Component("operatorBean")
public class OperatorBean implements Serializable {
static final Logger logger = LoggerFactory.getLogger(OperatorBean.class);
private static final long serialVersionUID = -491242034992898914L;
@Autowired(required = true)
private OperatorService operatorService;
private OperatorDTO operatorSelected;
private List<OperatorDTO> operatorList;
public OperatorBean() {
logger.info("OperatorBean instantiated...");
}
private List<OperatorDTO> loadAllOperators() {
List<OperatorDTO> result = null;
try {
result = (List<OperatorDTO>) operatorService.getAllOperatorsHQL();
} catch (RgiBusinessException e) {
logger.error("Error recuperando registros... " + e);
}
return result;
}
public List<OperatorDTO> getOperatorList() {
operatorList = loadAllOperators();
return operatorList;
}
public OperatorDTO getOperatorSelected() {
try {
if (null != operatorSelected) {
operatorSelected = operatorService.getOperatorById(operatorSelected.getId());
}
} catch (RgiBusinessException e) {
logger.error("Error recuperando operador con Id: " + 2 + " Error: "
+ e);
}
return operatorSelected;
}
public void setOperatorSelected(OperatorDTO operatorSelected) {
this.operatorSelected = operatorSelected;
}
}
xhtml页面
<ui:composition template="/WEB-INF/templates/defaultTemplate.xhtml">
<ui:define name="content">
<h:form id="operatorFrm">
<p:growl id="msgs" showDetail="true" />
<p:dataTable var="operator" value="#{operatorBean.operatorList}"
paginator="true" rows="10" rowKey="#{operator.id}"
selectionMode="single">
<f:facet name="header">
Operadores
</f:facet>
<p:column headerText="Id">
<h:outputText value="#{operator.id}" />
</p:column>
<p:column headerText="Code">
<h:outputText value="#{operator.code}" />
</p:column>
<p:column headerText="Name">
<h:outputText value="#{operator.name}" />
</p:column>
<p:column headerText="Last name">
<h:outputText value="#{operator.lastName}" />
</p:column>
<p:column headerText="Data contract">
<h:outputText value="#{operator.contractDate}" />
</p:column>
<p:column headerText="State">
<h:outputText value="#{operator.state}" />
</p:column>
<p:column style="width:32px;text-align: center">
<p:commandButton update=":operatorFrm:operatorDetail"
oncomplete="PF('operatorDlg').show()" icon="ui-icon-search"
title="View">
<f:setPropertyActionListener value="#{operator}"
target="#{operatorBean.operatorSelected}" />
</p:commandButton>
</p:column>
</p:dataTable>
<p:dialog header="Operator Info" widgetVar="operatorDlg" modal="true"
showEffect="fade" hideEffect="fade" resizable="false">
<p:outputPanel id="operatorDetail" style="text-align:center;">
<p:panelGrid columns="2"
rendered="#{not empty operatorBean.operatorSelected}"
columnClasses="label,value">
<f:facet name="header">
</f:facet>
<h:outputText value="Id:" />
<h:outputText value="#{operatorBean.operatorSelected.id}" />
<h:outputText value="Code" />
<h:outputText value="#{operatorBean.operatorSelected.code}" />
<h:outputText value="Name" />
<h:outputText value="#{operatorBean.operatorSelected.name}" />
<h:outputText value="Last name" />
<h:outputText value="#{operatorBean.operatorSelected.lastName}" />
<h:outputText value="Data contract" />
<h:outputText value="#{operatorBean.operatorSelected.contractDate}" />
<h:outputText value="State" />
<h:outputText value="#{operatorBean.operatorSelected.state}" />
</p:panelGrid>
</p:outputPanel>
</p:dialog>
</h:form>
</ui:define>
您不必使用服务方法手动执行查找,datatable将为您处理该问题。您忘记了选择标记
selection="#{operatorBean.operatorSelected}"
你能试试下面的代码吗
<p:dataTable var="operator" value="#{operatorBean.operatorList}"
paginator="true" rows="10" rowKey="#{operator.id}"
selectionMode="single" selection="#{operatorBean.operatorSelected}">
谢谢你,Emil,我已经创建了一个带有PostConstruct注释的init方法,效果很好。但是,当我选择一行来查看其详细信息,并且getOperatorSelected方法多次运行时,会出现一个问题。
public OperatorDTO getOperatorSelected() {
return operatorSelected;
}
selection="#{operatorBean.operatorSelected}"
<p:dataTable var="operator" value="#{operatorBean.operatorList}"
paginator="true" rows="10" rowKey="#{operator.id}"
selectionMode="single" selection="#{operatorBean.operatorSelected}">