JSP EL String конкатенация

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

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

${var1 == 0 ? 'hi' : 'hello ' + var2}

Он выдает исключение, пытающееся применить 'hello' к Double

Ответ 1

Оператор + всегда означает численное сложение в jsp el. Чтобы выполнить конкатенацию строк, вам придется использовать несколько соседних el-выражений, например ${str1}${str2}. Если я правильно прочитал ваш пример, это можно было бы написать как:

${var1 == 0 ? 'hi' : 'hello '}${var1 == 0 ? '' : var2}

Изменить:. Еще одна возможность - использовать jstl, который длиннее, но может быть более ясным, если в тексте больше текста, который зависит от var1:

<c:choose>
    <c:when test="${var1 == 0}">hi</c:when>
    <c:otherwise>hello <c:out value="${var2}"/></c:otherwise>
</c:choose>

c:out может не понадобиться, в зависимости от версии jsp.

Ответ 2

Использование конкатенации строки java работает лучше.

#{var1 == 0 ? 'hi' : 'hello'.concat(var2)}

Преимущество здесь в том, что вы также можете передать это в функцию, например

#{myCode:assertFalse(myVar == "foo", "bad myVar value: ".concat(myVar).concat(", should be foo"))}

Ответ 3

Я знаю, что это старая тема, но ответ на этот вопрос изменился за последние шесть месяцев, и важно отметить, что изменения, IMO (так как я нашел это в Googling "el concatenate strings" ).

Как и в случае с EL Expression 3.0 (открытый бюллетень, одобренный августом 2012 года, выпущенный с Java EE 7), скручивается синтаксис, который первоначально использовал вопросник:

${var1 == 0 ? 'hi' : 'hello ' += var2}

Было много разногласий с использованием += вместо +, но это то, что есть. Это будет правильно оценивать и конкатенировать строки, как ожидалось. Вы также можете использовать оператор cat вместо оператора +=:

${var1 == 0 ? 'hi' : 'hello ' cat var2}

Пока это законно, обратите внимание, что вы не сможете использовать его, пока ваш веб-контейнер (Tomcat, Jetty, GlassFish и т.д.) не выпустит новую версию, поддерживающую Java EE 7/EL 3.0. Это ожидается когда-то до конца 2013 года, возможно, уже в начале осени.

Отредактировано 2015-02-19, чтобы отметить, что конечный оператор был +=, а не +, как первоначально ответили.

Ответ 4

Еще одна альтернатива всему, что уже упоминалось:

<c:set var="hellovar2" value="hello ${var2}" />
${var1 == 0 ? 'hi' : hellovar2}