我正在使用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 showcase方法,但仍然存在示例问题。
我是不是做错了什么?
发布于 2012-10-24 20:24:11
我不明白为什么要在实体类中设置选择属性。试着这样做
公共类BulkSMSContactsDataModel扩展ListDataModel实现了SelectableDataModel { BulkSMSContactsDataModel() {}公共BulkSMSContactsDataModel(列表数据){ if(String.valueOf(c.getContactId()).equals(rowKey)) ( data);} @Override public contacts getRowData(String rowKey) { List contacts= (List) yourDao.getListOfBulkSMSContacts();//您的data :BulkSMSContactsSelector我猜是( BulkSMSContacts c: contacts) {super c;} return null;} @Override public Object getRowKey(BulkSMSContacts obj) { return String.valueOf(obj.getContactId());}
}
公共类ExcelFileController实现可序列化的,IFileController {私有BulkSMSContacts[] contactsSelected;私人列表联系人;私有BulkSMSContacts[]选定联系人;私有BulkSMSContactsDataModel contactsList;公共ExcelFileController() { contactsList =新联系人(BulkSMSContactsDataModel);} // getters和setters //其余代码
}
#{contact.groupName} #{contact.numberofentries}
发布于 2012-10-23 11:07:22
为了知道所选的contacts
,dataTable和UI命令组件(即<h:commandButton>
、<p:commandButton>
等)必须采用相同的形式。这意味着您的联系人数据表和删除按钮必须位于同一<h:form>
中
<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...
}
https://stackoverflow.com/questions/13022900
复制相似问题