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

Posted

技术标签:

【中文标题】如何比较EL表达式语言中的两个对象变量?【英文标题】:How to compare two object variables in EL expression language? 【发布时间】:2010-12-26 10:18:27 【问题描述】:

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

<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 中快速修复比较两个字符串的最佳方案是什么?

The J2EE 1.4 Tutorial

【问题讨论】:

【参考方案1】:

在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")

【讨论】:

我假设我可以在那里使用test="$lang eq 'en'" then too? I see eq`,但它不是字符串常量吗?只是确保,我不经常使用 JSTL/表达式语言 @Sucker:eq== 的别名。他们做的完全一样。另请参阅operators in EL。 它在 1 个字母字符串比较情况下工作除外。然后你应该使用 (简单交换双引号)struts.apache.org/release/2.0.x/docs/… @exoddus:请不要将 OGNL 与 EL 混淆。 您能否也举例说明如何在测试子句中使用&amp;&amp;|| 添加多个测试条件(即多个)?【参考方案2】:

不确定我是否正确,但最简单的方法是:

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

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

HTH

【讨论】:

嘿,我想你在这里比较一个字符串和一个'常量'字符串? languageBean.locale == 'en'?而我正在比较两个变量,因此 '==' 将不起作用,因为它会比较指针。谢谢,CJ 但实际上,部分正确,因为 BalusC 解释说,“==”毕竟是正确的运算符,我可以使用它! “快速复制和粘贴”代码 sn-ps 没有真正了解他们所做的事情是非常有害的,并且不会让自己受到很大的尊重。我建议不要这样做。这同样适用于将 JSF 与 JSTL 混合,就像您在代码 sn-p 中表示的那样,但这是另一回事。 @BalusC: JSF 和 JSTL 一起使用有问题吗? JSF 不是比 JSTL 更高级的框架吗?

以上是关于如何比较EL表达式语言中的两个对象变量?的主要内容,如果未能解决你的问题,请参考以下文章

java web006——表达式语言(Expression Language,EL)

JSP中的EL语言

EL表达式语言

EL表达式语言总结

如何将servlet中的变量在jsp页面中显示---jsp中的EL表达式

JSP中的EL