2

我有<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 方法中。仅对于最后一个产品,它按预期工作。

这是如何引起的,我该如何解决?

4

1 回答 1

0

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

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

@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">

也可以看看

于 2013-06-04T12:00:56.553 回答