Объединение строки со значением переменной в качестве имени другой переменной в EL
Я хочу сделать что-то вроде этого:
<display:table name="${summary${index}}">
Но это не работает. Исключение: "$ {summary ${selChrm}} содержит недопустимые выражения.
Я хотел бы, чтобы пользователь использовал выпадающий список, чтобы выбрать выбор и поместить в индекс переменной. Затем в таблице отобразится соответствующий список объектов javabean, т.е. named summary01, summary02 и т.д. Как я могу это сделать? Спасибо заранее.
Обновление: Спасибо, ребята. Проблема заключается в вложенном EL. Я попытался использовать
<display:table name="summary${index}">
Но в таблице ничего не отображается, так как summary01 - это имя переменной. Если я буду жестко закодировать имя переменной, она будет работать:
<display:table name="${summary01}">
Итак, как я могу вставить EL? Если это не возможно в JSTL, как я могу достичь поведения, которое пользователь может использовать выпадающий список, чтобы определить, какое содержимое должно отображаться в таблице? Еще раз спасибо.
Ответы
Ответ 1
Вы не можете вставлять выражения EL. Однако вы можете просто конкатенировать их.
<display:table name="${summary}${index}">
Или, если ${summary}
на самом деле не является объектом в какой-либо области, сделайте
<display:table name="summary${index}">
Обновить: OK, вам действительно нужно получить доступ к ${summary01}
. Если вы заранее знаете область действия, вы можете получить к ней доступ, используя обозначение скобки. Представьте, что он запрашивает область действия, вы можете получить доступ к ней "plain" следующим образом:
<display:table name="${requestScope['summary01']}">
Но вы также можете использовать другую переменную EL в фигурных скобках (просто ее не указывать):
<display:table name="${requestScope[summary]}">
Итак, мы хотели бы установить его где-нибудь. Тег JSTL c:set
отлично подходит для этого:
<c:set var="summary" value="summary${index}" />
Ответ 2
Шаг первый:
<c:set var="summary" value="${requestScope['summary'.concat(index)]}" />
Шаг второй:
<display:table name="${summary}">
Просто как это:)
UPDATE, поскольку BalusC, упомянутый в комментариях, вам нужно 3.0 сервлета, чтобы использовать это.
Ответ 3
Это то, что действительно засасывает JSTL: нет прямого способа сделать это, если вы хотите сделать это в выражении JSTL. Другими словами, нет оператора конкатенации строк.
Вы всегда можете сделать
<something foo='${something} ${something_else}'/>
но это не всегда полезно.
В моем мире я реализовал свою собственную "concat" функцию, поэтому могу сказать
$(foo:bar(mystuff:concat("something", something.else))}
Ответ 4
Это сработало для меня.
${not empty marginLeft ? 'margin-left:'.concat(marginLeft) : ''}