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>

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

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

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

J2EE 1.4 教程

4

2 回答 2

106

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

并且您需要确保将整个表达式放在同一${...}范围内。任何不被解释为 EL 表达式一部分的东西。

所以特定的行

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

应该写成(注意整个表达式在{and里面}

<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")
于 2009-12-14T13:23:01.193 回答
3

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

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

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

高温高压

于 2009-12-14T13:17:24.017 回答