Faces ActionEvent.getSource始终为null

时间:2012-02-15 10:29:29

标签: jsf datatable

我遇到的问题是我的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

1 个答案:

答案 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);
}

另见: