重复的JSF问题

时间:2011-04-12 21:58:55

标签: java jsf

每次使用ui:repeat输出数据表或复合组件时,我都会遇到重复出现的JSF问题。假设您正在显示用户列表,并且在一列中您有3个图标,一个用于查看完整配置文件,另一个用于删除用户,另一个用于编辑其数据。因为我不能做#{fooBean.delete(user)}这样的事情,我该如何处理呢?

这是他们正在谈论的布局: http://img821.imageshack.us/img821/9039/tablev.png

我可以使用commandLink调用逻辑,但如何获取用户或文章或产品等。 有没有非hackish的方式?

1 个答案:

答案 0 :(得分:1)

如果您正在使用dataTable,则可以将dataTable组件绑定到辅助bean,并确定单击了哪一行。

<h:dataTable binding="#{backingBean.userTable}" value="#{backingBean.users}" var="user"> ... </h:dataTable>

<h:commandLink actionListener="#{backingBean.deleteLinkClicked}">Delete</h:commandLink>

然后是支持bean:

public class BackingBean implements Serializable {
    private HtmlDataTable userTable;
    // implement getter/setter for userTable

    public void deleteLinkClicked(ActionEvent event) {
        User user = (User)userTable.getRowData();
        // implement code to delete user
    }
}

当使用ui:repeat时,我不知道最佳实践,但我使用f:param来传递链接中的参数。以下是ui:重复上述内容。

<ui:repeat value="#{backingBean.users}" var="user">
    <h:commandLink value="Delete" action="#{backingBean.deleteUser}">
        <f:param name="userId" value="#{user.id}">
    </h:commandLink>
</ui:repeat>

在支持bean中:

public class BackingBean implements Serializable {
    @ManagedProperty(value="#{param.userId}")
    private Long userId;
    // implement getter/setter for userId

    public String deleteUser() {
        // at this point, the userId field should have been set via the param
    }
}

我认为您可以使用actionListener而不是动作(就像我在dataTable示例中所做的那样),但我还没有尝试过。