首先说明: 这里分页是使用了SSM框架+ jsp 来做的, 当然分页还有其他的很多做法, 比如easyUI自带的分页效果. 但是这些原理都是很相似的, 再次只做为学习总结之用.

一, 效果图


这里的截图是来自百度, 当然我们的项目也是做成这种效果, 当点击第10页时, 相应页码数也要发生相应变化.

二, 代码实例
1, 首先我们在项目中加入了一个page 的jar包, 这个jar包有3个java文件组成, 这个jar包是事先写好的通用分页插件.

另外这里将源码也写上来:
Paginable.java:

 package cn.itcast.common.page;

 /**
* 分页接口
*/
public interface Paginable {
/**
* 总记录数
*
* @return
*/
public int getTotalCount(); /**
* 总页数
*
* @return
*/
public int getTotalPage(); /**
* 每页记录数
*
* @return
*/
public int getPageSize(); /**
* 当前页号
*
* @return
*/
public int getPageNo(); /**
* 是否第一页
*
* @return
*/
public boolean isFirstPage(); /**
* 是否最后一页
*
* @return
*/
public boolean isLastPage(); /**
* 返回下页的页号
*/
public int getNextPage(); /**
* 返回上页的页号
*/
public int getPrePage();
}

SimplePage.java:

 package cn.itcast.common.page;

 /**
* 简单分页类
*/
public class SimplePage implements java.io.Serializable,Paginable { private static final long serialVersionUID = 1L;
public static final int DEF_COUNT = 20; /**
* 检查页码 checkPageNo
*
* @param pageNo
* @return if pageNo==null or pageNo<1 then return 1 else return pageNo
*/
public static int cpn(Integer pageNo) {
return (pageNo == null || pageNo < 1) ? 1 : pageNo;
} public SimplePage() {
} /**
* 构造器
*
* @param pageNo
* 页码
* @param pageSize
* 每页几条数据
* @param totalCount
* 总共几条数据
*/
public SimplePage(int pageNo, int pageSize, int totalCount) {
setTotalCount(totalCount);
setPageSize(pageSize);
setPageNo(pageNo);
adjustPageNo(); } /**
* 调整页码,使不超过最大页数
*/
public void adjustPageNo() {
if (pageNo == 1) {
return;
}
int tp = getTotalPage();
if (pageNo > tp) {
pageNo = tp;
}
} /**
* 获得页码
*/
public int getPageNo() {
return pageNo;
} /**
* 每页几条数据
*/
public int getPageSize() {
return pageSize;
} /**
* 总共几条数据
*/
public int getTotalCount() {
return totalCount;
} /**
* 总共几页
*/
public int getTotalPage() {
int totalPage = totalCount / pageSize;
if (totalPage == 0 || totalCount % pageSize != 0) {
totalPage++;
}
return totalPage;
} /**
* 是否第一页
*/
public boolean isFirstPage() {
return pageNo <= 1;
} /**
* 是否最后一页
*/
public boolean isLastPage() {
return pageNo >= getTotalPage();
} /**
* 下一页页码
*/
public int getNextPage() {
if (isLastPage()) {
return pageNo;
} else {
return pageNo + 1;
}
} /**
* 上一页页码
*/
public int getPrePage() {
if (isFirstPage()) {
return pageNo;
} else {
return pageNo - 1;
}
} protected int totalCount = 0;
protected int pageSize = 20;
protected int pageNo = 1; /**
* if totalCount<0 then totalCount=0
*
* @param totalCount
*/
public void setTotalCount(int totalCount) {
if (totalCount < 0) {
this.totalCount = 0;
} else {
this.totalCount = totalCount;
}
} /**
* if pageSize< 1 then pageSize=DEF_COUNT
*
* @param pageSize
*/
public void setPageSize(int pageSize) {
if (pageSize < 1) {
this.pageSize = DEF_COUNT;
} else {
this.pageSize = pageSize;
}
} /**
* if pageNo < 1 then pageNo=1
*
* @param pageNo
*/
public void setPageNo(int pageNo) {
if (pageNo < 1) {
this.pageNo = 1;
} else {
this.pageNo = pageNo;
}
}
}

Pagination.java:

 package cn.itcast.common.page;

 import java.util.ArrayList;
import java.util.List; /**
* 列表分页。包含list属性。
*/
public class Pagination extends SimplePage{ public Pagination() {
} /**
* 构造器
*
* @param pageNo
* 页码
* @param pageSize
* 每页几条数据
* @param totalCount
* 总共几条数据
*/
public Pagination(int pageNo, int pageSize, int totalCount) {
super(pageNo, pageSize, totalCount); } /**
* 构造器
*
* @param pageNo
* 页码
* @param pageSize
* 每页几条数据
* @param totalCount
* 总共几条数据
* @param list
* 分页内容
*/
public Pagination(int pageNo, int pageSize, int totalCount, List<?> list) {
super(pageNo, pageSize, totalCount);
this.list = list;
} /**
* 第一条数据位置
*
* @return
*/
public int getFirstResult() {
return (pageNo - 1) * pageSize;
} /**
* 当前页的数据
*/
private List<?> list; /**
* 当前页的分页样式
*/
private List<String> pageView; /**
* 获得分页内容
*
* @return
*/
public List<?> getList() {
return list;
} /**
* 设置分页内容
*
* @param list
*/
@SuppressWarnings("unchecked")
public void setList(List list) {
this.list = list;
}
/**
* 获得分页样式
*
* @return
*/
public List<String> getPageView() {
return pageView;
}
/**
* 设置分页样式
*
* @param list
*/
public void setPageView(List<String> pageView) {
this.pageView = pageView;
} /**
* 分页显示样示部分
*/
public void pageView(String url,String params){ pageView = new ArrayList<String>(); if(this.pageNo != 1){
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo=1'\"><font size=2>首页</font></a>");
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.pageNo-1)+"'\"><font size=2>上一页</font></a>");
}else{
pageView.add("<font size=2>首页</font>");
pageView.add("<font size=2>上一页</font>");
} if(this.getTotalPage() <= 10){
for (int i = 0; i < this.getTotalPage(); i++) {
if((i+1)==this.pageNo){
pageView.add("<strong>"+this.pageNo+"</strong>");
i = i+1;
if(this.pageNo==this.getTotalPage())break;
}
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(i+1)+"'\">"+(i+1)+"</a>");
}
}else if(this.getTotalPage() <= 20){
//没有把...加上
int l = 0;
int r = 0;
if(this.pageNo<5){
l=this.pageNo-1;
r=10-l-1;
}else if(this.getTotalPage()-this.pageNo<5){
r=this.getTotalPage()-this.pageNo;
l=10-1-r;
}else{
l=4;
r=5;
}
int tmp = this.pageNo-l;
for (int i = tmp; i < tmp+10; i++) {
if(i==this.pageNo){
pageView.add("<strong>"+this.pageNo+"</strong>");
i = i+1;
if(this.pageNo==this.getTotalPage()) break;
}
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(i)+"'\">"+(i)+"</a>");
} }else if(this.pageNo<7){
for (int i = 0; i < 8; i++) {
if(i+1==this.pageNo){
pageView.add("<strong>"+this.pageNo+"</strong>");
i = i+1;
}
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(i+1)+"'\">"+(i+1)+"</a>");
}
pageView.add("...");
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.getTotalPage()-1)+"'\">"+(this.getTotalPage()-1)+"</a>");
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.getTotalPage())+"'\">"+(this.getTotalPage())+"</a>");
}else if(this.pageNo>this.getTotalPage()-6){
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(1)+"'\">"+(1)+"</a>");
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(2)+"'\">"+(2)+"</a>");
pageView.add("...");
for (int i = this.getTotalPage()-8; i <this.getTotalPage() ; i++) {
if(i+1==this.pageNo){
pageView.add("<strong>"+this.pageNo+"</strong>");
i = i+1;
if(this.pageNo==this.getTotalPage()) break;
}
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(i+1)+"'\">"+(i+1)+"</a>");
}
}else{
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(1)+"'\">"+(1)+"</a>");
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(2)+"'\">"+(2)+"</a>");
pageView.add("..."); pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.pageNo-2)+"'\">"+(this.pageNo-2)+"</a>");
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.pageNo-1)+"'\">"+(this.pageNo-1)+"</a>");
pageView.add("<strong>"+this.pageNo+"</strong>");
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.pageNo+1)+"'\">"+(this.pageNo+1)+"</a>");
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.pageNo+2)+"'\">"+(this.pageNo+2)+"</a>"); pageView.add("...");
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.getTotalPage()-1)+"'\">"+(this.getTotalPage()-1)+"</a>");
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.getTotalPage())+"'\">"+(this.getTotalPage())+"</a>");
}
if(this.pageNo != this.getTotalPage()){
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.pageNo+1)+"'\"><font size=2>下一页</font></a>");
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+this.getTotalPage()+"'\"><font size=2>尾页</font></a>");
} else{
pageView.add("<font size=2>下一页</font>");
pageView.add("<font size=2>尾页</font>");
}
pageView.add("共<var>" + getTotalPage() + "</var>页 到第<input type='text' id='PAGENO' size='3' />页 <input type='button' id='skip' class='hand btn60x20' value='确定' onclick=\"javascript:window.location.href = '" + url + "?" + params + "&pageNo=' + $('#PAGENO').val() \"/>");
}
}

2, 下面源码就是需要自己在项目中构建
下面开始从Controller(babasport-console)-->ServiceImpl(babasport-product)-->DaoMapper(babasport-dao)-->jsp展示

Controller层:
BrandController.java:

 package cn.itcast.core.controller;

 import java.util.List;

 import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping; import cn.itcast.common.page.Pagination;
import cn.itcast.core.bean.product.Brand;
import cn.itcast.core.service.product.BrandService; /*
* 品牌
*/
@Controller
@RequestMapping(value="/brand")
public class BrandController { @Autowired
private BrandService brandService; @RequestMapping(value="/list.do")
public String list(Integer pageNo, String name, Integer isDisplay, Model model){
//List<Brand> brands = brandService.selectBrandListByQuery(name, isDisplay);
Pagination pagination = brandService.selectPaginationByQuery(pageNo, name, isDisplay);
model.addAttribute("pagination", pagination);
//回显查询条件
model.addAttribute("name", name);
if(isDisplay != null){
model.addAttribute("isDisplay", isDisplay);
}else{
model.addAttribute("isDisplay", 1);
}
return "brand/list";
} @RequestMapping(value="/toEdit.do")
public String selectBrandById(Long id, Model model){ Brand brand = brandService.selectBrandById(id);
model.addAttribute("brand", brand); return "brand/edit";
}
}

解析: 这个controller 包括两个方法, 一个是查询分页数据, 另一个是根据ID 回显数据.
两个方法都很简单, 第一个就是根据页面传递过来的当前页数和查询条件通过service层去做进一步处理后再通过Dao层去查询结果, 将查询的结果返回后再封装到Model里面, 然后转发到视图层.
第二个方法更简单了, 通过Id查询到相应的商品然后回显数据即可.

Service层:
BrandServiceImpl.java:

 package cn.itcast.core.service.product;

 import java.util.List;

 import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import cn.itcast.common.page.Pagination;
import cn.itcast.core.bean.product.Brand;
import cn.itcast.core.bean.product.BrandQuery;
import cn.itcast.core.dao.product.BrandDao;
@Service("brandService")
@Transactional
public class BrandServiceImpl implements BrandService { @Autowired
private BrandDao brandDao; @Override
public List<Brand> selectBrandListByQuery(String name, Integer isDisplay) {
BrandQuery brandQuery = new BrandQuery();
if (name != null) {
brandQuery.setName(name);
}
if (isDisplay != null) {
brandQuery.setIsDisplay(isDisplay);
}
else {
//是: 1, 否:0
brandQuery.setIsDisplay(1);
} return brandDao.selectBrandListByQuery(brandQuery);
} //分页
public Pagination selectPaginationByQuery(Integer pageNo, String name, Integer isDisplay) {
BrandQuery brandQuery = new BrandQuery();
//设置当前页 cpn方法: 如果pageNumber 是null或者 小于1, 那么就将pageNumber设置为1, 如果不是则使用传递进来的pageNumber
brandQuery.setPageNo(Pagination.cpn(pageNo));
//设置每页数
brandQuery.setPageSize(3); //拼接条件
StringBuilder sb = new StringBuilder(); if (name != null) {
brandQuery.setName(name);
sb.append("name=").append(name);
} if (isDisplay != null) {
brandQuery.setIsDisplay(isDisplay);
sb.append("&isDisplay=").append(isDisplay);
}
else {
//是: 1, 否:0
brandQuery.setIsDisplay(1);
sb.append("&isDisplay=").append(1);
}
//构建分页对象
//三个参数: 当前页,每页显示行数,总记录数
Pagination pagination = new Pagination(brandQuery.getPageNo(), brandQuery.getPageSize(), brandDao.selectCount(brandQuery));
//查询结果集
//使用查询语句: select * from bbs_brand where ... limit (pageNumber - 1) * 3, 3
pagination.setList(brandDao.selectBrandListByQuery(brandQuery)); //分页在页面显示 /brand/list.do?name=aaa&&isDisplay=0
String url = "/brand/list.do";
pagination.pageView(url, sb.toString()); return pagination;
} //通过ID查询一个品牌
public Brand selectBrandById(Long id){
return brandDao.selectBrandById(id);
} }

解析: Service层中主要来说第二个分页的方法.
  brandQuery.setPageNo(Pagination.cpn(pageNo)); 
这个cpn方法是Pagination中封装好的静态方法, 我们来看下源码:

 /**
* 检查页码 checkPageNo
*
* @param pageNo
* @return if pageNo==null or pageNo<1 then return 1 else return pageNo
*/
public static int cpn(Integer pageNo) {
return (pageNo == null || pageNo < 1) ? 1 : pageNo;
}

使用StringBuilder 封装查询条件, 因为当我们根据查询条件查询到的数据也有分页效果时, 这时候我们点击页码的按钮时跳转到相应的页数后, 查询条件也应该回显.

 //构建分页对象
//三个参数: 当前页,每页显示行数,总记录数
Pagination pagination = new Pagination(brandQuery.getPageNo(), brandQuery.getPageSize(), brandDao.selectCount(brandQuery));
//查询结果集
//使用查询语句: select * from bbs_brand where ... limit (pageNumber - 1) * 3, 3
pagination.setList(brandDao.selectBrandListByQuery(brandQuery)); //分页在页面显示 /brand/list.do?name=aaa&&isDisplay=0
String url = "/brand/list.do";
pagination.pageView(url, sb.toString());

构建分页对象, 将查询的结果封装到pagination中, 且 将url和封装的条件封装到pageView中. 这里因为页码按钮的样式是固定的, 不固定的只是我们点击 每一个按钮跳转的url和查询的条件不同, 所以这里使用pageView属性来封装url和查询条件.

Dao层:
BrandDao.xml:

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cn.itcast.core.dao.product.BrandDao"> <resultMap type="Brand" id="brand">
<result column="img_url" property="imgUrl"/>
<result column="is_display" property="isDisplay"/>
</resultMap>
<!-- 查询品牌结果集 List<Brand> -->
<select id="selectBrandListByQuery" parameterType="BrandQuery" resultMap="brand">
select id ,name,description,img_url,is_display,sort
from bbs_brand
<where>
<if test="name != null">
name like "%"#{name}"%"
</if>
<if test="isDisplay != null">
and is_display = #{isDisplay}
</if>
</where>
<if test="startRow != null">
limit #{startRow}, #{pageSize}
</if>
</select> <!-- 查询品牌结果集 List<Brand> -->
<select id="selectCount" parameterType="BrandQuery" resultType="Integer">
select count(1)
from bbs_brand
<where>
<if test="name != null">
name like "%"#{name}"%"
</if>
<if test="isDisplay != null">
and is_display = #{isDisplay}
</if>
</where>
</select> <!-- 根据ID查询 -->
<select id="selectBrandById" parameterType="Long" resultMap="brand">
select id ,name,description,img_url,is_display,sort
from bbs_brand
<where>
id = #{id}
</where>
</select>
</mapper>

Model
BrandQuery.java:

 package cn.itcast.core.bean.product;

 import java.io.Serializable;

 public class BrandQuery implements Serializable{
/**
* 默认的ID
*/
private static final long serialVersionUID = 1L; //品牌ID bigint
private Long id;
//品牌名称
private String name;
//描述
private String description;
//图片URL
private String imgUrl;
//排序 越大越靠前
private Integer sort;
//是否可用 0 不可用 1 可用
private Integer isDisplay;//is_display
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getImgUrl() {
return imgUrl;
}
public void setImgUrl(String imgUrl) {
this.imgUrl = imgUrl;
}
public Integer getSort() {
return sort;
}
public void setSort(Integer sort) {
this.sort = sort;
}
public Integer getIsDisplay() {
return isDisplay;
}
public void setIsDisplay(Integer isDisplay) {
this.isDisplay = isDisplay;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
@Override
public String toString() {
return "Brand [id=" + id + ", name=" + name + ", description=" + description + ", imgUrl=" + imgUrl + ", sort="
+ sort + ", isDisplay=" + isDisplay + "]";
} //附加字段
//当前页
private Integer pageNo = 1; //每页数
private Integer pageSize = 10; //开始行
private Integer startRow;
public Integer getPageNo() {
return pageNo;
}
public void setPageNo(Integer pageNo) {
//计算开始行
this.startRow = (pageNo - 1)*pageSize;
this.pageNo = pageNo;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
//计算开始行
this.startRow = (pageNo - 1)*pageSize;
this.pageSize = pageSize;
}
public Integer getStartRow() {
return startRow;
}
public void setStartRow(Integer startRow) {
this.startRow = startRow;
} }

解析: mapper和model
这里model这接计算好了startRow, 所以在mapper就可以直接查询了.

 //附加字段
//当前页
private Integer pageNo = 1; //每页数
private Integer pageSize = 10; //开始行
private Integer startRow;
public Integer getPageNo() {
return pageNo;
}
public void setPageNo(Integer pageNo) {
//计算开始行
this.startRow = (pageNo - 1)*pageSize;
this.pageNo = pageNo;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
//计算开始行
this.startRow = (pageNo - 1)*pageSize;
this.pageSize = pageSize;
}
public Integer getStartRow() {
return startRow;
}
public void setStartRow(Integer startRow) {
this.startRow = startRow;
}

View层:
list.jsp:

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ include file="../head.jsp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>babasport-list</title>
</head>
<body>
<div class="box-positon">
<div class="rpos">当前位置: 品牌管理 - 列表</div>
<form class="ropt">
<input class="add" type="button" value="添加" onclick="javascript:window.location.href='add.jsp'"/>
</form>
<div class="clear"></div>
</div>
<div class="body-box">
<form action="/brand/list.do" method="post" style="padding-top:5px;">
品牌名称: <input type="text" name="name" value="${name}"/>
<select name="isDisplay">
<option value="1" <c:if test="${isDisplay==1 }">selected="selected"</c:if>>是</option>
<option value="0" <c:if test="${isDisplay==0 }">selected="selected"</c:if>>否</option>
</select>
<input type="submit" class="query" value="查询"/>
</form>
<table cellspacing="1" cellpadding="0" border="0" width="100%" class="pn-ltable">
<thead class="pn-lthead">
<tr>
<th width="20"><input type="checkbox" onclick="checkBox('ids',this.checked)"/></th>
<th>品牌ID</th>
<th>品牌名称</th>
<th>品牌图片</th>
<th>品牌描述</th>
<th>排序</th>
<th>是否可用</th>
<th>操作选项</th>
</tr>
</thead>
<tbody class="pn-ltbody">
<c:forEach items="${pagination.list }" var="brand">
<tr bgcolor="#ffffff" onmouseout="this.bgColor='#ffffff'" onmouseover="this.bgColor='#eeeeee'">
<td><input type="checkbox" value="${brand.id }" name="ids"/></td>
<td align="center">${brand.id }</td>
<td align="center">${brand.name }</td>
<td align="center"><img width="40" height="40" src="/images/pic/ppp.jpg"/></td>
<td align="center"></td>
<td align="center">${brand.sort}</td>
<td align="center">
<c:if test="${brand.isDisplay == 1 }">是</c:if>
<c:if test="${brand.isDisplay == 0 }">否</c:if>
</td>
<td align="center">
<a class="pn-opt" href="/brand/toEdit.do?id=${brand.id}">修改</a> | <a class="pn-opt" onclick="if(!confirm('您确定删除吗?')) {return false;}" href="#">删除</a>
</td>
</tr> </c:forEach> </tbody>
</table>
<div class="page pb15">
<span class="r inb_a page_b">
<c:forEach items="${pagination.pageView }" var="page">
${page }
</c:forEach>
</span>
</div>
<div style="margin-top:15px;"><input class="del-button" type="button" value="删除" onclick="optDelete();"/></div>
</div>
</body>
</html>

解析: 这里需要添加一些必要的说明: 
这里 在显示分页页码的时候直接使用了 ${page}, 到底这个是怎么实现的呢? 下面来看下源码中的pageView.

 /**
* 分页显示样示部分
*/
public void pageView(String url,String params){ pageView = new ArrayList<String>(); if(this.pageNo != 1){
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo=1'\"><font size=2>首页</font></a>");
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.pageNo-1)+"'\"><font size=2>上一页</font></a>");
}else{
pageView.add("<font size=2>首页</font>");
pageView.add("<font size=2>上一页</font>");
} if(this.getTotalPage() <= 10){
for (int i = 0; i < this.getTotalPage(); i++) {
if((i+1)==this.pageNo){
pageView.add("<strong>"+this.pageNo+"</strong>");
i = i+1;
if(this.pageNo==this.getTotalPage())break;
}
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(i+1)+"'\">"+(i+1)+"</a>");
}
}else if(this.getTotalPage() <= 20){
//没有把...加上
int l = 0;
int r = 0;
if(this.pageNo<5){
l=this.pageNo-1;
r=10-l-1;
}else if(this.getTotalPage()-this.pageNo<5){
r=this.getTotalPage()-this.pageNo;
l=10-1-r;
}else{
l=4;
r=5;
}
int tmp = this.pageNo-l;
for (int i = tmp; i < tmp+10; i++) {
if(i==this.pageNo){
pageView.add("<strong>"+this.pageNo+"</strong>");
i = i+1;
if(this.pageNo==this.getTotalPage()) break;
}
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(i)+"'\">"+(i)+"</a>");
} }else if(this.pageNo<7){
for (int i = 0; i < 8; i++) {
if(i+1==this.pageNo){
pageView.add("<strong>"+this.pageNo+"</strong>");
i = i+1;
}
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(i+1)+"'\">"+(i+1)+"</a>");
}
pageView.add("...");
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.getTotalPage()-1)+"'\">"+(this.getTotalPage()-1)+"</a>");
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.getTotalPage())+"'\">"+(this.getTotalPage())+"</a>");
}else if(this.pageNo>this.getTotalPage()-6){
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(1)+"'\">"+(1)+"</a>");
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(2)+"'\">"+(2)+"</a>");
pageView.add("...");
for (int i = this.getTotalPage()-8; i <this.getTotalPage() ; i++) {
if(i+1==this.pageNo){
pageView.add("<strong>"+this.pageNo+"</strong>");
i = i+1;
if(this.pageNo==this.getTotalPage()) break;
}
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(i+1)+"'\">"+(i+1)+"</a>");
}
}else{
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(1)+"'\">"+(1)+"</a>");
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(2)+"'\">"+(2)+"</a>");
pageView.add("..."); pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.pageNo-2)+"'\">"+(this.pageNo-2)+"</a>");
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.pageNo-1)+"'\">"+(this.pageNo-1)+"</a>");
pageView.add("<strong>"+this.pageNo+"</strong>");
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.pageNo+1)+"'\">"+(this.pageNo+1)+"</a>");
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.pageNo+2)+"'\">"+(this.pageNo+2)+"</a>"); pageView.add("...");
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.getTotalPage()-1)+"'\">"+(this.getTotalPage()-1)+"</a>");
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.getTotalPage())+"'\">"+(this.getTotalPage())+"</a>");
}
if(this.pageNo != this.getTotalPage()){
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.pageNo+1)+"'\"><font size=2>下一页</font></a>");
pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+this.getTotalPage()+"'\"><font size=2>尾页</font></a>");
} else{
pageView.add("<font size=2>下一页</font>");
pageView.add("<font size=2>尾页</font>");
}
pageView.add("共<var>" + getTotalPage() + "</var>页 到第<input type='text' id='PAGENO' size='3' />页 <input type='button' id='skip' class='hand btn60x20' value='确定' onclick=\"javascript:window.location.href = '" + url + "?" + params + "&pageNo=' + $('#PAGENO').val() \"/>");
}

这里是直接将展示页拼接了出来, 而且加了url和查询参数.

到了这里整个分页的流程就搞完了, 下面来看下整体效果: 

mybatis结合分页的使用及解析.的更多相关文章

  1. mybatis 3.x源码深度解析与最佳实践(最完整原创)

    mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...

  2. 理解 Mybatis的分页插件 PageHelper

    Mybatis + SpringMVC + Maven实现分页查询 (推荐采用的插件是PageHelper) 先看一下之前的这篇博客,这里推荐了 Mybatis 的分页方法. 按照上面的方法设置后,确 ...

  3. Mybatis的分页插件PageHelper

    Mybatis的分页插件PageHelper 项目地址:http://git.oschina.net/free/Mybatis_PageHelper  文档地址:http://git.oschina. ...

  4. Mybatis 的分页插件PageHelper-4.1.1的使用

    Mybatis 的分页插件 PageHelper 项目地址:http://git.oschina.net/free/Mybatis_PageHelper  文档地址:http://git.oschin ...

  5. Mybatis包分页查询java公共类

    Mybatis包分页查询java公共类   分页----对于数据量非常大的查询中.是不可缺少的. mybatis底层的分页sql语句因为须要我们自己去手动写.而实现分页显示的时候我们须要依据分页查询条 ...

  6. 权限管理系统之项目框架搭建并集成日志、mybatis和分页

    前一篇博客中使用LayUI实现了列表页面和编辑页面的显示交互,但列表页面table渲染的数据是固定数据,本篇博客主要是将固定数据变成数据库数据. 一.项目框架 首先要解决的是项目框架问题,搭建什么样的 ...

  7. SpringBoot集成MyBatis的分页插件 PageHelper

    首先说说MyBatis框架的PageHelper插件吧,它是一个非常好用的分页插件,通常我们的项目中如果集成了MyBatis的话,几乎都会用到它,因为分页的业务逻辑说复杂也不复杂,但是有插件我们何乐而 ...

  8. MyBatis 源码分析 - 映射文件解析过程

    1.简介 在上一篇文章中,我详细分析了 MyBatis 配置文件的解析过程.由于上一篇文章的篇幅比较大,加之映射文件解析过程也比较复杂的原因.所以我将映射文件解析过程的分析内容从上一篇文章中抽取出来, ...

  9. Mybatis之分页插件pagehelper的简单使用

    最近从家里回来之后一直在想着减肥的事情,一个月都没更新博客了,今天下午没睡午觉就想着把mybatis的分页插件了解一下,由于上个月重新恢复了系统,之前创建的项目都没了,又重新创建了一个项目. 一.创建 ...

随机推荐

  1. Unity将来时:IL2CPP是什么?

    作者:小玉链接:https://zhuanlan.zhihu.com/p/19972689来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. Unity3D 想必大家都不陌 ...

  2. 15.Xcode8 升级遇到的问题

    一:注释快捷键cmd+/不能用,解决方法: 1. Swift_3.0 没法快捷键(command+/)注释的原因:这个是因为苹果解决xcode ghost,把插件屏蔽了. 2. 解决办法: (1) 终 ...

  3. 实现十进制无符号整数m到十六进制数的转换功能

    /*利用顺序栈结构,编写算法函数void Dto16(unsigned int m)实现十进制无符号整数m到十六进制数的转换功能.*//******************************** ...

  4. Picard 法求方程根

    要点: 首先对于任何方程 :f(x)=0 ,可以转换成 f(x)+x-x => f(x)+x=x; 取g(x)=f(x)+x;  那么 新方程g(x)=x 的解即是 f(x)=0的解,即g(x) ...

  5. 如何使用NodeJs来监听文件变化

    1.前言 在我们调试修改代码的时候,每修改一次代码,哪怕只是很小的修改,我们都需要手动重新build文件,然后再运行代码,看修改的效果,这样的效率特别低,对于开发者来说简直不能忍. 2.构建自动编译工 ...

  6. C#交错数组

    交错数组本质上是一维数组只不过这个一维数组里的元素都是数组.因为该一维数组里面的元素可以是任何大小的数组所以定义时只能以这样的格式定义 ][]; 定义完后必须对该数组进行初始化后方可进行赋值等操作否则 ...

  7. linux琐碎命令学习

    kill -l会把linux的信号都列出来.1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) SIGABRT 7) SIGBUS 8) SIG ...

  8. 使用netty实现的tcp通讯中如何实现同步返回

    在netty实现的tcp通讯中,一切都是异步操作,这提高了系统性能,但是,有时候client需要同步等待消息返回,如何实现呢?笔者已经实现,在此总结下重点要素 实现要点: 1.消息结构设计 消息头中需 ...

  9. PHP——使用header()函数下载文件

    思路:先指明内容的MIME类型,内容描述,内容长度(也即文件大小). 一.下载txt文件的程序: <?phpheader('Content-Type:text/plain');header('C ...

  10. HTML5 div+css导航菜单

    HTML5 div+css导航菜单 视频 音乐 小说   故事 作品 阅读 联系