一尘不染

如何用EL表达式语言比较两个对象变量?

jsp

我正在创建所有语言的下拉列表。列表的默认语言选择将由用户添加的信息决定:

<select>
    <c:forEach items="${languages}" var="lang">
        <c:choose>
            <c:when test="${lang}.equals(${pageLang})">
                <option value="${lang}" selected>${lang}</option>
            </c:when>
            <c:otherwise>
                <option value="${lang}">${lang}</option>
            </c:otherwise>
        </c:choose>
    </c:forEach>
</select>

.equalsEL中似乎不存在。看过这里,建议我编写自己的函数,然后导入并使用它。因为这仅仅是此页面的一件小事,所以我不想为此而开始创建库等。我也不想开始为servlet创建专家对象以返回其中的额外信息。

我唯一想做的就是从servlet中返回整个选项行的实际html,而不仅仅是返回语言字符串,但这使我感到很丑陋,所以我希望有一个更优雅的解决方案。

快速解决比较EL中两个字符串的最佳方案是什么?

J2EE 1.4教程


阅读 267

收藏
2020-06-08

共1个答案

一尘不染

表达式语言中,您可以仅使用==eq运算符比较对象值。他们实际上将在幕后使用Object#equals()。这样做是因为,直到使用当前的EL
2.1版本,您才能调用具有除标准getter(和setter)方法以外的其他签名的方法(在即将到来的EL 2.2中是可能的)。

所以特别的线

<c:when test="${lang}.equals(${pageLang})">

应该写成(请注意,整个表达式位于{和内}

<c:when test="${lang == pageLang}">

或者,等效地

<c:when test="${lang eq pageLang}">

两者都在幕后,大致解释为

jspContext.findAttribute("lang").equals(jspContext.findAttribute("pageLang"))

如果要比较常String量值,则需要引用它

<c:when test="${lang == 'en'}">

或者,等效地

<c:when test="${lang eq 'en'}">

这是幕后的大致解释为

jspContext.findAttribute("lang").equals("en")
2020-06-08