我有一个非常简单的自定义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
,它可以正常工作,但这确实无法解决问题。
答案 0 :(得分:1)
找到解决方案。我需要在我的标签属性上明确声明类型,例如:
<%@ attribute name="currentPage" required="true" type="java.lang.Long" %>
<%@ attribute name="totalPages" required="true" type="java.lang.Long" %>
我怀疑没有声明的类型,两个属性都被解释为字符串,并且标记正在对数字的字符串值进行字典比较。我假设文字值10
有效,因为JSP解释器将其识别为正确的数字类型,然后自动将比较中的其他参数转换为匹配。
长话短说,总是在您的代码属性上声明type
。否则会发生很混乱的事情。