2014-01-20 48 views
0

我剛開始學習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仍然爲空)

+0

不是答案:''org.primefaces.model.LazyDataModel '應該是最好的,在這種情況下。視圖範圍的bean必須實現'java.io.Serializable'接口。 – Tiny

+0

首先將'getUserList'中的所有邏輯移動到用'@ PostConstruct'註釋的方法中。然後你的'getUserList'應該只做它所說的:'userList' – kolossus

+0

謝謝大家,夥計們,我不知道@PostConstruct註釋!還有很多要學習。一切工作糾正後,像kolossus建議的吸氣劑,即使我沒有得到它與我的問題... – thequanticlad

回答

1

您需要激活事件行,通過將<p:ajax event="rowSelect"/>添加到dataTable中來進行選擇。

+0

馬克。如。正確。 – russellelbert