我正在使用 primefaces3.3 版本。我有一个数据表来显示详细信息,并将 CRUD 按钮作为数据表页脚的一部分。在数据表中选择特定行后,单击 CRUD 按钮会显示一个对话框。
当我单击对话框中的“保存”按钮时,将保存数据并刷新数据表。但是, sortBy ,分页选项在此之后不起作用。随着此数据表的选择模式更改为多个。此行为在 IE 8 和 FF 12 中可重现。它在 Google Chrome 19 中运行良好。附加了 xhtml 和 Backing Bean 代码。
帐户.xhtml
<h:head>
<script type="text/javascript">
function handleDialogSubmit(xhr, status, args) {
if (args != null) {
if (args.validationFailed) {
accountDialog.show();
return true;
} else {
accountDialog.hide();
return true;
}
}
}
</script>
</h:head>
<h:body>
<ui:composition template="/template.xhtml">
<ui:define name="body">
<h:form id="form" prependId="false">
<p:contextMenu for="dataTable">
<p:menuitem value="View" update=":form2:accountDisplay"
icon="ui-icon-search" oncomplete="accountDialog.show()"
process="@this">
<f:setPropertyActionListener value="#{account}"
target="#{accountBean.selectedAccount}" />
</p:menuitem>
<p:menuitem value="Edit" update=":form2:accountDisplay"
icon="ui-icon-edit" oncomplete="accountDialog.show()"
process="@this" immedeate="true">
<f:setPropertyActionListener value="#{account}"
target="#{accountBean.currentAccount}" />
</p:menuitem>
<p:menuitem value="Delete" update=":dialogForm:confirmDialog"
icon="ui-icon-close" oncomplete="confirmation.show()" />
</p:contextMenu>
<h:panelGroup id="dataPanel">
<p:dataTable var="account" value="#{accountBean.accounts}"
paginator="true" rows="20" rowKey="#{account.accountCode}"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
id="dataTable">
<p:column
headerText="Edit|View|Delete">
<p:commandLink id="selectButton1" update=":form2:accountDisplay"
title="Edit" process="@this" oncomplete="accountDialog.show()">
<h:outputText value="Edit" />
<f:setPropertyActionListener value="#{account}"
target="#{accountBean.currentAccount}" />
</p:commandLink>
|
<p:commandLink id="detailButton1"
update=":form2:accountDisplay" title="View Details"
oncomplete="accountDialog.show()" process="@this">
<h:outputText value="View" />
<f:setPropertyActionListener value="#{account}"
target="#{accountBean.selectedAccount}" />
</p:commandLink>
|
<p:commandLink id="showDialogButton1"
update=":dialogForm:confirmDialog" title="Delete"
oncomplete="confirmation.show()" process="@this">
<h:outputText value="Delete" />
<f:setPropertyActionListener value="#{account}"
target="#{accountBean.selectedAccount}" />
</p:commandLink>
</p:column>
<p:column id="accountCode" headerText=" Account Code"
sortBy="#{account.accountCode}" filterBy="#{account.accountCode}"
filterMatchMode="startsWith" footerText="startsWith">
<h:outputText value="#{account.accountCode}" />
</p:column>
<p:column id="alertCode" headerText=" Alert Code"
sortBy="#{account.alertCode}" filterBy="#{account.alertCode}"
filterMatchMode="contains" footerText="contains">
<h:outputText value="#{account.alertCode}" />
</p:column>
<p:column id="clearAgentID" headerText=" Clr Agent#"
sortBy="#{account.clearAgentID}"
filterBy="#{account.clearAgentID}" filterMatchMode="startsWith"
footerText="startsWith">
<h:outputText value="#{account.clearAgentID}" />
</p:column>
<p:column id="globalAccountNum" headerText=" Global Acct#"
sortBy="#{account.globalAccountNum}"
filterBy="#{account.globalAccountNum}"
filterMatchMode="startsWith" footerText="startsWith">
<h:outputText value="#{account.globalAccountNum}" />
</p:column>
<p:column id="safeKeepingAccountNum"
headerText=" Safekeeping Acct#"
sortBy="#{account.safeKeepingAccountNum}"
filterBy="#{account.safeKeepingAccountNum}"
filterMatchMode="startsWith" footerText="startsWith">
<h:outputText value="#{account.safeKeepingAccountNum}" />
</p:column>
<p:column id="destinationID" headerText=" Primary Dest ID"
sortBy="#{account.destinationID}"
filterBy="#{account.destinationID}" filterMatchMode="startsWith"
footerText="startsWith">
<h:outputText value="#{account.destinationID}" />
</p:column>
<p:column id="addlDestinationID1" headerText=" Addl Dest ID1"
sortBy="#{account.addlDestinationID1}"
filterBy="#{account.addlDestinationID1}"
filterMatchMode="startsWith" footerText="startsWith">
<h:outputText value="#{account.addlDestinationID1}" />
</p:column>
<p:column id="addlDestinationID2" headerText=" Addl Dest ID2"
sortBy="#{account.addlDestinationID2}"
filterBy="#{account.addlDestinationID2}"
filterMatchMode="startsWith" footerText="startsWith">
<h:outputText value="#{account.addlDestinationID2}" />
</p:column>
<p:column id="addlDestinationID3" headerText=" Addl Dest ID3"
sortBy="#{account.addlDestinationID3}"
filterBy="#{account.addlDestinationID3}"
filterMatchMode="startsWith" footerText="startsWith">
<h:outputText value="#{account.addlDestinationID3}" />
</p:column>
<p:column id="destinationName" headerText=" Primary Dest Name"
sortBy="#{account.destinationName}"
filterBy="#{account.destinationName}"
filterMatchMode="startsWith" footerText="startsWith">
<h:outputText value="#{account.destinationName}" />
</p:column>
<p:column id="conBIC" headerText=" Cont BIC"
sortBy="#{account.conBIC}" filterBy="#{account.conBIC}"
filterMatchMode="startsWith" footerText="startsWith">
<h:outputText value="#{account.conBIC}" />
</p:column>
<p:column id="accountStatus" headerText=" Status"
sortBy="#{account.accountStatus}"
filterOptions="#{account.accountStatus}" filterMatchMode="exact"
footerText="exact">
<h:outputText value="#{account.accountStatus}" />
</p:column>
<p:column id="comments"
headerText="Comments"
sortBy="#{account.comments}" filterBy="#{account.comments}"
filterMatchMode="startsWith" footerText="startsWith">
<h:outputText value="#{account.comments}" />
</p:column>
<p:column id="createdBy" headerText=" Created By"
sortBy="#{account.createdBy}" filterBy="#{account.createdBy}"
filterMatchMode="startsWith" footerText="startsWith">
<h:outputText value="#{account.createdBy}" />
</p:column>
<p:column id="createdDate" headerText=" Created Date"
sortBy="#{account.createdDate}" filterBy="#{account.createdDate}"
filterMatchMode="startsWith" footerText="startsWith">
<h:outputText value="#{account.createdDate}" />
</p:column>
<p:column id="modifiedBy" headerText=" Modified By"
sortBy="#{account.modifiedBy}" filterBy="#{account.modifiedBy}"
filterMatchMode="startsWith" footerText="startsWith">
<h:outputText value="#{account.modifiedBy}" />
</p:column>
<p:column id="modifiedDate" headerText=" Modified Date"
sortBy="#{account.modifiedDate}"
filterBy="#{account.modifiedDate}" filterMatchMode="startsWith"
footerText="startsWith">
<h:outputText value="#{account.modifiedDate}" />
</p:column>
<!-- <f:facet name="footer">
<p:toolbar>
<p:toolbarGroup align="left">
<p:tooltip for="btnAdd" value="Add New Account" />
<p:commandButton id="btnRefresh" styleClass="refreshButton"
title="Refresh Account Information" value="Refresh"
icon="ui-icon-refresh"
actionListener="#{accountBean.populateAccounts}"
update=":form:dataTable,:form2:display" immediate="true"/>
<p:tooltip for="btnRefresh" value="Refresh Account Details" />
<p:commandButton id="selectButton" update=":form2:accountDisplay"
icon="ui-icon-edit" title="Edit Account Details" value="Edit"
process="@this" oncomplete="accountDialog.show()" immediate="true">
<f:setPropertyActionListener value="#{account}"
target="#{accountBean.currentAccount}" />
</p:commandButton>
<p:commandButton id="detailButton" value="View"
icon="ui-icon-view" update=":form2:accountDisplay"
title="View Account Details" oncomplete="detailDialog.show()"
process="@this" immediate="true">
<f:setPropertyActionListener value="#{account}"
target="#{accountBean.selectedAccount}" />
</p:commandButton>
<p:commandButton id="showDialogButton" icon="ui-icon-delete"
value="Delete" update=":dialogForm:confirmDialog"
title="Delete Account Details" oncomplete="confirmation.show()"
process="@this" immediate="true">
<f:setPropertyActionListener value="#{account}"
target="#{accountBean.selectedAccount}" />
</p:commandButton>
</p:toolbarGroup>
</p:toolbar>
</f:facet> -->
<f:facet name="footer">
<p:toolbar>
<p:toolbarGroup align="left">
<p:commandButton id="btnAdd" value="Add" title="Add New Account"
icon="ui-icon-add"
oncomplete="accountDialog.show()" />
<p:commandButton id="editButton" value="Edit" icon="ui-icon-edit"
update=":form2:accountDisplay" oncomplete="accountDialog.show()">
</p:commandButton>
<p:commandButton id="showDialogButton" icon="ui-icon-delete"
value="Delete"
title="Delete Account Details" oncomplete="confirmation.show()">
</p:commandButton>
<p:commandButton id="viewButton" value="View"
icon="ui-icon-search" update=":form2:display"
oncomplete="accountDialog.show()" />
<p:commandButton id="btnRefresh" styleClass="refreshButton"
title="Refresh Account Information" value="Refresh"
icon="ui-icon-refresh"
actionListener="#{accountBean.populateAccounts}"
update=":form:dataTable"/>
</p:toolbarGroup>
</p:toolbar>
</f:facet>
</p:dataTable>
</h:panelGroup>
</h:form>
<h:form id="form2" >
<!-- <p:growl id="growl" showDetail="true" sticky="true" /> -->
<p:dialog id="basicDialog" header="Account Details"
widgetVar="detailDialog" resizable="false">
<h:panelGrid id="display" columns="2">
<h:outputText value="#{bundle.AccountLabel_accountCode}" />
<h:outputText value="#{accountBean.selectedAccount.accountCode}"
title="#{bundle.AccountTitle_accountCode}" />
<h:outputText value="#{bundle.AccountLabel_alertCode}" />
<h:outputText value="#{accountBean.selectedAccount.alertCode}"
title="#{bundle.AccountTitle_alertCode}" />
<h:outputText value="#{bundle.AccountLabel_clearAgentID}" />
<h:outputText value="#{accountBean.selectedAccount.clearAgentID}"
title="#{bundle.AccountTitle_clearAgentID}" />
<h:outputText value="#{bundle.AccountLabel_globalAccountNum}" />
<h:outputText
value="#{accountBean.selectedAccount.globalAccountNum}"
title="#{bundle.AccountTitle_globalAccountNum}" />
<h:outputText value="#{bundle.AccountLabel_safeKeepingAccountNum}" />
<h:outputText
value="#{accountBean.selectedAccount.safeKeepingAccountNum}"
title="#{bundle.AccountTitle_safeKeepingAccountNum}" />
<h:outputText value="#{bundle.AccountLabel_destinationID}" />
<h:outputText value="#{accountBean.selectedAccount.destinationID}"
title="#{bundle.AccountTitle_destinationID}" />
<h:outputText value="#{bundle.AccountLabel_addlDestinationID1}" />
<h:outputText
value="#{accountBean.selectedAccount.addlDestinationID1}"
title="#{bundle.AccountTitle_addlDestinationID1}" />
<h:outputText value="#{bundle.AccountLabel_addlDestinationID2}" />
<h:outputText
value="#{accountBean.selectedAccount.addlDestinationID2}"
title="#{bundle.AccountTitle_addlDestinationID2}" />
<h:outputText value="#{bundle.AccountLabel_addlDestinationID3}" />
<h:outputText
value="#{accountBean.selectedAccount.addlDestinationID3}"
title="#{bundle.AccountTitle_addlDestinationID3}" />
<h:outputText value="#{bundle.AccountLabel_destinationName}" />
<h:outputText
value="#{accountBean.selectedAccount.destinationName}"
title="#{bundle.AccountTitle_destinationName}" />
<h:outputText value="#{bundle.AccountLabel_conBIC}" />
<h:outputText value="#{accountBean.selectedAccount.conBIC}"
title="#{bundle.AccountTitle_conBIC}" />
<h:outputText value="#{bundle.AccountLabel_accountStatus}" />
<h:outputText value="#{accountBean.selectedAccount.accountStatus}"
title="#{bundle.AccountTitle_accountStatus}" />
<h:outputText value="#{bundle.AccountLabel_comments}" />
<h:outputText value="#{accountBean.selectedAccount.comments}"
title="#{bundle.AccountTitle_comments}" />
<h:outputText value="#{bundle.AccountLabel_createdBy}" />
<h:outputText value="#{accountBean.selectedAccount.createdBy}"
title="#{bundle.AccountTitle_createdBy}" />
<h:outputText value="#{bundle.AccountLabel_createdDate}" />
<h:outputText value="#{accountBean.selectedAccount.createdDate}"
title="#{bundle.AccountTitle_createdDate}" />
<h:outputText value="#{bundle.AccountLabel_modifiedBy}" />
<h:outputText value="#{accountBean.selectedAccount.modifiedBy}"
title="#{bundle.AccountTitle_modifiedBy}" />
<h:outputText value="#{bundle.AccountLabel_modifiedDate}" />
<h:outputText value="#{accountBean.selectedAccount.modifiedDate}"
title="#{bundle.AccountTitle_modifiedDate}" />
</h:panelGrid>
</p:dialog>
<p:dialog header="Account Detail" widgetVar="accountDialog"
resizable="false" height="600" width="600" showEffect="clip"
hideEffect="fold" id="accountDialog" >
<p:messages id="messages" autoUpdate="true" />
<h:panelGrid id="accountDisplay" columns="2" cellpadding="4">
<h:outputLabel value="Account Code:" for="accountCode" />
<p:inputText label="Account Code" id="accountCode"
value="#{accountBean.currentAccount.accountCode}"
title="Account Code" required="true"
validatorMessage="#{bundle.AccountValidationAccountCode}" requiredMessage="#{bundle.AccountRequiredMessage_accountCode}">
</p:inputText>
<h:outputLabel value="Alert Code:" for="alertCode" />
<p:inputText label="Alert Code" id="alertCode"
value="#{accountBean.currentAccount.alertCode}"
title="Alert Code" required="true"
validatorMessage="#{bundle.AccountValidationAlertCode}" requiredMessage="#{bundle.AccountRequiredMessage_alertCode}">
</p:inputText>
<h:outputLabel value="Clr Agent#:" for="clearAgentID" />
<p:inputText label="Clr Agent#" id="clrAgent"
value="#{accountBean.currentAccount.clearAgentID}"
title="Clr Agent#" required="true"
requiredMessage="#{bundle.AccountRequiredMessage_clearAgentID}">
</p:inputText>
<h:outputLabel value="Global Acct#:" for="globalAccountNum" />
<p:inputText label="Global Acct#" id="globalAccountNum"
value="#{accountBean.currentAccount.globalAccountNum}"
title="Global Acct#" required="true"
requiredMessage="#{bundle.AccountRequiredMessage_globalAccountNum}">
</p:inputText>
<h:outputLabel value="SafeKeeping Acct#:"
for="safeKeepingAccountNum" />
<p:inputText label="Safekeeping Account Number"
id="safeKeepingAccountNum"
value="#{accountBean.currentAccount.safeKeepingAccountNum}"
title="Safekeeping Account Number" required="true"
validatorMessage="#{bundle.AccountValidationSafeKeepingAccountNum}" requiredMessage="#{bundle.AccountRequiredMessage_safeKeepingAccountNum}">
</p:inputText>
<h:outputLabel value="Primary Dest ID:" for="destinationID" />
<p:inputText label="Primary Dest ID" id="destinationID"
value="#{accountBean.currentAccount.destinationID}"
title="Primary Dest ID" required="true"
requiredMessage="#{bundle.AccountRequiredMessage_destinationID}">
</p:inputText>
<h:outputLabel value="Addl Dest ID1:" for="addlDestinationID1" />
<p:inputText label="Addl Dest ID1" id="addlDestinationID1"
value="#{accountBean.currentAccount.addlDestinationID1}"
title="Addl Dest ID1" required="true"
requiredMessage="#{bundle.AccountRequiredMessage_addlDestinationID1}">
</p:inputText>
<h:outputLabel value="Addl Dest ID2:" for="addlDestinationID2" />
<p:inputText label="Addl Dest ID2" id="addlDestinationID2"
value="#{accountBean.currentAccount.addlDestinationID2}"
title="Addl Dest ID2" required="true"
requiredMessage="#{bundle.AccountRequiredMessage_addlDestinationID2}">
</p:inputText>
<h:outputLabel value="Addl Dest ID3:" for="addlDestinationID3" />
<p:inputText label="Addl Dest ID3" id="addlDestinationID3"
value="#{accountBean.currentAccount.addlDestinationID3}"
title="Addl Dest ID3" required="true"
requiredMessage="#{bundle.AccountRequiredMessage_addlDestinationID3}">
</p:inputText>
<h:outputLabel value="Primary Dest Name:" for="destinationName" />
<p:inputText label="Primary Dest Name" id="destinationName"
value="#{accountBean.currentAccount.destinationName}"
title="Primary Dest Name" required="true"
requiredMessage="#{bundle.AccountRequiredMessage_destinationName}">
</p:inputText>
<h:outputLabel value="Cont BIC:" for="conBIC" />
<p:inputText label="Cont BIC" id="conBICText"
value="#{accountBean.currentAccount.conBIC}" title="Cont BIC"
required="true"
requiredMessage="#{bundle.AccountRequiredMessage_conBIC}">
</p:inputText>
<h:outputLabel value="Status:" for="accountStatus" />
<p:inputText label="Status" id="conBIC"
value="#{accountBean.currentAccount.accountStatus}"
title="Status" required="true"
requiredMessage="#{bundle.AccountRequiredMessage_accountStatus}">
</p:inputText>
<h:outputLabel value="Comments:" for="comments" />
<p:inputTextarea id="comments" rows="5" cols="30" maxlength="10" value="#{accountBean.currentAccount.comments}"
autoResize="false" required="true" requiredMessage="#{bundle.AccountRequiredMessage_comments}"/>
<h:outputLabel />
<h:outputLabel />
<!-- <p:separator id="customSeparator" style="width:500px;height:1px" /> -->
<f:facet name="footer">
<!-- <p:commandButton value="New" icon="ui-icon-check"/> -->
<h:outputLabel />
<p:commandButton id="save" styleClass="saveButton" value="Save"
icon="ui-icon-check"
actionListener="#{accountBean.createOrUpdate}"
oncomplete="handleDialogSubmit(xhr,status,args);"/>
<!-- update=":form:dataTable,:form2:display" onsuccess="accountDialog.hide()" ajax="false"/> -->
<p:commandButton id="cancel" actionListener="#{accountBean.cancel}" styleClass="cancelButton" value="Cancel"
icon="ui-icon-cancel" oncomplete="accountDialog.hide()" process="@this"/>
<p:commandButton id="btnRefresh" styleClass="refreshButton1"
title="Refresh Account Information" value="Refresh"
icon="ui-icon-refresh"
actionListener="#{accountBean.populateAccounts}"
update=":form:dataTable"/>
</f:facet>
</h:panelGrid>
</p:dialog>
</h:form>
<h:form id="dialogForm">
<p:confirmDialog id="confirmDialog" header="Confirm Delete Account"
severity="alert" widgetVar="confirmation">
<f:facet name="message">
<h:outputText
value="Delete #{accountBean.selectedAccount.accountCode}?" />
</f:facet>
<p:commandButton id="confirm" value="Yes"
oncomplete="confirmation.hide()" update=":form:dataTable"
actionListener="#{accountBean.remove}" ajax="false"/>
<p:commandButton id="decline" value="No"
onclick="confirmation.hide()" type="button" ajax="false"/>
</p:confirmDialog>
</h:form>
</ui:define>
</ui:composition>
</h:body>
</html>
AccountBean.java
package com.cba.web.beans;
import java.io.Serializable;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIComponent;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.primefaces.context.RequestContext;
import com.cba.services.AccountService;
import com.cba.utils.JsfUtils;
import com.cba.utils.ServiceLocator;
import com.cba.web.model.Account;
@ManagedBean(name = "accountBean")
@ViewScoped
public class AccountBean implements Serializable {
private transient AccountService accountService;
private List<Account> accounts;
private Account selectedAccount = new Account();
private Account currentAccount = new Account();
public Account getSelectedAccount() {
return selectedAccount;
}
public void setSelectedAccount(Account selectedAccount) {
this.selectedAccount = selectedAccount;
}
public Account getCurrentAccount() {
return currentAccount;
}
public void setCurrentAccount(Account currentAccount) {
this.currentAccount = currentAccount;
}
public AccountBean() {
populateAccounts();
}
public AccountService getAccountService() {
return accountService;
}
public void setAccountService(AccountService accountService) {
this.accountService = accountService;
}
public List<Account> getAccounts() {
return accounts;
}
public void populateAccounts() {
accountService = (AccountService) ServiceLocator.getInstance().getBean(
"accountService");
accounts = accountService.getAccountDetails();
}
public void createOrUpdate(ActionEvent e) {
try {
System.out.println("entering createOrUpdate in AccountBean");
accountService = (AccountService) ServiceLocator.getInstance()
.getBean("accountService");
accountService.updateAccountDetails(currentAccount);
currentAccount = new Account();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void cancel(ActionEvent e) {
clear();
}
public void remove(ActionEvent e) {
try {
accountService = (AccountService) ServiceLocator.getInstance()
.getBean("accountService");
accountService.deleteAccountDetails(selectedAccount);
selectedAccount = new Account();
populateAccounts();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void clear() {
currentAccount = new Account();
UIViewRoot viewRoot =
FacesContext.getCurrentInstance().getViewRoot();
UIComponent component1 = viewRoot.findComponent("form2");
JsfUtils.clearComponentHierarchy(component1);
}
}
对此的任何输入都会有很大帮助。