如何将表行绑定到jsf中的Edit-button?

时间:2009-12-11 16:16:59

标签: java data-binding jsf

这很简单,但不幸的是我不了解JSF中幕后的一些过程。所以,我也对相关文章的链接感兴趣。

问题:我有一个用户对象列表。我将此列表表示为dataTable。

<h:dataTable var="user" value="#{userService.allUsers}">
    <h:column>
        <f:facet name="header">
            <h:outputText value="Login"/>
        </f:facet>
        <h:outputText value="#{user.login}"/>
    </h:column>
    <h:column>
        <f:facet name="header">
            <h:outputText value="Birthdate"/>
        </f:facet>
        <h:outputText value="#{user.birthDate}"/>
    </h:column>
    <h:column>
        <f:facet name="header">
            <h:outputText value="Name"/>
        </f:facet>
        <h:outputText value="#{user.name}"/>
    </h:column>
    <h:column>
        <!--This form with button is not a real code, just my suggestion how these things should be done-->
        <h:form>
            <h:commandButton action="openEditForm" value="Edit"/>
        </h:form>
    </h:column>
</h:dataTable>

现在我想将commandButton“Edit”添加到每个表行。单击此按钮应该打开一些带有可编辑字段的表单,我们可以在其中更改当前值。

<!--It's not a real code, just my suggestion how these things should be done-->
<h:form>
    <h:inputText value="#{user.login}"/>
    <h:inputText value="#{user.birthDate}"/>
    <h:inputText value="#{user.name}"/>
    <h:commandButton action="saveEdits" value="Save"/>
</h:form>

所以,我有两个问题:

  1. 如何将“编辑”按钮绑定到每一行(即用户对象)?
  2. 如何以编辑形式获取用户对象(第二块代码)?

2 个答案:

答案 0 :(得分:6)

<h:commandLink id="editlink" value="#{msg.edit}" action="myEditPageNavRule">
    <f:setPropertyActionListener value="#{user}"
        target="#{userBean.user}" />
 </a4j:commandLink>

其中#{user}是您的dataTable var。根据userBean的范围,打开编辑页面时将获得相应的数据。 (它肯定会与会话范围一起使用,如果你的navigationRule没有'重定向',我认为你会在请求范围内使用它。)

上面的代码只是将当前User对象设置为target属性。

答案 1 :(得分:3)

  1. 只需action="#{user.edit}"或更好(更常见的方法,因为业务逻辑不属于模型对象)action="#{userService.edit}"然后在edit方法中访问{{ 1}} JSF页面中的User对象或动作方法中的<f:setPropertyActionListener>。在任何情况下,您只需要确保UIData#getRowData()组件在后续请求中保留完全相同的数据模型。

    可以在此处找到示例:Using datatables

  2. 如果将其声明为托管bean,则它已在范围内可用。如果要从另一个托管bean引用它,请使用托管属性注入。

    示例可以在这里找到:Communication in JSF