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

45

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

<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>

.equals在EL中似乎不存在。通过查看这里,建议我编写自己的函数,然后导入并使用它。由于这只是针对此页面的一次性小事情,我不想为此开始创建库等等。我也不想开始创建专门的对象让servlet返回带有此额外信息的对象。

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

比较两个字符串的EL最佳快速修复计划是什么?

J2EE 1.4教程

2个回答

106

Expression Language 中,您可以使用 ==eq 运算符来比较对象值。在幕后,它们实际上使用的是 Object#equals()。采用这种方式是因为,在当前的 EL 2.1 版本中,您无法调用具有与标准 getter (和 setter) 方法不同签名的方法(在即将推出的 EL 2.2 中将会支持)。

同时,您需要确保整个表达式都放置在同一个 ${...} 范围内。任何在范围之外的内容都不会被解释为 EL 表达式的一部分。

所以特定的行:

<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
我可以假设我也可以使用 test="${lang eq 'en'}" 吗?我看到上面有 eq,但它不是与字符串常量一起使用的吗?只是想确保一下,因为我并不经常使用JSTL/表达式语言。 - mswieboda
1
@Sucker:eq==的别名。它们的作用完全相同。请参见EL运算符 - BalusC
它可以正常工作,除了在比较一个字符的字符串时。这时你应该使用<c:when test='${lang eq "e"}'>(将简单引号换成双引号)。http://struts.apache.org/release/2.0.x/docs/why-wont-the-if-tag-evaluate-a-one-char-string.html - exoddus
@exoddus:请不要将OGNL与EL混淆。 - BalusC
你能否举个例子说明如何在测试条件中使用 &&|| 添加多个测试条件(即多于一个)? - KNU
@BalusC <c:if test="${game_type == 'board game'} || ${game_type == 'outdoor game'}"> 这样写是正确的吗? - KNU

3

不确定我是否理解您的意思,但最简单的方法是:

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

这只是我一个应用程序中的快速复制和粘贴...

希望对你有帮助


嗨,我认为你在这里将一个字符串与“常量”字符串进行比较? languageBean.locale == 'en'?而我正在比较两个变量,因此“==”不起作用,因为它会比较指针。谢谢,CJ - Caroline
但实际上,BalusC解释说'=='才是正确的运算符,我可以使用它! - Caroline
3
只是简单地“复制粘贴”代码片段而不真正理解它们的作用非常有害,也不会让自己受到尊重。我建议不要这样做。同样适用于将JSF与JSTL混合使用的方式,就像你在代码片段中展示的那样,但这是另一个故事。 - BalusC
@BalusC:在使用JSF和JSTL时有问题吗?JSF不是比JSTL更高级的框架吗? - Mr. Shiny and New 安宇

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接