我剛開始學習JSF和PrimeFaces,並且我很難嘗試讓PrimeFaces的數據表工作。我有一個基於複選框的選擇機制(可以同時選擇多個行),因此單擊「刪除選定的用戶」按鈕會觸發對輔助bean的方法調用,以從數據庫中刪除相應的用戶。選擇不會通過PrimeFaces數據表傳播到支持bean
問題是選中的行不存儲在backing bean的selectedUsers
數組中,我不明白爲什麼,因爲我的代碼與PrimeFaces的ShowCase上託管的代碼完全相同。因此,該按鈕可以成功觸發確認對話框,但不會有用戶從系統中刪除。有人有建議嗎?
預先感謝您!
XHTML文件
<h:form id="tableForm">
<p:dataTable id="userList" var="user" value="#{userListBean.userList}"
selection="#{userListBean.selectedUsers}" rowKey="#{user.username}">
<f:facet name="header">User list</f:facet>
<p:column selectionMode="multiple" style="width:2%"/>
<!-- data columns here, working just fine -->
<f:facet name="footer">
<p:commandButton value="Delete selected users" icon="ui-icon-trash" action="#{userListBean.deleteSelectedUsers()}">
<p:confirm header="Deletion confirmation" message="Are you sure you want to delete #{fn:length(userListBean.selectedUsers)} users?" icon="ui-icon-alert" />
</p:commandButton>
Registered users: #{fn:length(userListBean.userList)}
</f:facet>
</p:dataTable>
<p:confirmDialog global="true" showEffect="fade">
<p:commandButton value="Yes" type="button" styleClass="ui-confirmdialog-yes" icon="ui-icon-check" />
<p:commandButton value="No" type="button" styleClass="ui-confirmdialog-no" icon="ui-icon-close"/>
</p:confirmDialog>
</h:form>
輔助Bean (userMgr處理服務器上的持久性,它應該有無關,與我的問題)
@ManagedBean(name="userListBean")
@ViewScoped
public class UserListBean {
@EJB
private UserManager userMgr;
private List<UserDTO> userList;
private UserDTO[] selectedUsers;
public UserListBean() {
}
public void deleteSelectedUsers() {
for(UserDTO u : selectedUsers)
userMgr.deleteUser(u.getUsername());
setUserList(userMgr.retrieveAllUsersDTO());
}
public List<UserDTO> getUserList() {
if(userList == null)
setUserList(userMgr.retrieveAllUsersDTO());
return userList;
}
public void setUserList(List<UserDTO> userList) {
this.userList = userList;
}
public List<UserDTO> retrieveUserList() {
return userMgr.retrieveAllUsersDTO();
}
public UserDTO[] getSelectedUsers() {
return selectedUsers;
}
public void setSelectedUsers(UserDTO[] selectedUsers) {
this.selectedUsers = selectedUsers;
}
}
(作爲一個方面的問題:#{fn:length(userListBean.selectedUsers)}
EL表達式總是返回0.我以前認爲這是因爲選擇機制的破壞,但可能是因爲陣列當確認對話框呈現時,y仍然爲空)
不是答案:''org.primefaces.model.LazyDataModel'應該是最好的,在這種情況下。視圖範圍的bean必須實現'java.io.Serializable'接口。 –
Tiny
首先將'getUserList'中的所有邏輯移動到用'@ PostConstruct'註釋的方法中。然後你的'getUserList'應該只做它所說的:'userList' – kolossus
謝謝大家,夥計們,我不知道@PostConstruct註釋!還有很多要學習。一切工作糾正後,像kolossus建議的吸氣劑,即使我沒有得到它與我的問題... – thequanticlad