使用JSTL比较字符串始终失败,请求技术帮助
关于JSTL字符串比较始终失败的问题
环境
- TOMCAT 7.0.47
- JRE6
已导入标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
代码示例
<c:forEach var="result" items="${resultList}"> <tr> <td>${result.DIV}</td> <td>${result.DIV_NAME}</td> <td>${result.STAFF_CODE}</td> <td>${result.STAFF_NAME}</td> <td> <c:choose> <c:when test="${result.STAFF_TYPE == 'DOC'}">DOCTOR</c:when> <c:when test="${result.STAFF_TYPE == 'RES'}">RESIDENT</c:when> <c:when test="${result.STAFF_TYPE == 'TRE'}">TRAINEE</c:when> <c:otherwise>no</c:otherwise> </c:choose> </td> <td>${result.STAFF_FLAG == 1 ? 'A' : (result.STAFF_FLAG == 2 ? 'B' : '其他')}</td> </tr> </c:forEach>
问题现象
result.STAFF_TYPE的比较逻辑始终不生效,所有条目都进入<c:otherwise>分支,页面显示"no"。但result.STAFF_FLAG的三目运算能正常工作,可按预期显示'A'、'B'或'其他'。
已尝试操作
- 将比较运算符从
==替换为eq,代码示例:
问题未解决。<c:when test="${result.STAFF_TYPE eq 'DOC'}">DOCTOR</c:when> - 在
<c:otherwise>中输出result.STAFF_TYPE,确认数据已正常接收,能正确显示'DOC'、'RES'、'TRE'。
解决建议
1. 处理字符串前后空白
如果STAFF_TYPE存在不可见的前后空格,会导致比较失败。可以使用JSTL函数库的trim()方法处理后再比较:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<c:when test="${fn:trim(result.STAFF_TYPE) eq 'DOC'}">DOCTOR</c:when> <c:when test="${fn:trim(result.STAFF_TYPE) eq 'RES'}">RESIDENT</c:when> <c:when test="${fn:trim(result.STAFF_TYPE) eq 'TRE'}">TRAINEE</c:when>
2. 检查数据类型并转为字符串
如果后端返回的STAFF_TYPE不是String类型(比如枚举、Character),直接与字符串字面量比较会失败。可以尝试调用toString()方法转换后再比较:
<c:when test="${result.STAFF_TYPE.toString() eq 'DOC'}">DOCTOR</c:when>
3. 显式调用equals方法
在EL表达式中直接调用字符串的equals()方法进行比较:
<c:when test="${result.STAFF_TYPE.equals('DOC')}">DOCTOR</c:when>
内容的提问来源于stack exchange,提问作者jun
相关产品推荐
相关产品推荐

