<h:inputtext>似乎不能在<ui:repeat>中工作,只提交最后一个条目</ui:repeat> </h:inputtext>

时间:2013-06-04 04:15:58

标签: jsf arraylist user-input uirepeat

我有<ui:repeat> <ui:inputText>

<ui:composition xmlns="http://www.w3.org/1999/xhtml"    
    xmlns:ui="http://java.sun.com/jsf/facelets"
    template="./templates/masterLayout.xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:c="http://java.sun.com/jsp/jstl/core">

    <ui:define name="content">
        <ui:repeat value="#{genproducts.dbList()}" var="itemsBuying">
            <div class="indproduct">
                <p class="center">#{itemsBuying.name}</p>
                <div class="center">
                    <h:form style="margin-left: auto; margin-right: auto;">
                        <h:inputText value="#{itemsBuying.amount}" />
                        <h:commandLink action="#{shoppingCart.addToCart(itemsBuying)}" value="add" />
                    </h:form>
                </div> 
            </div>
        </ui:repeat>
    </ui:define>
</ui:composition>

这是#{genproducts}支持bean:

@ManagedBean(name = "genproducts")
@ViewScoped
public class Genproducts{

    public List<Product> dbList() throws SQLException {
        List<Product> list = new ArrayList<>();
        ...
        return list;
    }

} 

这是Product实体:

@ManagedBean(name = "product")
@RequestScoped
public class Product {

    private int amount;

    public int getAmount() {
        return amount;
    }

    public void setAmount(int amount) {
        this.amount = amount;
    }

}

就我而言,dbList()方法有四种产品。对于前三个产品,当我输入不同的值时,默认值显示在action方法中。仅适用于最后一个产品,它按预期工作。

这是如何引起的?如何解决?

1 个答案:

答案 0 :(得分:0)

这是因为您(重新)在<ui:repeat value>后面的getter方法中创建列表。在每轮迭代期间调用此方法。因此,每次下一次迭代都将基本上废弃上一次迭代期间设置的值。在action方法中,最终得到在上一轮迭代期间创建的列表。这就是为什么最后一个条目似乎工作正常。

这种做法确实绝对不对。您根本不应该在getter方法中执行业务逻辑。使列表成为属性,并在bean(post)构造期间仅填充一次。

@ManagedBean(name = "genproducts")
@ViewScoped
public class Genproducts{

    private List<Product> list;

    @PostConstruct
    public void init() throws SQLException {
        list = new ArrayList<>();
        // ...
    }

    public List<Product> getList() {
        return list;
    }

} 

哪个被引用为

<ui:repeat value="#{genproducts.list}" var="itemsBuying">

另见