如何比较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