电信网站开发语言主要用什么,重庆旅游网站建设公司,腾讯云服务器centos做静态网站,山西建设厅官方网站公示Twitter Bootstrap具有非常好的分页UI #xff0c;在这里我将向您展示如何使用Spring Data Web分页功能和Thymeleaf条件评估功能来实现它。 引导程序中的标准分页 受Rdio启发的简单分页#xff0c;非常适合应用程序和搜索结果。 大块很难错过#xff0c;易于扩展#xff0… Twitter Bootstrap具有非常好的分页UI 在这里我将向您展示如何使用Spring Data Web分页功能和Thymeleaf条件评估功能来实现它。 引导程序中的标准分页 受Rdio启发的简单分页非常适合应用程序和搜索结果。 大块很难错过易于扩展并提供较大的点击区域。 从Bootstrap文档显示分页的原始源代码非常简单 div classpaginationullia href#Prev/a/lilia href#1/a/lilia href#2/a/lilia href#3/a/lilia href#4/a/lilia href#5/a/lilia href#Next/a/li/ul
/div 您可以看到这只是一个模拟代码要使其通过正确的超链接URL动态显示页码我需要对现有代码进行很多更改。 因此让我们从头开始先更改域层然后再更改应用程序服务层表示层。 最后是将它们粘合在一起的配置。 域层更改 域层的唯一更改是BlogPostRepository 。 在具有检索按publishedTime排序的publishedTime发布BlogPost列表的方法之前 public interface BlogPostRepository extends MongoRepositoryBlogPost, String{
...ListBlogPost findByPublishedIsTrueOrderByPublishedTimeDesc();
...
} 现在我们需要获取分页结果列表。 使用Spring Data Page 我们将返回PageBlogPost而不是ListBlogPost 并传递Pageable参数 public interface BlogPostRepository extends MongoRepositoryBlogPost, String{
...PageBlogPost findByPublishedIsTrueOrderByPublishedTimeDesc(Pageable pageable);
...
}应用程序服务层更改 只需使用BlogPostRepository新功能应用程序服务层的更改也非常简单 BlogService界面 public interface BlogService {
...PageBlogPost getAllPublishedPosts(Pageable pageable);
...
} BlogServiceImpl类 public class BlogServiceImpl implements BlogService {
...private final BlogPostRepository blogPostRepository;
...Overridepublic PageBlogPost getAllPublishedPosts(Pageable pageable) {PageBlogPost blogList blogPostRepository.findByPublishedIsTrueOrderByPublishedTimeDesc(pageable);return blogList;}
...
}表示层更改 Spring Data Page界面具有许多不错的功能来获取当前页码获取总页数等。但是仍然缺少让我仅显示总分页的部分页面范围的方法。 因此我创建了一个适配器类以使用其他功能包装Sprng数据页面接口。 public class PageWrapperT {public static final int MAX_PAGE_ITEM_DISPLAY 5;private PageT page;private ListPageItem items;private int currentNumber;private String url;public String getUrl() {return url;}public void setUrl(String url) {this.url url;}public PageWrapper(PageT page, String url){this.page page;this.url url;items new ArrayListPageItem();currentNumber page.getNumber() 1; //start from 1 to match page.pageint start, size;if (page.getTotalPages() MAX_PAGE_ITEM_DISPLAY){start 1;size page.getTotalPages();} else {if (currentNumber MAX_PAGE_ITEM_DISPLAY - MAX_PAGE_ITEM_DISPLAY/2){start 1;size MAX_PAGE_ITEM_DISPLAY;} else if (currentNumber page.getTotalPages() - MAX_PAGE_ITEM_DISPLAY/2){start page.getTotalPages() - MAX_PAGE_ITEM_DISPLAY 1;size MAX_PAGE_ITEM_DISPLAY;} else {start currentNumber - MAX_PAGE_ITEM_DISPLAY/2;size MAX_PAGE_ITEM_DISPLAY;}}for (int i 0; isize; i){items.add(new PageItem(starti, (starti)currentNumber));}}public ListPageItem getItems(){return items;}public int getNumber(){return currentNumber;}public ListT getContent(){return page.getContent();}public int getSize(){return page.getSize();}public int getTotalPages(){return page.getTotalPages();}public boolean isFirstPage(){return page.isFirstPage();}public boolean isLastPage(){return page.isLastPage();}public boolean isHasPreviousPage(){return page.hasPreviousPage();}public boolean isHasNextPage(){return page.hasNextPage();}public class PageItem {private int number;private boolean current;public PageItem(int number, boolean current){this.number number;this.current current;}public int getNumber(){return this.number;}public boolean isCurrent(){return this.current;}}
} 使用此PageWrapper 我们可以包装从BlogService返回的PageBlogPost并将其放入SpringMVC UI模型。 请参阅博客页面的控制器代码 Controller
public class BlogController
...RequestMapping(value /blog, method RequestMethod.GET)public String blog(Model uiModel, Pageable pageable) {PageWrapperBlogPost page new PageWrapperBlogPost(blogService.getAllPublishedPosts(pageable), /blog);uiModel.addAttribute(page, page);return blog;}
...
} Pageable是从PageableArgumentResolver传入的我将在后面解释。 另一个技巧是我还将视图URL传递给PageWrapper 它可用于在分页栏中构造Thymeleaf超链接。 由于我的PageWrapper非常通用因此我为分页栏创建了一个html片段因此当需要分页时可以将其用于应用程序页面中的任何位置。 该片段html使用Thymeleaf th:if根据链接是否被禁用来在静态文本或超链接之间动态切换。 并且它使用th:href构造具有正确页码和页面大小的URL。 !-- Pagination Bar --
div th:fragmentpaginationbardiv classpagination pagination-centeredulli th:class${page.firstPage}? disabled : span th:if${page.firstPage}← First/spana th:if${not page.firstPage} th:href{${page.url}(page.page1,page.size${page.size})}← First/a/lili th:class${page.hasPreviousPage}? : disabledspan th:if${not page.hasPreviousPage}«/spana th:if${page.hasPreviousPage} th:href{${page.url}(page.page${page.number-1},page.size${page.size})} titleGo to previous page«/a/lili th:eachitem : ${page.items} th:class${item.current}? active : span th:if${item.current} th:text${item.number}1/spana th:if${not item.current} th:href{${page.url}(page.page${item.number},page.size${page.size})}span th:text${item.number}1/span/a/lili th:class${page.hasNextPage}? : disabledspan th:if${not page.hasNextPage}»/spana th:if${page.hasNextPage} th:href{${page.url}(page.page${page.number1},page.size${page.size})} titleGo to next page»/a/lili th:class${page.lastPage}? disabled : span th:if${page.lastPage}Last →/spana th:if${not page.lastPage} th:href{${page.url}(page.page${page.totalPages},page.size${page.size})}Last →/a/li/ul/div
/divSpring配置变更 最后一步是将它们放在一起。 幸运的是在更新代码之前我做了一些研究。 Doug Haber 撰写了一篇非常不错的博客文章 其中介绍了Spring MVCSpring Data和Java Config 。 Doug在他的博客中提到了一些陷阱尤其是Pageable参数需要一些配置技巧 为了让Spring知道如何将参数转换为Pageable对象您需要配置HandlerMethodArgumentResolver。 Spring Data提供了一个PageableArgumentResolver但是它使用了旧的ArgumentResolver接口而不是新的Spring 3.1HandlerMethodArgumentResolver接口。 XML config可以为我们解决这种差异但是由于我们使用的是Java Config因此我们必须手动进行一些操作。 幸运的是如果您知道正确的魔术咒语就可以轻松解决此问题…… 道格·哈伯Doug Haber 在Doug的帮助下我将此参数解析器添加到了WebConfig类中 Configuration
EnableWebMvc
ComponentScan(basePackages com.jiwhiz.blog.web)
public class WebConfig extends WebMvcConfigurerAdapter {
...Overridepublic void addArgumentResolvers(ListHandlerMethodArgumentResolver argumentResolvers) {PageableArgumentResolver resolver new PageableArgumentResolver();resolver.setFallbackPagable(new PageRequest(1, 5));argumentResolvers.add(new ServletWebArgumentResolverAdapter(resolver));}
...
} 完成所有这些更改后我的博客列表的页面顶部和底部将具有分页栏并且它始终最多具有5个页码中间是当前编号并且已禁用。 分页栏还具有第一和开头以前的链接 然后在年底最后环节。 我还在管理页面用户列表和评论列表中使用了它并且效果很好。 参考来自Jiwhiz博客的JCG合作伙伴 Yuan Ji的Spring Data和Thymeleaf实现Bootstrap分页 。 翻译自: https://www.javacodegeeks.com/2013/03/implement-bootstrap-pagination-with-spring-data-and-thymeleaf.html