Объединение строки со значением переменной в имя другой переменной в EL - PullRequest
12 голосов
/ 28 июня 2010

Я хочу сделать что-то вроде этого:

<display:table name="${summary${index}}">

Но это не работает, выдает исключение: «$ {summary $ {selChrm}}» содержит недопустимые выражения. Я хотел бы, чтобы пользователь использовал раскрывающийся список, чтобы выбрать выбор и поместить в индекс переменной. Тогда в таблице будет отображен соответствующий список объектов javabean, т.е. с именем summary01, summary02 и т. д. Как я могу это сделать? Заранее спасибо.


Обновление : Спасибо, ребята. Проблема с вложенным EL. Я пытался использовать

<display:table name="summary${index}">

Но в таблице ничего не показано, так как summary01 - это имя переменной. Если я жестко закодирую имя переменной, она будет работать:

<display:table name="${summary01}">

Следовательно, как я могу сделать вложенный EL? Если это не возможно в JSTL, как я могу добиться того, чтобы пользователь мог использовать выпадающий список, чтобы определить, какое содержимое будет отображаться в таблице? Еще раз спасибо.

Ответы [ 4 ]

18 голосов
/ 28 июня 2010

Вы не можете вкладывать выражения EL. Однако вы можете просто объединить их.

<display:table name="${summary}${index}">

Или, если ${summary} на самом деле не является объектом ни в одной из областей, выполните

<display:table name="summary${index}">

Обновление : ОК, вам действительно нужен доступ к ${summary01}. Если вы знаете сферу заранее, тогда вы можете получить к ней доступ, используя обозначение скобок. Представьте, что это объем запроса, вы можете получить к нему доступ "просто" следующим образом:

<display:table name="${requestScope['summary01']}">

Но вы также можете использовать другую переменную EL в фигурных скобках (просто заключите ее в кавычки):

<display:table name="${requestScope[summary]}">

Итак, мы бы хотели установить его где-нибудь. Тег JSTL c:set идеально подходит для этого:

<c:set var="summary" value="summary${index}" />
3 голосов
/ 26 января 2012

Шаг первый:

<c:set var="summary" value="${requestScope['summary'.concat(index)]}" />

Шаг второй:

<display:table name="${summary}">

Просто так:)

ОБНОВЛЕНИЕ , как BalusC упомянул в комментариях, вам нужно 3.0 сервлета, чтобы использовать это.

1 голос
/ 28 июня 2010

Это вещь, которая действительно отстой в JSTL: нет прямого способа сделать это , если вы хотите это сделать indide выражение JSTL.Другими словами, здесь нет оператора конкатенации строк.

Вы всегда можете сделать

 <something foo='${something} ${something_else}'/>

, но это не всегда полезно.

В моем мире я реализовал свойсобственная "concat" функция, поэтому я могу сказать

$(foo:bar(mystuff:concat("something", something.else))}
0 голосов
/ 15 октября 2017

у меня сработало.

${not empty marginLeft ? 'margin-left:'.concat(marginLeft) : ''}
...