JSP / JSTL: «2> 10» оценивается как истинное - PullRequest
1 голос
/ 14 июля 2011

У меня есть очень простой пользовательский тег JSP, который я использую для генерации ссылок на страницы.Это выглядит примерно так:

<span id="${id}" class="paginationLinks ${cssClass}">
    <c:if test="${currentPage gt 1}">
        <!-- Links to previous page(s) -->
    </c:if>
    <span class="paginationCurrentPage">
        Page ${currentPage} 
        [DEBUG:  current=${currentPage}, 
                 total=${totalPages}, 
                 show=${currentPage lt totalPages} 
                 inverse=${currentPage gt totalPages}]
    </span>
    <c:if test="${currentPage lt totalPages}">
         <!-- Links to next page(s) -->
    </c:if>
</span>

Проблема в том, что ссылки для перехода на следующую страницу не отображаются после первой страницы (currentPage = 1).Ссылки на предыдущие страницы работают правильно на каждой странице.Я также получаю некоторые действительно странные выходные данные из моего блока отладки:

[DEBUG: current=1, total=10, show=true inverse=false]    //first page, correct
[DEBUG: current=2, total=10, show=false inverse=true]    //second page; 2 > 10 == true?  wtf???
[DEBUG: current=9, total=10, show=false inverse=true]    //ninth page, still incorrect
[DEBUG: current=10, total=10, show=false inverse=false]  //tenth page, correct

Оба currentPage и totalPages являются атрибутами запроса типа long и передаются тегу через объявленные атрибуты тега.Так что же я сделал не так, чтобы создать такой безумный вывод, как 2 > 10 == true?

Обновление

Это работает правильно, если я заменю totalPages на литерал 10в сравнении, но это действительно не решает проблему.

1 Ответ

1 голос
/ 14 июля 2011

Решение найдено.Мне нужно было явно объявить тип в моих атрибутах тега, например:

<%@ attribute name="currentPage" required="true" type="java.lang.Long" %>
<%@ attribute name="totalPages" required="true" type="java.lang.Long" %>

Я подозреваю, что без объявленного типа оба атрибута интерпретировались как строки, и тег выполнял лексикографическое сравнение между строковыми значениямииз чисел.Я предполагаю, что буквальное значение 10 сработало, потому что интерпретатор JSP распознал его как правильный числовой тип, а затем автоматически преобразовал другой аргумент в сравнении для сопоставления.

Итак, короче говоря, всегда объявляйте type в атрибутах вашего тега.В противном случае могут произойти очень запутанные вещи.

...