【问题标题】:How to compare two object variables in EL expression language?如何比较EL表达式语言中的两个对象变量?
【发布时间】:2020-06-11 12:59:38
【问题描述】:

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

<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

【问题讨论】:

    标签: jsp operators jstl el object-comparison


    【解决方案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 更高级的框架吗?
    猜你喜欢
    • 2011-07-20
    • 2021-02-10
    • 2017-10-08
    相关资源
    最近更新 更多