26

How do I get the promoPrice variable to print as part of the string ONLY $4.67?

<c:set var="promoPrice" value="4.67" />
<p>${(promoPrice != null) ? "ONLY $${promoPrice}" : "FREE"}</p>
BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555
alquatoun
  • 580
  • 1
  • 5
  • 19

5 Answers5

44

If you're already on EL 3.0 (Java EE 7; WildFly, Tomcat 8, GlassFish 4, etc), then you could use the new += operator for this:

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

If you're however not on EL 3.0 yet, then use EL 2.2 (Java EE 7; JBoss AS 6/7, Tomcat 7, GlassFish 3, etc) capability of invoking direct methods with arguments, which you then apply on String#concat():

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

Or if you're even not on EL 2.2 yet, then use JSTL <c:set> to create a new EL variable with the concatenated values just inlined in value:

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

In your particular case, another way is to split the expression in two parts:

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

If ${promoPrice} is null or empty, it won't be printed anyway.

BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555
  • thank you very much! For some reason I couldn't find info anywhere about this kind of concatenation. – alquatoun Jun 09 '11 at 19:30
  • `'str1'.concat(' str2')` fails in EL 2.1 (Tomcat 6) with this error org.apache.jasper.JasperException: /WEB-INF/pages/x.jsp The function concat must be used with a prefix when a default namespace is not specified. – naXa stands with Ukraine Dec 11 '17 at 10:48
3

Straight jstl way

<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>
joekarl
  • 2,118
  • 14
  • 23
1

A straightforward and robust solution for string concatenation, that is compatible with EL 2.0+, is to use an intermediate variable:

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

According to @BalusC, starting from EL 2.2 you can do concatenation using String#concat() method, and starting from EL 3.0 you can use the new += operator for this.

naXa stands with Ukraine
  • 35,493
  • 19
  • 190
  • 259
-1

I did something like this where I have a variable mathjaxUrl and I want to contact it other string

<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" />

hope this help you

Basheer AL-MOMANI
  • 14,473
  • 9
  • 96
  • 92
-3

Won't this work ?

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

Notice that the ${promoPrice} is outside the quotes. This looks like the simplest solution.

Basanth Roy
  • 6,272
  • 5
  • 25
  • 25
  • Why the -1? Could whoever rated this answer explain? – Basanth Roy Jun 09 '11 at 19:23
  • 3
    this is not legal EL syntax; from the [EL specification](http://jcp.org/aboutJava/communityprocess/mrel/jsr245/index.html) (2.2 mrel): _Nested eval-expressions, such as `${item[${i}]}`, are illegal._ – McDowell Jun 09 '11 at 20:18