Java 从primefaces数据表中选择项不起作用

Java 从primefaces数据表中选择项不起作用,java,jsf,jsf-2,primefaces,Java,Jsf,Jsf 2,Primefaces,我使用primefaces数据表来显示数据列表。我希望我的用户能够选择多行,然后对所选行表示的数据执行操作。在执行操作之前,一切正常,我发现选择无法解决 下面是我的xhtml页面 #{contact.groupName} #{contact.numberofentries} 下面是我的后盾 @Named @ViewAccessScoped public class ExcelFileController implements Serializable, IFileController

我使用primefaces数据表来显示数据列表。我希望我的用户能够选择多行,然后对所选行表示的数据执行操作。在执行操作之前,一切正常,我发现选择无法解决

下面是我的xhtml页面




#{contact.groupName} #{contact.numberofentries}
下面是我的后盾

@Named
@ViewAccessScoped
public class ExcelFileController implements Serializable, IFileController {

/**
 * 
 */
private static final long serialVersionUID = -8117258104485487921L;

@Inject
PhoneNumberFormatter formatter;

@Inject
@Authenticated
UserProfile profile;

public PhoneNumberFormatter getFormatter() {
    return formatter;
}

public void setFormatter(PhoneNumberFormatter formatter) {
    this.formatter = formatter;
}

@EJB
BulkContactDeleter deleter;

@Inject
Logger logger;

@Inject
@CurrentContext
FacesContext context;

@Inject
BulkSMSContactListProducer listProducer;

@Inject
ConfigurationListProducer producer;

private BulkSMSContacts[] contactsSelected;

private List<BulkSMSContacts> contacts;

public BulkSMSContacts[] getContactsSelected() {
    return contactsSelected;
}

public void setContactsSelected(BulkSMSContacts[] contactsSelected) {
    this.contactsSelected = contactsSelected;
}

/*
 * public BulkContactDataModel getContactDataModel() { return
 * contactDataModel; }
 */

@PostConstruct
public void init() {
    logger.log(Level.INFO, "Entering excel file controller");
    /*
     * contactDataModel = new BulkContactDataModel(
     * listProducer.getBulkSMSContacts());
     */
    this.contacts = listProducer.getBulkSMSContacts();

}

@Override
public String removeContact() {
    int contactsdeleted = 0;

    if (this.contacts != null) {
        /*
         * for (BulkSMSContacts contacts : contactsSelected) { if (contacts
         * != null) { deleter.deleteContact(contacts); contactsdeleted += 1;
         * }
         */
        for (BulkSMSContacts c : contacts) {
            if (c.isSelected()) {

                deleter.deleteContact(c);
                contactsdeleted += 1;
            }

        }
        contacts = listProducer.getBulkSMSContacts();

        logger.log(Level.INFO, "Deleted " + contactsdeleted + " Contacts");
        context.addMessage(null, new FacesMessage(
                FacesMessage.SEVERITY_INFO, "Success", contactsdeleted
                        + " entries where deleted successfully"));
    } else {
        context.addMessage(null, new FacesMessage(
                FacesMessage.SEVERITY_ERROR, "Error",
                "No contact file was selected!"));
    }
    return null;
}

public List<BulkSMSContacts> getContacts() {
    return contacts;
}

public void setContacts(List<BulkSMSContacts> contacts) {
    this.contacts = contacts;
}
问题是,当单击delete按钮时(尽管是在调用removeContact()方法时),所有行的计算结果都为none

我也尝试过使用primefaces showcase方法,但仍然存在示例问题


请问我做错了什么吗???

为了知道所选的
联系人
,数据表和UI命令组件,即
等,必须采用相同的格式。这意味着,您的联系人数据表和删除按钮必须位于同一个


另外,检查页面中是否没有嵌套表单

更多信息:


问题似乎出在CDI注释中。为了使
ExcelFileController
处于活动状态,需要在某个地方初始化对话(代码中没有显示)。另一种解决方案是使用JSF注释:

//@Named
//@ViewAccessScoped
@ManagedBean
@ViewScoped
public class ExcelFileController implements Serializable, IFileController {
    //rest of your code...
}

为了了解所选的
联系人
,数据表和UI命令组件(即
等)必须采用相同的形式。这意味着,您的联系人数据表和删除按钮必须位于相同的


另外,检查页面中是否没有嵌套表单

更多信息:


问题似乎出在CDI注释中。为了使
ExcelFileController
处于活动状态,需要在某个地方初始化对话(代码中没有显示)。另一种解决方案是使用JSF注释:

//@Named
//@ViewAccessScoped
@ManagedBean
@ViewScoped
public class ExcelFileController implements Serializable, IFileController {
    //rest of your code...
}

我不明白为什么要在实体类中设置选择属性。 试着这样做

  • 设置数据模型:

    public class BulkSMSContactsDataModel extends ListDataModel<BulkSMSContacts> implements SelectableDataModel<BulkSMSContacts> {    
    
    public BulkSMSContactsDataModel() {  
    }  
    
    public BulkSMSContactsDataModel(List<BulkSMSContacts> data) {  
        super(data);  
    }  
    
    @Override  
    public BulkSMSContacts getRowData(String rowKey) {         
       List<BulkSMSContacts> contacts = (List<BulkSMSContacts>) new yourDao.getListOfBulkSMSContacts(); //yourDAO :BulkSMSContactsSelector i guess
        for(BulkSMSContacts c : contacts) {  
            if(String.valueOf(c.getContactId()).equals(rowKey))  
                return c;  
        }  
    
        return null;  
    }  
    
    @Override  
    public Object getRowKey(BulkSMSContacts obj) {  
        return String.valueOf(obj.getContactId());  
    }
    
    公共类BulkSMSContactsDataModel扩展ListDataModel实现SelectableDataModel{
    公共批量SMSContactsDataModel(){
    }  
    公共批量SMSContactsDataModel(列表数据){
    超级(数据);
    }  
    @凌驾
    public bulksContacts getRowData(字符串rowKey){
    List contacts=(List)new yourDao.getListofBulksmContacts();//yourDao:bulksmscocontacts我猜是选择器
    对于(批量接触c:触点){
    if(String.valueOf(c.getContactId()).equals(rowKey))
    返回c;
    }  
    返回null;
    }  
    @凌驾
    公共对象getRowKey(BulkSMSContacts obj){
    返回字符串.valueOf(obj.getContactId());
    }
    
    }

  • 配置您的bean:

    public class ExcelFileController implements Serializable, IFileController {
        private BulkSMSContacts[] contactsSelected;
        private List<BulkSMSContacts> contacts;
        private BulkSMSContacts[] selectedcontacts;
        private BulkSMSContactsDataModel contactsList;
            public ExcelFileController() {
            contactsList = new BulkSMSContactsDataModel(contacts);
        }
        // getters and setters
        // the rest of your code 
    
    公共类ExcelFileController实现可序列化的IFileController{
    私人散货合同[]已选择的合同;
    私人名单联系人;
    私人批量联系人[]选定联系人;
    私人散货箱接触件模型接触件清单;
    公共文件控制器(){
    contactsList=新的BulksContactsDataModel(contacts);
    }
    //接球手和接球手
    //代码的其余部分
    
    }

  • 配置您的xhtml

    <p:dataTable  emptyMessage="No Contacts Uploaded" id="tblcontacts" rendered="true"  rows="8" value="#{excelFileController.contactsList}" var="contact" style="width:50pc;" selection="#{excelFileController.selectedcontacts}">
          <p:column selectionMode="multiple" style="width:20px" />
          <p:column headerText="File Name">  
            #{contact.groupName}  
          </p:column>  
          <p:column headerText="Number of Contacts">  
            #{contact.numberofentries}  
          </p:column>
           <!-- the rest -->
    
    
    #{contact.groupName}
    #{contact.numberofentries}
    

  • 更新你的用户界面

  • 使用p而不是primefaces-p这将使您的代码更容易阅读:


  • 我不明白为什么要在实体类中设置选择属性。 试着这样做

  • 设置数据模型:

    public class BulkSMSContactsDataModel extends ListDataModel<BulkSMSContacts> implements SelectableDataModel<BulkSMSContacts> {    
    
    public BulkSMSContactsDataModel() {  
    }  
    
    public BulkSMSContactsDataModel(List<BulkSMSContacts> data) {  
        super(data);  
    }  
    
    @Override  
    public BulkSMSContacts getRowData(String rowKey) {         
       List<BulkSMSContacts> contacts = (List<BulkSMSContacts>) new yourDao.getListOfBulkSMSContacts(); //yourDAO :BulkSMSContactsSelector i guess
        for(BulkSMSContacts c : contacts) {  
            if(String.valueOf(c.getContactId()).equals(rowKey))  
                return c;  
        }  
    
        return null;  
    }  
    
    @Override  
    public Object getRowKey(BulkSMSContacts obj) {  
        return String.valueOf(obj.getContactId());  
    }
    
    公共类BulkSMSContactsDataModel扩展ListDataModel实现SelectableDataModel{
    公共批量SMSContactsDataModel(){
    }  
    公共批量SMSContactsDataModel(列表数据){
    超级(数据);
    }  
    @凌驾
    public bulksContacts getRowData(字符串rowKey){
    List contacts=(List)new yourDao.getListofBulksmContacts();//yourDao:bulksmscocontacts我猜是选择器
    对于(批量接触c:触点){
    if(String.valueOf(c.getContactId()).equals(rowKey))
    返回c;
    }  
    返回null;
    }  
    @凌驾
    公共对象getRowKey(BulkSMSContacts obj){
    返回字符串.valueOf(obj.getContactId());
    }
    
    }

  • 配置您的bean:

    public class ExcelFileController implements Serializable, IFileController {
        private BulkSMSContacts[] contactsSelected;
        private List<BulkSMSContacts> contacts;
        private BulkSMSContacts[] selectedcontacts;
        private BulkSMSContactsDataModel contactsList;
            public ExcelFileController() {
            contactsList = new BulkSMSContactsDataModel(contacts);
        }
        // getters and setters
        // the rest of your code 
    
    公共类ExcelFileController实现可序列化的IFileController{
    私人散货合同[]已选择的合同;
    私人名单联系人;
    私人批量联系人[]选定联系人;
    私人散货箱接触件模型接触件清单;
    公共文件控制器(){
    contactsList=新的BulksContactsDataModel(contacts);
    }
    //接球手和接球手
    //代码的其余部分
    
    }

  • 配置您的xhtml

    <p:dataTable  emptyMessage="No Contacts Uploaded" id="tblcontacts" rendered="true"  rows="8" value="#{excelFileController.contactsList}" var="contact" style="width:50pc;" selection="#{excelFileController.selectedcontacts}">
          <p:column selectionMode="multiple" style="width:20px" />
          <p:column headerText="File Name">  
            #{contact.groupName}  
          </p:column>  
          <p:column headerText="Number of Contacts">  
            #{contact.numberofentries}  
          </p:column>
           <!-- the rest -->
    
    
    #{contact.groupName}
    #{contact.numberofentries}
    

  • 更新你的用户界面

  • 使用p而不是primefaces-p这将使您的代码更容易阅读:


  • 我已经更新了xhtml页面,以显示和反映事物的真实情况。我的页面就像你在提问之前说的那样。我已经试过了,没有用。单击“删除”按钮时,我仍然会收到“已选择0个联系人”消息。无论如何谢谢你的提示replies@PeterEdikewh