我想遍历元素列表,并想为每个元素显示一个表单。以这种形式,我希望能够填充对于循环的每个元素都不同的bean。这是到目前为止我得到的,但是当然不起作用;)

    <ui:repeat value="#{productBean.productPositions}" var="position">
        <div>position info here</div>
        <div>list price ranges</div>
        <div>
            <h5>Create new price range for product position position</h5>
            <h:form>
                Min:
                <h:inputText
                    value="#{priceRangeBean.priceRanges[productPositionRangeSearch.productPositions.indexOf(position)].min}" />
                Max:
                <h:inputText
                    value="#{priceRangeBean.priceRanges[productPositionRangeSearch.productPositions.indexOf(position)].max}" />
                price:
                <h:inputText
                    value="#{priceRangeBean.priceRanges[productPositionRangeSearch.productPositions.indexOf(position)].price}" />
                <h:commandButton value="create"
                    action="#{priceRangeController.createRange(productPositionRangeSearch.productPositions.indexOf(position))}" />
            </h:form>

        </div>
    </ui:repeat>


我的PriceRangeBean:

@SessionScope
public class PriceRangeBean {

    private List<PriceRange> priceRanges = new ArrayList<PriceRange>();

    public List<PriceRange> getPriceRanges() {
        return priceRanges;
    }

    public void setPriceRanges(List<PriceRange> priceRanges) {
        this.priceRanges = priceRanges;
    }

}


其中PriceRange是包含最小,最大,价格为String的POJO

调用页面的控制器用与PriceRangeBean一样多的PriceRange填充ProductPosition,以便在列表中准备创建一个“新” PriceRange对象。但是,输入似乎没有到达支持bean。

有什么想法我做错了吗?

谢谢!

最佳答案

我认为您不能对value中的<h:inputText属性使用这种EL表达式。

表达方式:

 value="#{priceRangeBean.priceRanges[productPositionRangeSearch.productPositions.indexOf(position)].min}"


被(至少)评估两次。
需要在“应用请求值”中设置值时一次。并第二次进入“渲染响应阶段”。

设置该值时(在“申请请求值”阶段),该表达式由EL评估为lvalue,并且功能似乎有限。

从规范(JavaServer Pages 2.1 Expression Language Specification)


  左值只能由单个变量(例如$ {name})或
  属性解析。


您可能想查看同一规范中的1.2.1.1节。

10-01 18:29