如何根据JSF中foreach的迭代值填充字段?

时间:2013-07-01 14:35:21

标签: jsf foreach jstl el

如何根据foreach循环中的变量填充类中的字段?

<c:forEach var="i" begin="1" end="#{resource.numberOfSkills}">
                                <h:panelGrid columns="2" cellpadding="5">
               *Here my problem* ---> <h:selectOneMenu value="#{**skills.skillFromSelectList${i}**}">
                                        <f:selectItem itemLabel="Comp" itemValue="" />
                                        <f:selectItems value="#{skills.listOfTitlesOfSkills}"/>
                                    </h:selectOneMenu>
                                    <p:rating value="#{skills.levelSkill}"/> 
                                </h:panelGrid>
                            </c:forEach>

在我的技能课程中(与技能课程不同):我有字段:

private Skill skillFromSelectList1;
private Skill skillFromSelectList2;
private Skill skillFromSelectList3;
private Skill skillFromSelectList4;
private Skill skillFromSelectList5;
private Skill skillFromSelectList6;

我想用{ skills.skillFromSelectList $ {i} }“&gt;来填充每个字段。因此,对于第一个循环,所选项目将放入skillFromSelectList1。对于第二个循环所选项目将放入skillFromSelectList2等

1 个答案:

答案 0 :(得分:2)

如此#{...#{...}...}嵌套EL表达式无效。您应该将EL表达式看作一个大的评估上下文,其中各种变量可以相互交互。

您的具体问题可以通过创建另一个EL变量来解决,该变量表示所需的属性名称,然后使用大括号表示法#{bean[property]}将其评估为bean的动态属性。

<c:forEach var="i" begin="1" end="#{resource.numberOfSkills}">
    <c:set var="propertyName" value="skillFromSelectList#{i}" />
    <h:selectOneMenu value="#{skills[propertyName]}">
        ...

然而,存在设计问题。你不断重复Skill道具。为什么不在一个Skill[]List<Skill>属性中抓住它们?那你就可以做到

<c:forEach items="#{skills.skillFromSelectList}" varStatus="loop">
    <h:selectOneMenu value="#{skills.skillFromSelectList[loop.index]}">
        ...