jstl forToken с вложенным HashMap в атрибуте запроса - PullRequest
1 голос
/ 30 августа 2010

У меня есть HashMap (hshFields) HashMaps (ecd_date, own_by и т. Д.) С ключами (метка, размер и т. Д.), К которым я обращаюсь так:

<c:out value="${hshFields.ecd_date.label}" />
<c:out value="${hshFields.owned_by.label}" />
<c:out value="${hshFields.fnd_source.label}" />

(примечание: ядолжен использовать JSTL, а не EL)

о выкладывает "метку" поля (поддерживается в карте XML), то есть:

commitment_id = Commitment Id 
owned_by = Commitement Owner
fndsource = Funding Source

Я хотел бы сейчас использоватьJSTL forToken, чтобы зациклить вложенный HashMap. Но я не могу заставить его работать. Вот одна из моих попыток:

 <c:forTokens items="commitment_id, owned_by, fndsource" delims="," var="curField">
    The Field Label is: <c:out value="${hshFields.${curField}.label}" /> <br />
    The Field Sixze is: <c:out value="${hshFields.${curField}.size}" /> <br />
</c:forTokens>

Это не работает из-за неправильного синтаксиса или, надеюсь, не потому, что я не 'у меня есть возможность EL?

РЕДАКТИРОВАТЬ ОК, основываясь на ответе Скаффмана ниже, у меня есть:

<c:forTokens items="owned_by, ecd_date, commitment_id" delims="," var="curField">
  Label for <c:out value="${curField}" /> : <c:out value="${hshFields[curField].label}" /><br></br>
</c:forTokens>

и вывод:

Label for owned_by : Commitment Owner
Label for ecd_date : 
Label for commitment_id : 

Кажется, он работает только с первым токеном, потому что, если я использую следующее:

Label for owned_by : <c:out value="${hshFields.owned_by.label}" /> <br></br>
Label for ecd_date : <c:out value="${hshFields.ecd_date.label}" /> <br></br>
Label for commitment_id : <c:out value="${hshFields.commitment_id.label}" /> <br></br>

, я получаю этот вывод:

Label for owned_by : Commitment Owner
Label for ecd_date : Estimated Completion Date
Label for commitment_id : Commitment Number

1 Ответ

3 голосов
/ 30 августа 2010

Ваш синтаксис не совсем правильный, он должен быть

<c:out value="${hshFields[curField].label}" />

, а не

<c:out value="${hshFields.${curField}.label}" />

Подобные вложенные выражения EL недопустимы.

обновлено: Причина, по которой он работает только для первой итерации в цикле, заключается в том, что в вашем списке items есть пробелы и запятые, а delims обрабатывает толькозапятые.Поэтому измените цикл на

items="commitment_id,owned_by,fndsource"

вместо

items="commitment_id, owned_by, fndsource"

В противном случае пробелы станут частью отдельных значений цикла.

...