Как проверить, содержит ли строка значение в EL?
У меня есть список String и я устанавливаю его в сеанс:
session.setAttribute("datas", result.getBody().getDatas());
Затем я хочу проверить JSP, если в атрибуте datas не содержится слово "яблоко", например. Если это не содержится, распечатать сообщение не будет. Сначала я попытался сделать что-то вроде этого:
<c:forEach items="${datas}" var="data">
<c:if test="${data!='apple'}">
<p> Doesn't contained</p>
</c:if>
<c:for>
Но вышеупомянутый код, если сеанс содержит следующие значения:
Apple,
Банан
Лимонный
Дважды печатает сообщение "Не содержит". Я знаю, что это нормально, но как я могу это сделать, чтобы сделать то, что хочу?
Ответы
Ответ 1
Тест !=
для точного неравенства. Вам нужно использовать fn:contains()
или fn:containsIgnoreCase()
.
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
...
<c:forEach items="${datas}" var="data">
<c:if test="${not fn:containsIgnoreCase(data, 'apple')}">
<p>Doesn't contain 'apple'</p>
</c:if>
</c:forEach>
Ответ 2
Вам понадобится fn: toLowerCase():
<c:forEach items="${datas}" var="data">
<c:if test="${fn:toLowerCase(data) ne 'apple'}">
<p>Doesn't contain</p>
</c:if>
</c:forEach>
Использование fn: containsIgnoreCase() будет проверять частичное совпадение (наличие подстроки в заданной строке). Поэтому, если вы были данными [ "Ананас", "Банан", "Лимон" ], например, вы также получите совпадение. Я предполагаю, что вы хотите только сопоставить "яблоко" как полную строку.