在使用Thymeleaf进行分页时,如何优雅地保留过滤器参数?

时间:2015-08-04 21:09:07

标签: spring-mvc pagination thymeleaf

在我的许多页面上,我有几个选项可以对结果的长列表进行排序或过滤。

当有人浏览数据时,我希望正确保留这些选择。例如:

  1. 开始查看所有门票的列表。 (/tickets
  2. 搜索“foo”等所有门票。 (/tickets?query=foo
  3. 转到下一页。 (/tickets?query=foo&page=2
  4. 请查看“foo”等票据的下一页,而不是“所有票证”的第2页。 (例如,不是/tickets?page=2
  5. 在JSP中,我提出了这样的解决方案:

    <c:if test="${page.hasNext()}">
        <spring:url value="" var="nextLink">
            <c:forEach items="${param}" var="curParam">
                <c:if test="${curParam.key != 'page'}">
                    <spring:param name="${curParam.key}" value="${curParam.value}"/>
                </c:if>
            </c:forEach>
            <spring:param name="page" value="${page.nextPageable().pageNumber}"/>
        </spring:url>
        <li>
            <a href="${nextLink}" aria-label="Next">
                <span aria-hidden="true">&raquo;</span>
            </a>
        </li>
    </c:if>
    

    这基本上构造了一个指向与当前页面相同路径的新URL,但是将“path”参数添加/替换为它的查询参数。

    在JSP中它很丑陋,但我在Thymeleaf看不到真正做到这一点的方法吗?

    或者,也许有一些更好的方法可以使用我还没有遇到过的Spring或Thymeleaf功能吗?

    我希望有一个简洁的Thymeleaf片段,我可以在任何需要分页的地方重复使用。到目前为止,这就是我所拥有的,但它最终错过了缺少“查询”参数等等。(我不想在这里对查询参数进行硬编码,因为这会限制此分页代码的可重用性)< / p>

    <li th:if="${page.hasNext()}">
        <a href="pagination.html" th:href="@{''(page=${page.nextPageable().pageNumber})}" aria-label="next">
            <span aria-hidden="true">&raquo;</span>
        </a>
    </li>
    

2 个答案:

答案 0 :(得分:1)

也许这对于将HTML和Spring与Thymeleaf一起使用的人很有用。

在我的情况下,我在春天使用百里香叶。我有一个DTO作为过滤器,控制器中使用它来进行过滤。

public class Controller {
        private final int BUTTONS_TO_SHOW = 5;

        public String home(FilterDTO filterDTO @PageableDefault(size = 50) Pageable pageable, Model model){
          List<YourEntity> rows = YourEntityService.findAll();
          Pager pager = new Pager(rows.getTotalPages(), rows.getNumber(), BUTTONS_TO_SHOW);

          model.addAttribute("rows", rows);
          model.addAttribute("pager", pager);
          model.addAttribute("filterDTO", filterDTO);

          return "your-template";
        }
}

和这样的分页器:

<nav style="display: inline-block">
    <ul class="pagination">
      <li th:class="page-item" th:classappend="${rows.number == 0} ? ''">
        <a class="page-link" th:href="@{${#httpServletRequest.requestURI+'?'+filterDTO.toQueryString()}(page=0)}">&laquo;</a>
      </li>
      <li th:class="page-item" th:classappend="${rows.number == 0} ? ''">
        <a class="page-link" th:href="@{${#httpServletRequest.requestURI+'?'+filterDTO.toQueryString()}(page=${rows.number - 1})}">&larr;</a>
      </li>
      <li th:class="page-item" th:classappend="${rows.number == (page - 1)} ? 'active pointer-disabled'"
          th:each="page : ${#numbers.sequence(pager.startPage, pager.endPage)}">
        <a class="page-link" th:href="@{${#httpServletRequest.requestURI+'?'+filterDTO.toQueryString()}(page=${page - 1})}" th:if="${page != 0}"
           th:text="${page}"></a>
      </li>
      <li th:class="page-item" th:classappend="${rows.number + 1 == rows.totalPages or pager.endPage == 0} ? ''">
        <a class="page-link"
           th:href="@{${#httpServletRequest.requestURI+'?'+filterDTO.toQueryString()}(page=${rows.number + 1})}">&rarr;</a>
      </li>
      <li th:class="page-item" th:classappend="${rows.number + 1 == rows.totalPages or pager.endPage == 0} ? ''">
        <a class="page-link"
           th:href="@{${#httpServletRequest.requestURI+'?'+filterDTO.toQueryString()}(page=${rows.totalPages - 1})}">&raquo;</a>
      </li>
    </ul>
  </nav>

,并且在FilterDTO类中,我实现了方法:toQueryString(),该方法返回带有应用的过滤器的查询字符串。

答案 1 :(得分:0)

蒲公英数据表是一个可以帮助你不重新发明轮子的项目。 http://dandelion.github.io/components/datatables/