我遇到的问题是我的Faces ActionEvent返回了一个源,但对!= null的检查返回false。 疯狂的事实是,在调试模式下,我得到一个填充的ActionEvent变量。
我已将代码细分为重要部分
豆:
public class HibernateUserHandling
{
public void deleteUser(ActionEvent ev)
{
if (ev.getSource() != null && ev.getSource() instanceof HtmlDataTable) {
HtmlDataTable objHtmlDataTable = (HtmlDataTable) ev.getSource();
setRowOfUserToDelete(objHtmlDataTable.getRowIndex());
setPersonsCopy(HibernateDataOutput.persons);
setUserToDelete(getPersonsCopy()[getRowOfUserToDelete()]);
setUserIdToDelete((Integer) getUserToDelete().getUserId());
}
}
查看:
<html>
<body>
<ui:composition template="./generalTemplate.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets">
<ui:define name="content">
<h:outputStylesheet library="css" name="cssHibernate.css" />
<h:form id="main">
<h:dataTable value="#{hibernateDataOutput.persons}" var="list"
styleClass="order-table"
headerClass="order-table-header"
rowClasses="order-table-odd-row,order-table-even-row">
<h:column>
<f:facet name="header">Delete</f:facet>
<h:commandButton id="delete" actionListener="#{hibernateUserHandling['deleteUser']}" image="delete.jpg"/>
</h:column>
</h:dataTable>
</h:form>
</ui:define>
</ui:composition>
</body>
</html>
我没有收到错误,它只是因为“ev.getSource()!= null”而跳过If块。
提前致谢,
TLS
答案 0 :(得分:3)
ActionEvent
无法null
。这将是使用的JSF实现中的一个巨大错误。但是,在此特定情况下,ActionEvent#getSource()
可以从不成为HtmlDataTable
的实例。它是HtmlCommandButton
的一个实例,因为您从<h:commandButton>
调用它。所以整个if
块永远不会通过。
也就是说,这是一种非常笨拙的方式来删除当前的Person
。也许你过分关注完全过时的基于JSF 1.x的书籍/教程/资源。有更好的方法可以获得当前的Person
,其中包括:
<h:dataTable value="#{hibernateDataOutput.persons}" var="person">
<h:column>
<h:commandButton action="#{hibernateUserHandling.deleteUser(person)}" image="delete.jpg" />
</h:column>
</h:dataTable>
与
public void deleteUser(User user) {
someUserService.delete(user);
}