2010-06-28 2 views
12

Я хочу сделать что-то вроде этого:Объединяя строку со значением переменной будет имя другой переменной в EL

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

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


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

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

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

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

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

+0

Пожалуйста, не путайте JSTL с EL. JSTL - это [этот taglib] (http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/). EL - это те '$ {}' вещи: [Язык выражений] (http://download.oracle.com/docs/cd/E17477_01/javaee/1.4/tutorial/doc/JSPIntro7.html) – BalusC

ответ

17

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

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

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

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

Update: Хорошо, вы на самом деле нужно, чтобы получить доступ ${summary01}. Если вы заранее знаете область действия, вы можете получить к ней доступ, используя обозначение скобки. Представьте себе, что это запрос с заданной областью, вы можете получить доступ к нему «простой» следующим образом:

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

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

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

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

<c:set var="summary" value="summary${index}" /> 
1

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

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

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

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

В моем мире я реализовал свою собственную функцию "Concat", так что я могу сказать,

$(foo:bar(mystuff:concat("something", something.else))} 
3

Шаг один:

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

Шаг два:

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

Простой как это:

UPDATE Как указано в комментариях к BalusC, вам необходимо 3.0 сервлета, чтобы использовать это.

+0

Обратите внимание, что для этого требуется EL 2.2 (Servlet 3.0), который был относительно новым на данный момент, когда задавался этот вопрос. В старых версиях EL вы не можете вызывать подобные методы. – BalusC

0

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

${not empty marginLeft ? 'margin-left:'.concat(marginLeft) : ''} 
Смежные вопросы