如何比较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 个字母字符串比较情况下工作除外。然后你应该使用 &&
或||
添加多个测试条件(即多个)?【参考方案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)