Car*_*ine 44 jsp jstl el operators object-comparison
我正在创建所有语言的下拉列表.列表的默认语言选择将由用户添加的信息确定:
<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>
Run Code Online (Sandbox Code Playgroud)
.equals在EL中似乎不存在.看了一下这里建议我编写自己的函数,然后导入并使用它.因为这只是针对此页面的一个小小的事情,我不想为此开始创建库等.我也不想开始为servlet创建专家对象,并在其中返回这些额外信息.
我唯一能想到的就是从servlet返回整个选项行的实际html,而不仅仅是语言字符串,但这让我觉得很难看,所以我希望有一个更优雅的解决方案.
快速修复EL中两个字符串的最佳方案是什么?
Bal*_*usC 103
在表达式语言中,您只需使用==或eq运算符来比较对象值.在幕后,他们将实际使用Object#equals().这样做是这样的,因为除了当前的EL 2.1版本之外,你不能使用其他签名来调用带有标准getter(和setter)方法的方法(在即将发布的EL 2.2中,它是可能的).
所以特定的路线
<c:when test="${lang}.equals(${pageLang})">
Run Code Online (Sandbox Code Playgroud)
应该写成(注意整个表达式都在{和里面})
<c:when test="${lang == pageLang}">
Run Code Online (Sandbox Code Playgroud)
或者,等效地
<c:when test="${lang eq pageLang}">
Run Code Online (Sandbox Code Playgroud)
两者都在幕后粗略解释为
jspContext.findAttribute("lang").equals(jspContext.findAttribute("pageLang"))
Run Code Online (Sandbox Code Playgroud)
如果要比较常String量值,则需要引用它
<c:when test="${lang == 'en'}">
Run Code Online (Sandbox Code Playgroud)
或者,等效地
<c:when test="${lang eq 'en'}">
Run Code Online (Sandbox Code Playgroud)
幕后花絮粗略地解释为
jspContext.findAttribute("lang").equals("en")
Run Code Online (Sandbox Code Playgroud)