0

How can I fill my fields in a class according to a variable in a foreach loop?

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

In my Skills class (different from the Skill class): i have fields:

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

I want to fill each of these fields with {skills.skillFromSelectList${i}}">. So for the first loop the selected item will be put in skillFromSelectList1. For the second loop the selected items will be put in skillFromSelectList2, etc.

4

1 回答 1

2

像这样嵌套 EL 表达式#{...#{...}...}在任何情况下都是无效的。您应该将 EL 表达式视为单个大型评估上下文,其中各种变量可以相互交互。

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

<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]}">
        ...
于 2013-07-01T17:56:19.363 回答