JSF 2.0:为什么列表中的对象(最后一个除外)不能更新



在我的代码中,我有以下对象来实现购物车:

public class CartItem {
    ...
    public int id;
    public int quantity;
    ...
}
public class Partner {
    ...
    public List<CartItem> listOfItems;
    ...
}
public class Cart implements Serializable {
    ...
    private List<Partner> listOfPartners;
    ...
}

在ViewCart.xhtml页面中,我列出的项目如下:

...
<ui:repeat value="#{cartManagedBean.cart.listOfPartners}" var="p">
    <ui:repeat value="#{p.listOfItems}" var="i">
        <h:form>
            ...
            <h:inputText size="3" value="#{i.quantity}" />
            <h:commandButton value="Update" />
            ...
        </h:form>
    </ui:repeat>
</ui:repeat>
...

这是ManagedBean:

@ManagedBean
@SessionScoped
public class CartManagedBean {
    ...
    private Cart cart;
    ...
}

所有的getter和setter方法都正确地完成了。因此,我期望当我点击更新按钮时,相应Item的数量将被更新。但是,当我测试该函数时,只有列表中的最后一项可以更新。

如果有人能给我一些建议,告诉我如何解决这个问题,我将非常感激。

UPDATE:我通过用h:dataTable替换ui:repeat来使其工作。我想我对ui:repeat的了解应该是错的。当我使用ui:repeat时,我看到生成的HTML类似于:

<form>
    ...
    <input type="submit" id="jdt:51;jdt52" />
    ...
</form>
<form>
    ...
    <input type="submit" id="jdt:51;jdt52" />
    ...
</form>

换句话说,所有的item都以相同的ID生成。我甚至尝试通过将每个项目的唯一ID附加到输入ID中,使数量的输入ID唯一,如下所示:

<h:inputText id="quantity#{i.id}" size="3" value="#{i.quantity}" />
但是,在HTML结果中,我看到ID类似于:
<form>
    ...
    <input type="submit" id="jdt:51;jdt52;quantity203" />
    ...
</form>
<form>
    ...
    <input type="submit" id="jdt:51;jdt52;quantity203" />
    ...
</form>

换句话说,第一个项目的ID对于所有后续项目都是重复的。虽然我还没有完全理解如何用新值更新变量,但我认为这就是为什么只有最后一项可以更新的原因。

如果有人能进一步为我解释一下,我将非常感激,这样我就不会再犯同样的错误了=)。

你好像在用Mojarra。<ui:repeat>在Mojarra完全坏了。我可以重现你的问题,甚至在最新的Mojarra 2.1.4。然而,当使用MyFaces 2.1.3时,它可以100%工作。我已经向Mojarra的人报告了2243号问题。

你有3个选项:

  • 用MyFaces替换Mojarra
  • 使用<c:forEach>代替<ui:repeat>。这只适用于<c:forEach>本身不在某个UIData组件中。
  • 使用UIData组件代替<ui:repeat>

相关内容

最新更新