Как объединить строку в EL?

Как заставить переменную promoPrice печатать как часть строки ONLY $4.67?

<c:set var="promoPrice" value="4.67" />
<p>${(promoPrice != null) ? "ONLY $${promoPrice}" : "FREE"}</p>

person alquatoun    schedule 09.06.2011    source источник
comment
мое предложение решило вашу проблему? то есть вынести $promoPrice за пределы кавычек.   -  person Basanth Roy    schedule 09.06.2011
comment
@rationalSpring нет, это не работает. Я думаю, вы не можете передать переменную таким образом. Спасибо хоть.   -  person alquatoun    schedule 09.06.2011


Ответы (5)


Если вы уже используете EL 3.0 (Java EE 7; WildFly, Tomcat 8, GlassFish 4 и т. д.), вы можете использовать для этого новый оператор +=:

<p>${not empty promoPrice ? 'ONLY $' += promoPrice : 'FREE'}</p>

Однако, если вы еще не используете EL 3.0, используйте возможность EL 2.2 (Java EE 7; JBoss AS 6/7, Tomcat 7, GlassFish 3 и т. д.) для вызова прямых методов с аргументами, которые вы затем применяете к String#concat():

<p>${not empty promoPrice ? 'ONLY $'.concat(promoPrice) : 'FREE'}</p>

Или, если вы еще не используете EL 2.2, используйте JSTL <c:set> для создания новой переменной EL с конкатенированными значениями, просто встроенными в value:

<c:set var="promoPriceString" value="ONLY $${promoPrice}" />
<p>${not empty promoPrice ? promoPriceString : 'FREE'}</p>

В вашем конкретном случае можно разделить выражение на две части:

<p>${not empty promoPrice ? 'ONLY $' : 'FREE'}${promoPrice}</p>

Если ${promoPrice} равно null или пусто, оно все равно не будет напечатано.

person BalusC    schedule 09.06.2011
comment
большое спасибо! По какой-то причине я нигде не мог найти информацию об этом виде конкатенации. - person alquatoun; 09.06.2011
comment
'str1'.concat(' str2') не работает в EL 2.1 (Tomcat 6) с этой ошибкой org.apache.jasper.JasperException: /WEB-INF/pages/x.jsp Функция concat должна использоваться с префиксом, если пространство имен по умолчанию не указано. - person naXa; 11.12.2017

Прямой путь

<c:set var="promoPrice" value="4.67" />
<p>
<c:choose>
    <c:when test="${(promoPrice != null)}">
        ONLY $${promoPrice}
    </c:when>
    <c:otherwise>
        FREE
    <c:otherwise>
</c:choose>
</p>
person joekarl    schedule 09.06.2011
comment
Мне нравится эта версия, я просто искал что-то более компактное. Спасибо! - person alquatoun; 09.06.2011
comment
да, это немного многословно, но довольно ясно, особенно если вы используете jstl в других местах. - person joekarl; 10.06.2011

Простое и надежное решение для конкатенации строк, совместимое с EL 2.0+, заключается в использовании промежуточной переменной:

<c:set var="promoPrice" value="4.67" />
<c:set var="priceText" value="ONLY ${promoPrice}" />
<p>${(promoPrice != null) ? priceText : "FREE"}</p>

Согласно @BalusC, начиная с EL 2.2, вы можете выполнять конкатенацию, используя метод String#concat(), а начиная с EL 3.0, вы можете использовать метод новый оператор += для этого.

person naXa    schedule 11.12.2017

Я сделал что-то вроде этого, где у меня есть переменная mathjaxUrl, и я хочу связаться с ней другой строкой

<c:set var="mathjaxUrl" value="https://cdnjs.cloudflare.com/ajax/libs/mathjax" />
... some other stuff here
<c:set var="mathjaxUrl" value="${mathjaxUrl}?config=TeX-AMS-MML_HTMLorMML" />

надеюсь, это поможет вам

person Basheer AL-MOMANI    schedule 17.05.2017

Это не сработает?

<c:set var="promoPrice" value="4.67" />
<p>${(promoPrice != null) ? "ONLY $"${promoPrice} : "FREE"}</p>

Обратите внимание, что ${promoPrice} находится вне кавычек. Это похоже на самое простое решение.

person Basanth Roy    schedule 09.06.2011
comment
Почему -1? Может ли тот, кто оценил этот ответ, объяснить? - person Basanth Roy; 09.06.2011
comment
это недопустимый синтаксис EL; из спецификации EL (2.2 mrel): Вложенная оценка -выражения, такие как ${item[${i}]}, недопустимы. - person McDowell; 10.06.2011