关于分页的处理

public class UserReportVo {
private String uid;
/**
* 分页对象
*/
private Page<UserReportVo> page;

public Page<UserReportVo> getPage() {
return page;
}
public void setPage(Page<UserReportVo> page) {
this.page = page;
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}

}

public class Page<T> {

protected int pageNo = 1; // 当前页码
protected int pageSize = Integer.valueOf(Global.getConfig("page.pageSize")); // 页面大小,设置为“-1”表示不进行分页(分页无效)

protected long count;// 总记录数,设置为“-1”表示不查询总数

protected int first;// 首页索引
protected int last;// 尾页索引
protected int prev;// 上一页索引
protected int next;// 下一页索引

private boolean firstPage;//是否是第一页
private boolean lastPage;//是否是最后一页

protected int length = 8;// 显示页面长度
protected int slider = 1;// 前后显示页面长度

private List<T> list = new ArrayList<T>();

private String orderBy = ""; // 标准查询有效, 实例: updatedate desc, name asc

protected String funcName = "page"; // 设置点击页码调用的js函数名称,默认为page,在一页有多个分页对象时使用。

protected String funcParam = ""; // 函数的附加参数,第三个参数值。

private String message = ""; // 设置提示消息,显示在“共n条”之后

public Page() {
this.pageSize = -1;
}

/**
* 构造方法
* @param request 传递 repage 参数,来记住页码
* @param response 用于设置 Cookie,记住页码
*/
public Page(HttpServletRequest request, HttpServletResponse response){
this(request, response, -2);
}

/**
* 构造方法
* @param request 传递 repage 参数,来记住页码
* @param response 用于设置 Cookie,记住页码
* @param defaultPageSize 默认分页大小,如果传递 -1 则为不分页,返回所有数据
*/
public Page(HttpServletRequest request, HttpServletResponse response, int defaultPageSize){
// 设置页码参数(传递repage参数,来记住页码)
String no = request.getParameter("pageNo");
if (StringUtils.isNumeric(no)){
CookieUtils.setCookie(response, "pageNo", no);
this.setPageNo(Integer.parseInt(no));
}else if (request.getParameter("repage")!=null){
no = CookieUtils.getCookie(request, "pageNo");
if (StringUtils.isNumeric(no)){
this.setPageNo(Integer.parseInt(no));
}
}
// 设置页面大小参数(传递repage参数,来记住页码大小)
String size = request.getParameter("pageSize");
if (StringUtils.isNumeric(size)){
CookieUtils.setCookie(response, "pageSize", size);
this.setPageSize(Integer.parseInt(size));
}else if (request.getParameter("repage")!=null){
no = CookieUtils.getCookie(request, "pageSize");
if (StringUtils.isNumeric(size)){
this.setPageSize(Integer.parseInt(size));
}
}else if (defaultPageSize != -2){
this.pageSize = defaultPageSize;
}
// 设置排序参数
String orderBy = request.getParameter("orderBy");
if (StringUtils.isNotBlank(orderBy)){
this.setOrderBy(orderBy);
}
}

/**
* 构造方法
* @param pageNo 当前页码
* @param pageSize 分页大小
*/
public Page(int pageNo, int pageSize) {
this(pageNo, pageSize, 0);
}

/**
* 构造方法
* @param pageNo 当前页码
* @param pageSize 分页大小
* @param count 数据条数
*/
public Page(int pageNo, int pageSize, long count) {
this(pageNo, pageSize, count, new ArrayList<T>());
}

/**
* 构造方法
* @param pageNo 当前页码
* @param pageSize 分页大小
* @param count 数据条数
* @param list 本页数据对象列表
*/
public Page(int pageNo, int pageSize, long count, List<T> list) {
this.setCount(count);
this.setPageNo(pageNo);
this.pageSize = pageSize;
this.list = list;
}

/**
* 初始化参数
*/
public void initialize(){

//1
this.first = 1;

this.last = (int)(count / (this.pageSize < 1 ? 20 : this.pageSize) + first - 1);

if (this.count % this.pageSize != 0 || this.last == 0) {
this.last++;
}

if (this.last < this.first) {
this.last = this.first;
}

if (this.pageNo <= 1) {
this.pageNo = this.first;
this.firstPage=true;
}

if (this.pageNo >= this.last) {
this.pageNo = this.last;
this.lastPage=true;
}

if (this.pageNo < this.last - 1) {
this.next = this.pageNo + 1;
} else {
this.next = this.last;
}

if (this.pageNo > 1) {
this.prev = this.pageNo - 1;
} else {
this.prev = this.first;
}

//2
if (this.pageNo < this.first) {// 如果当前页小于首页
this.pageNo = this.first;
}

if (this.pageNo > this.last) {// 如果当前页大于尾页
this.pageNo = this.last;
}

}

/**
* 默认输出当前分页标签
* <div class="page">${page}</div>
*/
@Override
public String toString() {

StringBuilder sb = new StringBuilder();
sb.append("<div class=\"span5\" style=\"display: inline;\">");
long startIndex = (pageNo-1)*pageSize + 1;
long endIndex = pageNo*pageSize <=count? pageNo*pageSize:count;

sb.append("<div class=\"dataTables_info\">");
sb.append("<span >显示第 "+startIndex+" 到第 "+ endIndex +" 条,总共 "+count+" 条</span>");
sb.append("<span >每页显示 <span class=\"btn-group dropup\">");
sb.append("<button type=\"button\" class=\"btn btn-default btn-outline dropdown-toggle\" data-toggle=\"dropdown\" aria-expanded=\"false\">");
sb.append("<span class=\"page-size\">"+pageSize+"</span> <span class=\"caret\"></span>");
sb.append("</button>");
sb.append("<ul class=\"dropdown-menu\" role=\"menu\">");
sb.append("<li class=\""+getSelected(pageSize,10)+ "\"><a href=\"javascript:"+funcName+"("+pageNo+",10,‘"+funcParam+"‘);\">10</a></li>");
sb.append("<li class=\""+getSelected(pageSize,25)+ "\"><a href=\"javascript:"+funcName+"("+pageNo+",25,‘"+funcParam+"‘);\">25</a></li>");
sb.append("<li class=\""+getSelected(pageSize,50)+ "\"><a href=\"javascript:"+funcName+"("+pageNo+",50,‘"+funcParam+"‘);\">50</a></li>");
sb.append("<li class=\""+getSelected(pageSize,100)+ "\"><a href=\"javascript:"+funcName+"("+pageNo+",100,‘"+funcParam+"‘);\">100</a></li>");
sb.append("</ul>");
sb.append("</span> 条记录</span>");
sb.append("</div>");
sb.append("</div>");

sb.append("<div class=\"span7\" style=\"display: inline;\">");
sb.append("<div class=\"dataTables_paginate paging_bootstrap pagination\">");
sb.append("<ul class=\"pagination pagination-outline\">");
if (pageNo == first) {// 如果是首页
sb.append("<li class=\"prev disabled\"><a href=\"javascript:\">首页</a></li>\n");
sb.append("<li class=\"prev disabled\"><a href=\"javascript:\">上一页</a></li>\n");
} else {
sb.append("<li class=\"prev\"><a href=\"javascript:\" onclick=\""+funcName+"("+first+","+pageSize+",‘"+funcParam+"‘);\">"
+ "首页></a></li>\n");
sb.append("<li class=\"prev\"><a href=\"javascript:\" onclick=\""+funcName+"("+prev+","+pageSize+",‘"+funcParam+"‘);\">"
+ "上一页</a></li>\n");
}

int begin = pageNo - (length / 2);

if (begin < first) {
begin = first;
}

int end = begin + length - 1;

if (end >= last) {
end = last;
begin = end - length + 1;
if (begin < first) {
begin = first;
}
}

if (begin > first) {
int i = 0;
for (i = first; i < first + slider && i < begin; i++) {
sb.append("<li><a href=\"javascript:\" onclick=\""+funcName+"("+i+","+pageSize+",‘"+funcParam+"‘);\">"
+ (i + 1 - first) + "</a></li>\n");
}
if (i < begin) {
sb.append("<li><a href=\"javascript:\">...</a></li>\n");
}
}

for (int i = begin; i <= end; i++) {
if (i == pageNo) {
sb.append("<li class=\"active\"><a href=\"javascript:\">" + (i + 1 - first)
+ "</a></li>\n");
} else {
sb.append("<li><a href=\"javascript:\" onclick=\""+funcName+"("+i+","+pageSize+",‘"+funcParam+"‘);\">"
+ (i + 1 - first) + "</a></li>\n");
}
}

if (last - end > slider) {
sb.append("<li class=\"disabled\"><a href=\"javascript:\">...</a></li>\n");
end = last - slider;
}

for (int i = end + 1; i <= last; i++) {
sb.append("<li><a href=\"javascript:\" onclick=\""+funcName+"("+i+","+pageSize+",‘"+funcParam+"‘);\">"
+ (i + 1 - first) + "</a></li>\n");
}

if (pageNo == last) {
sb.append("<li class=\"next disabled\"><a href=\"javascript:\">下一页</a></li>\n");
sb.append("<li class=\"next disabled\"><a href=\"javascript:\">尾页</a></li>\n");
} else {
sb.append("<li class=\"next\"><a href=\"javascript:\" onclick=\""+funcName+"("+next+","+pageSize+",‘"+funcParam+"‘);\">"
+ "下一页</a></li>\n");
sb.append("<li class=\"next\"><a href=\"javascript:\" onclick=\""+funcName+"("+last+","+pageSize+",‘"+funcParam+"‘);\">"
+ "尾页</a></li>\n");
}

sb.append("</ul>");
sb.append("</div>");
sb.append("</div>");
sb.append("</div>");
return sb.toString();
}

protected String getSelected(int pageNo, int selectedPageNo){
if(pageNo == selectedPageNo){
//return "selected";
return "active";
}else{
return "";
}

}
/**
* 获取分页HTML代码
* @return
*/
public String getHtml(){
return toString();
}

/**
* 获取设置总数
* @return
*/
public long getCount() {
return count;
}

/**
* 设置数据总数
* @param count
*/
public void setCount(long count) {
this.count = count;
if (pageSize >= count){
pageNo = 1;
}
}

/**
* 获取当前页码
* @return
*/
public int getPageNo() {
return pageNo;
}

/**
* 设置当前页码
* @param pageNo
*/
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}

/**
* 获取页面大小
* @return
*/
public int getPageSize() {
return pageSize;
}

/**
* 设置页面大小(最大500)
* @param pageSize
*/
public void setPageSize(int pageSize) {
this.pageSize = pageSize <= 0 ? 10 : pageSize;// > 500 ? 500 : pageSize;
}

/**
* 首页索引
* @return
*/
@JsonIgnore
public int getFirst() {
return first;
}

/**
* 尾页索引
* @return
*/
@JsonIgnore
public int getLast() {
return last;
}

/**
* 获取页面总数
* @return getLast();
*/
@JsonIgnore
public int getTotalPage() {
return getLast();
}

/**
* 是否为第一页
* @return
*/
@JsonIgnore
public boolean isFirstPage() {
return firstPage;
}

/**
* 是否为最后一页
* @return
*/
@JsonIgnore
public boolean isLastPage() {
return lastPage;
}

/**
* 上一页索引值
* @return
*/
@JsonIgnore
public int getPrev() {
if (isFirstPage()) {
return pageNo;
} else {
return pageNo - 1;
}
}

/**
* 下一页索引值
* @return
*/
@JsonIgnore
public int getNext() {
if (isLastPage()) {
return pageNo;
} else {
return pageNo + 1;
}
}

/**
* 获取本页数据对象列表
* @return List<T>
*/
public List<T> getList() {
return list;
}

/**
* 设置本页数据对象列表
* @param list
*/
public Page<T> setList(List<T> list) {
this.list = list;
initialize();
return this;
}

/**
* 获取查询排序字符串
* @return
*/
@JsonIgnore
public String getOrderBy() {
// SQL过滤,防止注入
String reg = "(?:‘)|(?:--)|(/\\*(?:.|[\\n\\r])*?\\*/)|"
+ "(\\b(select|update|and|or|delete|insert|trancate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute)\\b)";
Pattern sqlPattern = Pattern.compile(reg, Pattern.CASE_INSENSITIVE);
if (sqlPattern.matcher(orderBy).find()) {
return "";
}
return orderBy;
}

/**
* 设置查询排序,标准查询有效, 实例: updatedate desc, name asc
*/
public void setOrderBy(String orderBy) {
this.orderBy = orderBy;
}

/**
* 获取点击页码调用的js函数名称
* function ${page.funcName}(pageNo){location="${ctx}/list-${category.id}${urlSuffix}?pageNo="+i;}
* @return
*/
@JsonIgnore
public String getFuncName() {
return funcName;
}

/**
* 设置点击页码调用的js函数名称,默认为page,在一页有多个分页对象时使用。
* @param funcName 默认为page
*/
public void setFuncName(String funcName) {
this.funcName = funcName;
}

/**
* 获取分页函数的附加参数
* @return
*/
@JsonIgnore
public String getFuncParam() {
return funcParam;
}

/**
* 设置分页函数的附加参数
* @return
*/
public void setFuncParam(String funcParam) {
this.funcParam = funcParam;
}

/**
* 设置提示消息,显示在“共n条”之后
* @param message
*/
public void setMessage(String message) {
this.message = message;
}

/**
* 分页是否有效
* @return this.pageSize==-1
*/
@JsonIgnore
public boolean isDisabled() {
return this.pageSize==-1;
}

/**
* 是否进行总数统计
* @return this.count==-1
*/
@JsonIgnore
public boolean isNotCount() {
return this.count==-1;
}

/**
* 获取 Hibernate FirstResult
*/
public int getFirstResult(){
int firstResult = (getPageNo() - 1) * getPageSize();
if (firstResult >= getCount()) {
firstResult = 0;
}
return firstResult;
}
/**
* 获取 Hibernate MaxResults
*/
public int getMaxResults(){
return getPageSize();
}
}

// 封装查询对象
UserReportVo userReportVo = new UserReportVo();
userReportVo.setUid(uid);
// 封装分页对象
Page<UserReportVo> page = new Page<UserReportVo>(pageNo,pageSize);
userReportVo.setPage(page);
List<UserReportVo> uVo =userService.getAllUserReportByUid(userReportVo);

时间: 2025-01-06 14:33:01

关于分页的处理的相关文章

python__Django 分页

自定义分页的类: #!/usr/bin/env python # -*- coding: utf-8 -*- # Created by Mona on 2017/9/20 from django.utils.safestring import mark_safe class Paginator: ''' 页码的格式依赖于bootstrap: 使用案例: from django.shortcuts import render,redirect,HttpResponse from app01.mod

ajax+分页

<!DOCTYPE html><html><head lang="zh-cn"><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"><meta http-equiv="X-UA-Compat

使用插件bootstrap-table实现表格记录的查询、分页、排序等处理

在业务系统开发中,对表格记录的查询.分页.排序等处理是非常常见的,在Web开发中,可以采用很多功能强大的插件来满足要求,且能极大的提高开发效率,本随笔介绍这个bootstrap-table是一款非常有名的开源表格插件,在很多项目中广泛的应用.Bootstrap-table插件提供了非常丰富的属性设置,可以实现查询.分页.排序.复选框.设置显示列.Card view视图.主从表显示.合并列.国际化处理等处理功能,而且该插件同时也提供了一些不错的扩展功能,如移动行.移动列位置等一些特殊的功能,插件可

优化LIMIT分页

在系统中需要分页的操作通常会使用limit加上偏移量的方法实现,同时加上合适的order by 子句.如果有对应的索引,通常效率会不错,否则MySQL需要做大量的文件排序操作. 一个非常令人头疼问题就是当偏移量非常大的时候,例如可能是limit 10000,20这样的查询,这是mysql需要查询10020条然后只返回最后20条,前面的10000条记录都将被舍弃,这样的代价很高.如果所有的页面被访问的频率相同,那么这样的查询平均需要访问半个表的数据.要优化这样的查询,要么实在页面中限制分页的数量,

Ajax实现无刷新分页

注:本文中使用到的一些类库在前面文章都能找到源代码,我会在文中指明链接所在,为了缩短文章篇幅,由此带来的阅读不便,敬请谅解. 本文讲解 Ajax 实现无刷新分页.实现原理.代码展示.代码下载. 这里需要说明一些知识: 1.Ajax 无刷新页面的好处:提供良好的客户体验,通过 Ajax 在后台从数据库中取得数据并展示,取缔了等待加载页面而出现的空白状态: 2.那么,Ajax 无刷新页面是运行在动态页面(.PHP)?还是静态页面(.html/.htm/.shtml)?答案是:静态页面: 3.实现原理

关于分页SQL的小总结

findPage 和findPageTotal条件分页中的条件 较为复杂点的关联查询 有取别名的 <select id="findPage" resultMap="MinOrderInfo" parameterType="map"> SELECT o.*,w.name buyName,w.MOBILE buyMobile,aa.name sellName,aa.MOBILE sellMobile,rs.CAR_BRAND_NAME c

webform:分页组合查询

一个简单的分页组合查询页面 /// <summary> /// 查询方法 /// </summary> /// <param name="tsql">SQL语句</param> /// <param name="hh">哈希表</param> /// <returns></returns> public List<Goods> Select(string un

TODO:数据库优化之分页

本文的例子是以MongoDB数据库为准,其它数据库各位也可以举一反三进行优化. 在MongoDB中分页使用 a.skip(n)跳过前n个匹配的文档: b.limit(m)返回m个结果,要是匹配的结果不到m个,则返回匹配数据量的结果,m是指定上限数量,而不是下限数量: c.sort({"name": 1,"address":-1}),1表示升序,-1表示降序. 使用skip跳过少量的文档还可以.但是数据量非常多的话,skip就会变得非常慢,每个数据库都会有这种情况,所

WebForm 分页与组合查询

1.封装实体类 2.写查询方法 //SubjectData类 public List<Subject> Select(string name) { List<Subject> list = new List<Subject>(); cmd.CommandText = "select *from Subject where SubjectName like @a "; cmd.Parameters.Clear(); cmd.Parameters.Add

easymall项目的商品删除,前台商品分页,商品详情,购物车模块

简单的挑选一下昨天所学的重点知识模块,以备后续的复习 一.购物车模块1.1购物车两种实现的区别:!!!!!!!! 用session保存  缺点:浏览器关闭,session失效时保存在session中购物信息将会消失  后续优化,将购买的信息除了保存在session中以外,还要将购物的信息保存在cookie中,这样  就解决了浏览器关闭购买商品信息丢失的问题(但是解决不了跟换电脑信息丢失的问题)  优点:不用操作数据库,可以减少数据库访问压力 数据库中:  缺点:只用登录的用户才能添加购物车