我有一个非常简单的自定义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)之后。转到上一页的链接在每个页面上均正常工作。我还从调试块中获得了一些真正奇怪的输出:
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
currentPage
totalPages
long
10 == true`什么?
更新资料
如果在比较totalPages中用文字替换它,它将正常工作10,但这确实不能解决问题。
10
找到解决方案。我需要在标签属性上明确声明类型,例如:
<%@ attribute name="currentPage" required="true" type="java.lang.Long" %> <%@ attribute name="totalPages" required="true" type="java.lang.Long" %>
我怀疑没有声明的类型,两个属性都被解释为字符串,并且标签在数字的字符串值之间进行了字典比较。我假定为字面值,10因为JSP解释器将其识别为正确的数字类型,然后自动将比较中的另一个参数转换为匹配值。
长话短说,总是type在标签属性上声明一个。否则,可能会发生令人困惑的事情。
type