<h: commandButton> не инициирует обратную передачу
Я использую JSF 2.1.7 и Myfaces CODI 1.0.5 на JBoss AS 7.1.1. Мой <h:commandButton>
не работает. Я прочитал эти требования и во многих блогах с помощью примеров безрезультатно. Код моего линка выглядит следующим образом
<ui:define name="pagecontent">
<h1 class="title ui-widget-header ui-corner-all">Upload Bulk Contact File</h1>
<div class="entry">
<h:form enctype="multipart/form-data" id="upload">
<p:panel closable="false" collapsed="false" header="Excel Contact Uploader"
id="pnlupload" rendered="true" toggleable="false" visible="true" widgetVar="pnlupload">
<p:growl id="msg" showDetail="true" life="3000" showSummary="true"/>
<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"/>
<p:scrollPanel rendered="true" style="height:200px;">
<p:dataTable draggableColumns="false" editable="false" emptyMessage="No
Contacts Uploaded" id="tblcontacts" rendered="true" rows="8"
selection="#{excelFileController.contactsSelected}"
value="#{excelFileController.contactDataModel}" var="contact" style="width:50pc;">
<p:column selectionMode="multiple" style="width:18px" />
<p:column headerText="File Name">
#{contact.groupName}
</p:column>
<p:column headerText="Number of Contacts">
#{contact.numberofentries}
</p:column>
<p:column>
<h:button outcome="blkedit?faces-redirect=true" rendered="true" value="Edit">
<f:param name="contact" value="#{contact.contactId}"/>
</h:button>
</p:column>
</p:dataTable>
</p:scrollPanel>
<br />
</p:panel>
<h:commandButton value="Delete" id="btndelete"
action="#{excelFileController.removeContact}" type="button" immediate="true"
disabled="false" rendered="true"/>
<h:message for="btndelete" />
</h:form>
</div>
</ui:define>
Код ExcelFileController
выглядит следующим образом:
@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 BulkContactDataModel contactDataModel;
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());
}
/*
* (non-Javadoc)
*
* @see
* org.jboss.tools.examples.controller.IFileController#handleFileUpload(
* org.primefaces.event.FileUploadEvent)
*/
@Override
public void handleFileUpload(FileUploadEvent event) {
StringBuffer buffer = new StringBuffer();
// create a new file input stream with the input file specified
// at the command line
InputStream fin = null;
try {
fin = event.getFile().getInputstream();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// create a new org.apache.poi.poifs.filesystem.Filesystem
POIFSFileSystem poifs = null;
try {
poifs = new POIFSFileSystem(fin);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
HSSFWorkbook wb = null;
try {
wb = new HSSFWorkbook(poifs);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int numberofsheets = wb.getNumberOfSheets();
for (int i = 0; i < numberofsheets; i++) {
HSSFSheet sheet = wb.getSheetAt(i);
for (Row row : sheet) {
for (Cell cell : row) {
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING :
if (!cell.getStringCellValue().isEmpty())
buffer.append(formatter.formatPhoneNumber(cell
.getStringCellValue()));
buffer.append(producer.getConfiguration(
SettingsName.SMS_PHONENUMBERDELIMITER
.toString()).getValue());
break;
case Cell.CELL_TYPE_NUMERIC :
if (cell.getNumericCellValue() != 0) {
buffer.append(formatter
.formatPhoneNumber(String.valueOf(cell
.getNumericCellValue())));
buffer.append(producer.getConfiguration(
SettingsName.SMS_PHONENUMBERDELIMITER
.toString()).getValue());
break;
}
default :
break;
}
}
}
}
BulkSMSContacts contacts = new BulkSMSContacts();
contacts.setAccount(profile.getSmsAccount());
int number = formatter.splitPhoneNumbers(buffer.toString()).length;
contacts.setContacts(buffer.toString());
String filenameString = event.getFile().getFileName();
int index = filenameString.indexOf(".");
filenameString = filenameString.substring(0, index);
contacts.setGroupName(filenameString);
contacts.setNumberofentries(number);
try {
deleter.addContact(contacts);
List<BulkSMSContacts> temp = listProducer.getBulkSMSContacts();
contactDataModel.setWrappedData(temp);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,
"Success", number
+ " entries processed. Please refresh page to view"));
}
/*
* (non-Javadoc)
*
* @see org.jboss.tools.examples.controller.IFileController#removeContact()
*/
@Override
public String removeContact() {
int contactsdeleted = 0;
if (contactsSelected != null) {
for (BulkSMSContacts contacts : contactsSelected) {
if (contacts != null) {
deleter.deleteContact(contacts);
contactsdeleted += 1;
}
}
List<BulkSMSContacts> temp = listProducer.getBulkSMSContacts();
contactDataModel.setWrappedData(temp);
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;
}
}
Все методы работают отлично, за исключением последнего "removeContact", в котором соответствующий CommandButton даже не инициирует обратную передачу.
Как это вызвано и как я могу его решить?
Ответы
Ответ 1
Вам нужно удалить type="button"
из <h:commandButton>
. Он должен был быть type="submit"
, который уже по умолчанию.
type="button"
делает его <input type="button">
вместо <input type="submit">
, что полезно только для обработчиков на стороне клиента, которые вы обычно прикрепляете с помощью onclick
и т.д.