【发布时间】:2011-04-08 02:28:23
【问题描述】:
我想在 EL(表达式语言)的三元运算符中连接一个字符串。
假设有一个名为 value 的变量。如果它是空的,我想使用一些默认文本。否则,我需要在其上附加一些静态文本。
${(empty value)? "none" : value + " enabled"}
但是这不会编译。写这个的正确方法是什么?或者这甚至可能吗?
【问题讨论】:
我想在 EL(表达式语言)的三元运算符中连接一个字符串。
假设有一个名为 value 的变量。如果它是空的,我想使用一些默认文本。否则,我需要在其上附加一些静态文本。
${(empty value)? "none" : value + " enabled"}
但是这不会编译。写这个的正确方法是什么?或者这甚至可能吗?
【问题讨论】:
如果您已经使用 EL 3.0(Java EE 7;WildFly、Tomcat 8、GlassFish 4 等),那么您可以为此使用新的 += 运算符:
<c:out value="${empty value ? 'none' : value += ' enabled'}" />
如果您还没有使用 EL 3.0,并且 value 是真正的 java.lang.String 实例(因此不是 java.lang.Long),那么请使用 EL 2.2(Java EE 7;JBoss AS 6/7 、Tomcat 7、GlassFish 3 等)使用参数调用直接方法的能力,然后您将其应用于 String#concat():
<c:out value="${empty value ? 'none' : value.concat(' enabled')}" />
或者,如果您还没有使用 EL 2.2,那么使用 JSTL <c:set> 创建一个新的 EL 变量,其中连接的值刚刚内联在值中:
<c:set var="enabled" value="${value} enabled" />
<c:out value="${empty value ? 'none' : enabled}" />
【讨论】:
+= 方法是目前为止最正确的解决方案。谢谢!
使用 concat 来解决 EL + MAP + JSON 问题也是一个好主意,就像在这个例子中一样:
#{myMap[''.concat(myid)].content}
【讨论】:
这个答案已经过时了。技术已经向前发展。除非您使用的是旧系统,否则请参阅 Joel's answer。
EL 中没有字符串连接运算符。如果您不需要将连接的字符串传递给其他操作,只需将这些表达式放在一起即可:
${value}${(empty value)? 'none' : ' enabled'}
【讨论】:
Mc Dowell's answer 是对的。如果您可能需要将变量的值返回为:
${ empty variable ? '<variable is empty>' : variable }
【讨论】:
从表达式语言 3.0 开始,使用 += 运算符进行字符串连接是有效的。
${(empty value)? "none" : value += " enabled"} // valid as of EL 3.0
字符串连接运算符
评估
A += B
- 将 A 和 B 强制转换为字符串。
- 返回 A 和 B 的连接字符串。
【讨论】:
使用 EL 2,您可以执行以下操作:
#{'this'.concat(' is').concat(' a').concat(' test!')}
【讨论】:
${'this'.concat(' is').concat(' a').concat(' test!')} 将是正常形式。
${'I am'.concat(' number ').concat(1).concat('!')}?
String.concat() 的(非字符串)参数强制转换为 String 自动调用其 toString() 方法?
1.+(操作符)对EL的使用没有影响。 2.so this is the way, to use that
<c:set var="enabled" value="${value} enabled" />
<c:out value="${empty value ? 'none' : enabled}" />
这对你有帮助吗?
【讨论】: