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

时间:2009-12-14 13:10:08

标签: jsp operators jstl el object-comparison

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

<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>
EL中似乎不存在

.equals。看了一下这里建议我编写自己的函数,然后导入并使用它。因为这只是针对此页面的一个小小的事情,我不想为此开始创建库等。我也不想开始为servlet创建专家对象,并在其中返回这些额外信息。

我唯一能想到的就是从servlet返回整个选项行的实际html,而不仅仅是语言字符串,但这让我觉得很难看,所以我希望有一个更优雅的解决方案。

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

The J2EE 1.4 Tutorial

2 个答案:

答案 0 :(得分:103)

Expression Language中,您只需使用==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")

答案 1 :(得分:3)

不确定我是否帮助你,但最简单的方法是:

<c:if test="${languageBean.locale == 'en'">
  <f:selectItems value="#{customerBean.selectableCommands_limited_en}" />
</c:if>

只需快速复制并粘贴我的应用程序......

HTH