Как да конкатенирам низ в 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 променлива с конкатенираните стойности, току-що вградени в стойността:

<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

Прав jstl начин

<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): Вложено eval -изрази, като ${item[${i}]}, са незаконни. - person McDowell; 10.06.2011