由于前端框架书写分页比较繁琐,而且效率也不是很快,然后就想着使用java来实现分页逻辑,然后使用jsp的taglib功能自定义标签来实现。作用有二:1.效率快;2.前端开发快捷简单。
分页组件的主要元素有:页码、当前页标识(无链接)、上一页、下一页以及中间页的省略号。
分页简单逻辑:当前页为第一页则‘上一页’不显示;当前页为最后一页则‘下一页’不显示;上一页的页码为page-1,下一页的页码为page+1;显示最前两页、最后两页以及本页和本页的前后各四页(意思就是最大展示的页码数为13个,超过13页则使用省略号替代)。
分页所需参数:记录总数(用来计算页码数)、每页记录数(用来计算页码数)、当前页码(用来计算前后四页页码、用来判断是否显示上一页下一页等)、url模版(使用特殊字符标识来进行url页码替换等生成各页面对应的链接)
具体实现:
1.设计一个url格式化方法,专门用来生成页码对应的url
private static String formatUrl(String urlPattern, int page) {
return urlPattern.replaceAll("\\[page\\]", page + "");
}
有page来做替换标识,格式化url。
2.组装页码对象(将每一个页码都组装成一个对象,属性包括页码、显示名称、条状链接、是否有链接(因为当前页不跳转))
JSONObject page = new JSONObject();
page.put("pageNum", pageNum);
page.put("pageName", pageName);
page.put("pageUrl", pageUrl);
page.put("hasLink", hasLink);
list.add(page);
3.封装添加页码对象的方法、批量添加页码对象的方法和添加省略号页码对象的方法
添加页码对象方法把2中的代码包装起来即可。
批量添加页码对象方法:
private static void addPages(List<JSONObject> list, int from, int to, String urlPattern, int page) {
for (int p = from; p <= to; p++) {
//TODO
}
}
这个方法涉及到了添加哪几个页码对象,由from和to决定,如果from小于to的话则该方法不会添加页码对象
4.主方法,根据规则组装页码对象列表,然后根据规则组装分页html式的字符串返回
分几个部分添加页码对象:
上一页:
if (page > 1) {
addPage(pageList, page - 1, "上一页", formatUrl(urlPattern, page - 1), true);
}
前两页:
addPages(pageList, 1, 2, urlPattern, page);//pageList为整个分页对象列表;urlPattern为链接模版;page为当前页用于判断某个分页对象是否有链接
当前页前后各4页:
addPages(pageList, from, to, urlPattern, page);
末尾两页:
addPages(pageList, (int)Math.max(count - 1, min), count, urlPattern, page);//count为总记录数,min为3
下一页:
if (page < count) {
addPage(pageList, page + 1, "下一页", formatUrl(urlPattern, page + 1), true);
}
需要考虑的特殊情况: 1 2 .. 4 的情况,直接加个 3,而不是 ...和 39 40 ... 42 43 的情况,直接加个 41,而不是 ...(即最后可以连续显示5页)
5.就是将分页对象列表按照一定规则解析成html的字符串。