我刚开始学习JSF和PrimeFaces,我很难让PrimeFaces的数据表工作。我有一个基于复选框的选择机制(可以同时选择多个行),因此单击“删除所选用户”按钮会触发对辅助bean的方法调用,以从数据库中删除相应的用户。
问题是所选行没有存储在支持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.我曾经认为这是因为选择机制中断,但可能是因为在呈现确认对话框时数组仍然为空?)
答案 0 :(得分:1)
您需要通过将<p:ajax event="rowSelect"/>
添加到dataTable来激活事件rowSelect。