Jsf 2 选择不';t使用PrimeFaces数据表传播到支持bean

Jsf 2 选择不';t使用PrimeFaces数据表传播到支持bean,jsf-2,primefaces,Jsf 2,Primefaces,我刚开始学习JSF和PrimeFaces,我很难让PrimeFaces的数据表正常工作。我有一个基于复选框的选择机制(可以同时选择多行),因此单击“删除所选用户”按钮会触发对支持bean的方法调用,以从数据库中删除相应的用户 问题是,所选行没有存储在支持bean的selectedUsers数组中,我不明白为什么,因为我的代码与PrimeFaces ShowCase上托管的代码完全相同。因此,该按钮成功触发确认对话框,但从未从系统中删除任何用户。有人有什么建议吗 提前谢谢你 xhtml文件 <

我刚开始学习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>

用户列表
注册用户:#{fn:length(userListBean.userList)}
支持Bean (userMgr在服务器上处理持久性,它应该与我的问题无关)

@ManagedBean(name=“userListBean”)
@视域
公共类UserListBean{
@EJB
私人用户管理器用户管理器;
私有列表用户列表;
向[]个选定用户发送私人用户数据;
公共UserListBean(){
}
public void deleteSelectedUsers(){
对于(用户到u:selectedUsers)
userMgr.deleteUser(u.getUsername());
setUserList(userMgr.retrieveAllUsersDTO());
}
公共列表getUserList(){
if(userList==null)
setUserList(userMgr.retrieveAllUsersDTO());
返回用户列表;
}
public void setUserList(List userList){
this.userList=userList;
}
公共列表检索UserList(){
返回userMgr.retrieveAllUsersDTO();
}
公共用户dto[]getSelectedUsers(){
返回所选用户;
}
public void setSelectedUsers(UserDTO[]selectedUsers){
this.selectedUsers=selectedUsers;
}
}

(作为一个附带问题:
{fn:length(userListBean.selectedUsers)}
EL表达式总是返回0。我过去认为这是因为选择机制被破坏了,但这可能是因为在呈现确认对话框时数组仍然是空的吗?)

您需要通过将
添加到数据表中来激活事件行选择。

不是答案:
org.primefaces.model.LazyDataModel
在这种情况下更可取。视图范围的bean必须实现
java.io.Serializable
接口。首先,将
getUserList
中的所有逻辑移动到一个用
@PostConstruct
注释的方法中。那么您的
getUserList
应该只执行它所说的:gets
userList
谢谢大家,伙计们,我不知道@PostConstruct注释!还有很多东西要学。就像科洛索斯建议的那样,在纠正了getter之后,一切都正常了,即使我不明白它与我的问题有什么关系……马克。作为。对的
@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;
    }

}