如何比较ELexpression式语言中的两个对象variables?

我正在创build一个所有语言的下拉列表。 列表的默认语言select将由用户添加的信息决定:

<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中看起来不存在。 看过这里,build议我编写自己的函数,然后导入并使用它。 由于这是一个微小的东西只是为了这个页面,我不想为了这个而开始创build库等。 我也不想开始创buildservlet的专用对象来返回这些额外的信息。

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

在EL中比较两个string的最佳scheme是什么?

J2EE 1.4教程

在expression式语言中,您可以使用==eq运算符来比较对象值。 在幕后他们实际上会使用Object#equals() 。 这样做,因为直到现在的EL 2.1版本,你不能用标准的getter(和setter)方法调用其他签名的方法(在即将到来的EL 2.2中是可能的)。

所以特定的路线

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

应该写成(注意整个expression式在{}

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

不知道我是否正确,但最简单的方法是这样的:

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

只需从我的一个应用程序快速复制和粘贴…

HTH