要想给datagrid实现分页的效果,那么datagrid必须有这三个属性:
pagination: true,//分页控件,只有为true时才显示分页控件 pageSize: 15, //设置每页的条数 pageList: [10, 15, 30, 50]
在给datagrid添加分页时,属性中必须有url属性,否则分页不好使
如果datagrid中的数据时通过查询条件后加载的时候,那么需要定义一个全局的url变量值为空,在datagrid的url属性中,赋值这个定义的全局变量。
在点击查询按钮时,传递参数重新赋值这个url的变量,在使用reload来加载这个url
例如:
前台js:$("#seaBtn").click(function () { var drugCode = $("#drugCode").combogrid("getValue") var classCode = $("#drugClass").combotree("getValue") //没有选择类别,则根据药品代码来查询 if (drugCode != "") {//重新加载datagrid的url路径 url = basePath + "/drug-price/listDrugPriceListOfPage?drugCode=" + drugCode + "&orgId=" + config.org_Id; $("#search").datagrid('reload', url); } else { url = basePath + "/drug-price/listDrugPriceListByCode?classCode=" + classCode + "&orgId=" + config.org_Id; $("#search").datagrid('reload', url); } })后台代码:@GET @Path("listDrugPriceListHis") public PageData listDrugPriceListHis(@Context HttpServletRequest request, @Context HttpServletResponse response) {//页面传递的参数 String orgId = request.getParameter("orgId"); String drugCode = request.getParameter("drugCode"); DrugPriceList drugPriceList = new DrugPriceList(); drugPriceList.setOrgId(orgId); drugPriceList.setDrugCode(drugCode); Page<DrugPriceList> page = drugPriceListServiceApi.listDrugPriceListHis(new Page<DrugPriceList>(request, response), drugPriceList); PageData pageData = new PageData(); pageData.setRows(page.getList()); pageData.setTotal(page.getCount()); return pageData; }API实现:public Page<DrugPriceList> listDrugPriceListHis(Page<DrugPriceList> drugPriceListPage,DrugPriceList drugPriceList) ;
Service:public Page<DrugPriceList> listDrugPriceListHis(Page<DrugPriceList> page, DrugPriceList drugPriceList) { drugPriceList.setPage(page); page.setList(dao.listDrugPriceListHis(drugPriceList)); return page; }需要用到的类:
(1)PageData类:
public class PageData<T> implements Serializable{ private List rows; private Long total; public PageData() {} public List getRows() { return rows;} public void setRows(List rows) { this.rows = rows;} public Long getTotal() { return total;} public void setTotal(Long total) { this.total = total;} }(2)Page类:
/** * 分页类 * @author ThinkGem * @version 2013-7-2 * @param <T> */ public class Page<T> implements Serializable { private int pageNo = 1; // 当前页码 private int pageSize = Integer.valueOf(15); // 页面大小,设置为“-1”表示不进行分页(分页无效) private long count;// 总记录数,设置为“-1”表示不查询总数 private int first;// 首页索引 private int last;// 尾页索引 private int prev;// 上一页索引 private int next;// 下一页索引 private boolean firstPage;//是否是第一页 private boolean lastPage;//是否是最后一页 private int length = 10;// 显示页面长度 private int slider = 1;// 前后显示页面长度 private List<T> list = new ArrayList<T>(); private String orderBy = ""; // 标准查询有效, 实例: updatedate desc, name asc private String funcName = "page"; // 设置点击页码调用的js函数名称,默认为page,在一页有多个分页对象时使用。 private 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("page"); if (StringUtils.isNumeric(no)){ CookieUtils.setCookie(response, "page", no); this.setPageNo(Integer.parseInt(no)); }else if (request.getParameter("page")!=null){ no = CookieUtils.getCookie(request, "page"); if (StringUtils.isNumeric(no)){ this.setPageNo(Integer.parseInt(no)); } } // 设置页面大小参数(传递repage参数,来记住页码大小) String size = request.getParameter("rows"); if (StringUtils.isNumeric(size)){ CookieUtils.setCookie(response, "rows", size); this.setPageSize(Integer.parseInt(size)); }else if (request.getParameter("page")!=null){ no = CookieUtils.getCookie(request, "rows"); 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(); if (pageNo == first) {// 如果是首页 sb.append("<li class=\"disabled\"><a href=\"javascript:\">« 上一页</a></li>\n"); } else { sb.append("<li><a href=\"javascript:\" οnclick=\""+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:\" οnclick=\""+funcName+"("+i+","+pageSize+",'"+funcParam+"');\">" + (i + 1 - first) + "</a></li>\n"); } if (i < begin) { sb.append("<li class=\"disabled\"><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:\" οnclick=\""+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:\" οnclick=\""+funcName+"("+i+","+pageSize+",'"+funcParam+"');\">" + (i + 1 - first) + "</a></li>\n"); } if (pageNo == last) { sb.append("<li class=\"disabled\"><a href=\"javascript:\">下一页 »</a></li>\n"); } else { sb.append("<li><a href=\"javascript:\" οnclick=\""+funcName+"("+next+","+pageSize+",'"+funcParam+"');\">" + "下一页 »</a></li>\n"); } sb.append("<li class=\"disabled controls\"><a href=\"javascript:\">当前 "); sb.append("<input type=\"text\" value=\""+pageNo+"\" οnkeypress=\"var e=window.event||this;var c=e.keyCode||e.which;if(c==13)"); sb.append(funcName+"(this.value,"+pageSize+",'"+funcParam+"');\" οnclick=\"this.select();\"/> / "); sb.append("<input type=\"text\" value=\""+pageSize+"\" οnkeypress=\"var e=window.event||this;var c=e.keyCode||e.which;if(c==13)"); sb.append(funcName+"("+pageNo+",this.value,'"+funcParam+"');\" οnclick=\"this.select();\"/> 条,"); sb.append("共 " + count + " 条"+(message!=null?message:"")+"</a></li>\n"); sb.insert(0,"<ul>\n").append("</ul>\n"); sb.append("<div style=\"clear:both;\"></div>"); // sb.insert(0,"<div class=\"page\">\n").append("</div>\n"); return sb.toString(); } /** * 获取分页HTML代码 * @return */ public String getHtml(){ return toString(); } // public static void main(String[] args) { // Page<String> p = new Page<String>(3, 3); // System.out.println(p); // System.out.println("首页:"+p.getFirst()); // System.out.println("尾页:"+p.getLast()); // System.out.println("上页:"+p.getPrev()); // System.out.println("下页:"+p.getNext()); // } /** * 获取设置总数 * @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 */ public int getFirst() { return first; } /** * 尾页索引 * @return */ public int getLast() { return last; } /** * 获取页面总数 * @return getLast(); */ public int getTotalPage() { return getLast(); } /** * 是否为第一页 * @return */ public boolean isFirstPage() { return firstPage; } /** * 是否为最后一页 * @return */ public boolean isLastPage() { return lastPage; } /** * 上一页索引值 * @return */ public int getPrev() { if (isFirstPage()) { return pageNo; } else { return pageNo - 1; } } /** * 下一页索引值 * @return */ 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 */ 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 */ public String getFuncName() { return funcName; } /** * 设置点击页码调用的js函数名称,默认为page,在一页有多个分页对象时使用。 * @param funcName 默认为page */ public void setFuncName(String funcName) { this.funcName = funcName; } /** * 获取分页函数的附加参数 * @return */ 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 */ public boolean isDisabled() { return this.pageSize==-1; } /** * 是否进行总数统计 * @return this.count==-1 */ 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(); } // /** // * 获取 Spring data JPA 分页对象 // */ // public Pageable getSpringPage(){ // List<Order> orders = new ArrayList<Order>(); // if (orderBy!=null){ // for (String order : StringUtils.split(orderBy, ",")){ // String[] o = StringUtils.split(order, " "); // if (o.length==1){ // orders.add(new Order(Direction.ASC, o[0])); // }else if (o.length==2){ // if ("DESC".equals(o[1].toUpperCase())){ // orders.add(new Order(Direction.DESC, o[0])); // }else{ // orders.add(new Order(Direction.ASC, o[0])); // } // } // } // } // return new PageRequest(this.pageNo - 1, this.pageSize, new Sort(orders)); // } // // /** // * 设置 Spring data JPA 分页对象,转换为本系统分页对象 // */ // public void setSpringPage(org.springframework.data.domain.Page<T> page){ // this.pageNo = page.getNumber(); // this.pageSize = page.getSize(); // this.count = page.getTotalElements(); // this.list = page.getContent(); // } }