JSTL/EL中的三元运算符

Tin*_*iny 41 jsp jstl el ternary-operator conditional-operator

JSTL的以下标记可用于将值设置为请求范围中的变量.

<c:set var="value" scope="request" value="someValue"/>
Run Code Online (Sandbox Code Playgroud)

我想要有条件地检查,如果value设置的变量是否为空,并显示相应的结果,如下所示,使用<c:when>...</c:when>.

<c:choose>
    <c:when test="${not empty value}">
        <c:out default="None" value="${value}"/>
    </c:when>
    <c:otherwise>
        <c:out default="None" value="None"/>
    </c:otherwise>
</c:choose>
Run Code Online (Sandbox Code Playgroud)

我想使用三元表达式来减少代码行,比如

<c:out default="None" value="${not empty value ? value : 'None'}"/>
Run Code Online (Sandbox Code Playgroud)

它被评估,因为它实际上意味着,但如果我交换表达式的顺序,如,

<c:out default="None" value="${empty value ? 'None' : value}"/>
Run Code Online (Sandbox Code Playgroud)

然后是语法错误指示,

"$ {空值?'无':值}"包含无效表达式:javax.el.E​​LException:错误解析:$ {空值?'无':值}

那么为什么会这样呢?


我正在使用该JSTL 1.1库,包含以下taglib,

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
Run Code Online (Sandbox Code Playgroud)

ric*_*ckz 53

我在Tomcat 5.59,JSP 2.0和JSTL 1.1中测试了以下页面.它运行没有任何错误.

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
<c:set var="value" scope="request" value="someValue"/>
<c:out default="None" escapeXml="true" value="${not empty value ? value : 'None'}" />
<c:out default="None" escapeXml="true" value="${empty value ? 'None' : value}" />
<c:set var="value" scope="request" value="" />
<br/>
<c:out default="None" escapeXml="true" value="${not empty value ? value : 'None'}" />
<c:out default="None" escapeXml="true" value="${empty value ? 'None' : value}" />
Run Code Online (Sandbox Code Playgroud)