【问题标题】:Selecting Item from primefaces datatable not working从primefaces数据表中选择项目不起作用
【发布时间】:2012-10-23 02:54:21
【问题描述】:

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

下面是我的 xhtml 页面

<h:form enctype="multipart/form-data" id="upload">
<primefaces-p:panel closable="false" collapsed="false" header="Excel Contact Uploader" id="pnlupload" rendered="true" toggleable="false" visible="true" widgetVar="pnlupload">

<primefaces-p:growl id="msg"  showDetail="true" life="3000" showSummary="true">

</primefaces-p:growl>
        <primefaces-p:fileUpload auto="true" 
        allowTypes="/(\.|\/)(xls)$/" 
        sizeLimit="1024000" 
        mode="advanced" 
        multiple="true" invalidFileMessage="Invalid file type" invalidSizeMessage="File too large" dragDropSupport="true" fileUploadListener="#{excelFileController.handleFileUpload}" showButtons="true" update="msg, tblcontacts
        " required="false"/>


      <br />
<br />


        <primefaces-p:scrollPanel rendered="true" style="height:200px;">
            <primefaces-p:dataTable  emptyMessage="No Contacts Uploaded" id="tblcontacts" rendered="true"  rows="8" 
            value="#{excelFileController.contacts}" var="contact" style="width:50pc;">
        <primefaces-p:column style="width:18px" headerText="Select"> 
       <h:selectBooleanCheckbox value="#{contact.selected}" />

        </primefaces-p:column>

        <primefaces-p:column headerText="File Name">  
        #{contact.groupName}  
        </primefaces-p:column>  
        <primefaces-p:column headerText="Number of Contacts">  
        #{contact.numberofentries}  
    </primefaces-p:column> 
    <primefaces-p:column>
    <h:button  outcome="blkedit?faces-redirect=true" rendered="true" value="Edit">
         <f:param name="contact" value="#{contact.contactId}"/>
        </h:button>
    </primefaces-p:column>
    </primefaces-p:dataTable>
   </primefaces-p:scrollPanel>

<br />
</primefaces-p:panel>
<h:commandButton value="Delete" id="btndelete" action="#{excelFileController.removeContact}"  immediate="true" disabled="false" rendered="true"/>
<h:message for="btndelete" />
</h:form>

下面是我的支持bean

@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;
}

}

下面是我的模型定义

@Entity
public class BulkSMSContacts implements Serializable {

private static final long serialVersionUID = -6444763251149211384L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@XmlAttribute
private long contactId;

@XmlElement
@NotNull(message = "message.validator.notnull")
@Size(min = 9, max = Integer.MAX_VALUE, message = "message.validator.size")
@Column(nullable = false, length = Integer.MAX_VALUE, unique = false)
@Basic(fetch = FetchType.EAGER)
private String contacts;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "Id", nullable = false)
@XmlElement(type = SMSAccount.class)
private SMSAccount account;

@NotNull(message = "message.validator.notnull")
@Size(min = 2, max = 100, message = "message.validator.size")
@Column(length = 100, nullable = false, unique = false)
@XmlElement
private String groupName;

@Column(nullable = true)
private int numberofentries = 0;

@javax.persistence.Transient
private boolean selected;

//getters and setters

问题在于,当单击删除按钮时(尽管调用了 removeContact() 方法。所有行的评估结果都没有被选中。

我也尝试过使用 primefaces 展示方法,但仍然是示例问题。

请问我是不是做错了什么?

【问题讨论】:

    标签: java jsf jsf-2 primefaces


    【解决方案1】:

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

    1. 设置数据模型:

      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());  
      }
      

      }

    2. 配置你的 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 
      

      }

    3. 配置你的 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 -->
      

    4. 更新您的用户界面。

    5. 使用 p 而不是 primefaces-p 它将更容易阅读您的代码。 :)

    【讨论】:

    • 我已经尝试了上述解决方案,主要问题是 ListDataModel 实现中的 CDI 注入不起作用,因为所有注入的工件最终都解析为 null。谢谢,欢迎提出建议
    【解决方案2】:

    为了知道被选中的contacts,dataTable和UI Command组件即&lt;h:commandButton&gt;&lt;p:commandButton&gt;等必须是同一种形式。这意味着,你的联系人数据表和你的删除按钮必须在同一个&lt;h:form&gt;

        <h:form>
            <!-- based in your code (pretty odd by the way)... -->
            <primefaces-p:dataTable  emptyMessage="No Contacts Uploaded" id="tblcontacts"
                rendered="true" rows="8" value="#{excelFileController.contacts}"
                var="contact" style="width:50pc;">
                <!-- your columns... -->
            </primefaces-p:dataTable>
            <primefaces-p:commandButton value="Delete contacts"
                action="#{excelFileController.removeContact}" />
        </h:form>
    

    另外,请检查您的页面中没有嵌套表单。

    更多信息:


    问题似乎出在 CDI 注释中。为了让你的ExcelFileController 活着,是在某处初始化对话(在你的代码中的任何地方都没有显示)。另一种解决方案是使用 JSF 注释:

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

    【讨论】:

    • 我已经更新了xhtml页面,以反映事物的真实情况。我的页面正如你所说的那样,在提问之前应该是。
    • 我已经试过了,没用。单击删除按钮时,我仍然收到“已选择 0 个联系人”消息。无论如何感谢您的及时回复
    • @PeterEdike 当您尝试使用 JSF 注释时,这是您的 import 语句:javax.annotation.*javax.faces.bean.*?
    猜你喜欢
    • 2011-09-29
    • 1970-01-01
    • 2015-06-05
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 2013-06-23
    • 2012-11-19
    相关资源
    最近更新 更多