mybatis结合分页的使用及解析.
来源:互联网 发布:淘宝上的喵喵通讯 编辑:程序博客网 时间:2024/06/09 13:48
一, 效果图
这里的截图是来自百度, 当然我们的项目也是做成这种效果, 当点击第10页时, 相应页码数也要发生相应变化.
二, 代码实例
1, 首先我们在项目中加入了一个page 的jar包, 这个jar包有3个java文件组成, 这个jar包是事先写好的通用分页插件.
另外这里将源码也写上来:
Paginable.java:
1 package cn.itcast.common.page; 2 3 /** 4 * 分页接口 5 */ 6 public interface Paginable { 7 /** 8 * 总记录数 9 * 10 * @return11 */12 public int getTotalCount();13 14 /**15 * 总页数16 * 17 * @return18 */19 public int getTotalPage();20 21 /**22 * 每页记录数23 * 24 * @return25 */26 public int getPageSize();27 28 /**29 * 当前页号30 * 31 * @return32 */33 public int getPageNo();34 35 /**36 * 是否第一页37 * 38 * @return39 */40 public boolean isFirstPage();41 42 /**43 * 是否最后一页44 * 45 * @return46 */47 public boolean isLastPage();48 49 /**50 * 返回下页的页号51 */52 public int getNextPage();53 54 /**55 * 返回上页的页号56 */57 public int getPrePage();58 }
SimplePage.java:
1 package cn.itcast.common.page; 2 3 /** 4 * 简单分页类 5 */ 6 public class SimplePage implements java.io.Serializable,Paginable { 7 8 private static final long serialVersionUID = 1L; 9 public static final int DEF_COUNT = 20; 10 11 /** 12 * 检查页码 checkPageNo 13 * 14 * @param pageNo 15 * @return if pageNo==null or pageNo<1 then return 1 else return pageNo 16 */ 17 public static int cpn(Integer pageNo) { 18 return (pageNo == null || pageNo < 1) ? 1 : pageNo; 19 } 20 21 public SimplePage() { 22 } 23 24 /** 25 * 构造器 26 * 27 * @param pageNo 28 * 页码 29 * @param pageSize 30 * 每页几条数据 31 * @param totalCount 32 * 总共几条数据 33 */ 34 public SimplePage(int pageNo, int pageSize, int totalCount) { 35 setTotalCount(totalCount); 36 setPageSize(pageSize); 37 setPageNo(pageNo); 38 adjustPageNo(); 39 40 } 41 42 /** 43 * 调整页码,使不超过最大页数 44 */ 45 public void adjustPageNo() { 46 if (pageNo == 1) { 47 return; 48 } 49 int tp = getTotalPage(); 50 if (pageNo > tp) { 51 pageNo = tp; 52 } 53 } 54 55 /** 56 * 获得页码 57 */ 58 public int getPageNo() { 59 return pageNo; 60 } 61 62 /** 63 * 每页几条数据 64 */ 65 public int getPageSize() { 66 return pageSize; 67 } 68 69 /** 70 * 总共几条数据 71 */ 72 public int getTotalCount() { 73 return totalCount; 74 } 75 76 /** 77 * 总共几页 78 */ 79 public int getTotalPage() { 80 int totalPage = totalCount / pageSize; 81 if (totalPage == 0 || totalCount % pageSize != 0) { 82 totalPage++; 83 } 84 return totalPage; 85 } 86 87 /** 88 * 是否第一页 89 */ 90 public boolean isFirstPage() { 91 return pageNo <= 1; 92 } 93 94 /** 95 * 是否最后一页 96 */ 97 public boolean isLastPage() { 98 return pageNo >= getTotalPage(); 99 }100 101 /**102 * 下一页页码103 */104 public int getNextPage() {105 if (isLastPage()) {106 return pageNo;107 } else {108 return pageNo + 1;109 }110 }111 112 /**113 * 上一页页码114 */115 public int getPrePage() {116 if (isFirstPage()) {117 return pageNo;118 } else {119 return pageNo - 1;120 }121 }122 123 protected int totalCount = 0;124 protected int pageSize = 20;125 protected int pageNo = 1;126 127 /**128 * if totalCount<0 then totalCount=0129 * 130 * @param totalCount131 */132 public void setTotalCount(int totalCount) {133 if (totalCount < 0) {134 this.totalCount = 0;135 } else {136 this.totalCount = totalCount;137 }138 }139 140 /**141 * if pageSize< 1 then pageSize=DEF_COUNT142 * 143 * @param pageSize144 */145 public void setPageSize(int pageSize) {146 if (pageSize < 1) {147 this.pageSize = DEF_COUNT;148 } else {149 this.pageSize = pageSize;150 }151 }152 153 /**154 * if pageNo < 1 then pageNo=1155 * 156 * @param pageNo157 */158 public void setPageNo(int pageNo) {159 if (pageNo < 1) {160 this.pageNo = 1;161 } else {162 this.pageNo = pageNo;163 }164 }165 }
Pagination.java:
1 package cn.itcast.common.page; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 /** 7 * 列表分页。包含list属性。 8 */ 9 public class Pagination extends SimplePage{ 10 11 public Pagination() { 12 } 13 14 /** 15 * 构造器 16 * 17 * @param pageNo 18 * 页码 19 * @param pageSize 20 * 每页几条数据 21 * @param totalCount 22 * 总共几条数据 23 */ 24 public Pagination(int pageNo, int pageSize, int totalCount) { 25 super(pageNo, pageSize, totalCount); 26 27 } 28 29 /** 30 * 构造器 31 * 32 * @param pageNo 33 * 页码 34 * @param pageSize 35 * 每页几条数据 36 * @param totalCount 37 * 总共几条数据 38 * @param list 39 * 分页内容 40 */ 41 public Pagination(int pageNo, int pageSize, int totalCount, List<?> list) { 42 super(pageNo, pageSize, totalCount); 43 this.list = list; 44 } 45 46 /** 47 * 第一条数据位置 48 * 49 * @return 50 */ 51 public int getFirstResult() { 52 return (pageNo - 1) * pageSize; 53 } 54 55 /** 56 * 当前页的数据 57 */ 58 private List<?> list; 59 60 /** 61 * 当前页的分页样式 62 */ 63 private List<String> pageView; 64 65 /** 66 * 获得分页内容 67 * 68 * @return 69 */ 70 public List<?> getList() { 71 return list; 72 } 73 74 /** 75 * 设置分页内容 76 * 77 * @param list 78 */ 79 @SuppressWarnings("unchecked") 80 public void setList(List list) { 81 this.list = list; 82 } 83 /** 84 * 获得分页样式 85 * 86 * @return 87 */ 88 public List<String> getPageView() { 89 return pageView; 90 } 91 /** 92 * 设置分页样式 93 * 94 * @param list 95 */ 96 public void setPageView(List<String> pageView) { 97 this.pageView = pageView; 98 } 99 100 101 /**102 * 分页显示样示部分103 */104 public void pageView(String url,String params){105 106 pageView = new ArrayList<String>();107 108 if(this.pageNo != 1){109 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo=1'\"><font size=2>首页</font></a>");110 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.pageNo-1)+"'\"><font size=2>上一页</font></a>");111 }else{112 pageView.add("<font size=2>首页</font>");113 pageView.add("<font size=2>上一页</font>");114 }115 116 if(this.getTotalPage() <= 10){117 for (int i = 0; i < this.getTotalPage(); i++) {118 if((i+1)==this.pageNo){119 pageView.add("<strong>"+this.pageNo+"</strong>");120 i = i+1;121 if(this.pageNo==this.getTotalPage())break;122 }123 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(i+1)+"'\">"+(i+1)+"</a>");124 }125 }else if(this.getTotalPage() <= 20){126 //没有把...加上127 int l = 0;128 int r = 0;129 if(this.pageNo<5){130 l=this.pageNo-1;131 r=10-l-1;132 }else if(this.getTotalPage()-this.pageNo<5){133 r=this.getTotalPage()-this.pageNo;134 l=10-1-r;135 }else{136 l=4;137 r=5;138 }139 int tmp = this.pageNo-l;140 for (int i = tmp; i < tmp+10; i++) {141 if(i==this.pageNo){142 pageView.add("<strong>"+this.pageNo+"</strong>");143 i = i+1;144 if(this.pageNo==this.getTotalPage()) break;145 }146 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(i)+"'\">"+(i)+"</a>");147 }148 149 }else if(this.pageNo<7){150 for (int i = 0; i < 8; i++) {151 if(i+1==this.pageNo){152 pageView.add("<strong>"+this.pageNo+"</strong>");153 i = i+1;154 }155 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(i+1)+"'\">"+(i+1)+"</a>");156 }157 pageView.add("...");158 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.getTotalPage()-1)+"'\">"+(this.getTotalPage()-1)+"</a>");159 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.getTotalPage())+"'\">"+(this.getTotalPage())+"</a>");160 }else if(this.pageNo>this.getTotalPage()-6){161 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(1)+"'\">"+(1)+"</a>");162 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(2)+"'\">"+(2)+"</a>");163 pageView.add("...");164 for (int i = this.getTotalPage()-8; i <this.getTotalPage() ; i++) {165 if(i+1==this.pageNo){166 pageView.add("<strong>"+this.pageNo+"</strong>");167 i = i+1;168 if(this.pageNo==this.getTotalPage()) break;169 }170 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(i+1)+"'\">"+(i+1)+"</a>");171 }172 }else{173 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(1)+"'\">"+(1)+"</a>");174 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(2)+"'\">"+(2)+"</a>");175 pageView.add("...");176 177 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.pageNo-2)+"'\">"+(this.pageNo-2)+"</a>");178 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.pageNo-1)+"'\">"+(this.pageNo-1)+"</a>");179 pageView.add("<strong>"+this.pageNo+"</strong>");180 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.pageNo+1)+"'\">"+(this.pageNo+1)+"</a>");181 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.pageNo+2)+"'\">"+(this.pageNo+2)+"</a>");182 183 pageView.add("...");184 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.getTotalPage()-1)+"'\">"+(this.getTotalPage()-1)+"</a>");185 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.getTotalPage())+"'\">"+(this.getTotalPage())+"</a>");186 } 187 if(this.pageNo != this.getTotalPage()){188 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.pageNo+1)+"'\"><font size=2>下一页</font></a>");189 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+this.getTotalPage()+"'\"><font size=2>尾页</font></a>");190 } else{191 pageView.add("<font size=2>下一页</font>");192 pageView.add("<font size=2>尾页</font>");193 }194 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() \"/>");195 }196 }
2, 下面源码就是需要自己在项目中构建
下面开始从Controller(babasport-console)-->ServiceImpl(babasport-product)-->DaoMapper(babasport-dao)-->jsp展示
Controller层:
BrandController.java:
1 package cn.itcast.core.controller; 2 3 import java.util.List; 4 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.stereotype.Controller; 7 import org.springframework.ui.Model; 8 import org.springframework.web.bind.annotation.RequestMapping; 9 10 import cn.itcast.common.page.Pagination;11 import cn.itcast.core.bean.product.Brand;12 import cn.itcast.core.service.product.BrandService;13 14 /*15 * 品牌16 */17 @Controller18 @RequestMapping(value="/brand")19 public class BrandController {20 21 @Autowired22 private BrandService brandService;23 24 @RequestMapping(value="/list.do")25 public String list(Integer pageNo, String name, Integer isDisplay, Model model){26 //List<Brand> brands = brandService.selectBrandListByQuery(name, isDisplay);27 Pagination pagination = brandService.selectPaginationByQuery(pageNo, name, isDisplay);28 model.addAttribute("pagination", pagination);29 //回显查询条件30 model.addAttribute("name", name);31 if(isDisplay != null){32 model.addAttribute("isDisplay", isDisplay);33 }else{34 model.addAttribute("isDisplay", 1);35 }36 return "brand/list";37 }38 39 @RequestMapping(value="/toEdit.do")40 public String selectBrandById(Long id, Model model){41 42 Brand brand = brandService.selectBrandById(id);43 model.addAttribute("brand", brand);44 45 return "brand/edit";46 }47 }
解析: 这个controller 包括两个方法, 一个是查询分页数据, 另一个是根据ID 回显数据.
两个方法都很简单, 第一个就是根据页面传递过来的当前页数和查询条件通过service层去做进一步处理后再通过Dao层去查询结果, 将查询的结果返回后再封装到Model里面, 然后转发到视图层.
第二个方法更简单了, 通过Id查询到相应的商品然后回显数据即可.
Service层:
BrandServiceImpl.java:
1 package cn.itcast.core.service.product; 2 3 import java.util.List; 4 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.stereotype.Service; 7 import org.springframework.transaction.annotation.Transactional; 8 9 import cn.itcast.common.page.Pagination;10 import cn.itcast.core.bean.product.Brand;11 import cn.itcast.core.bean.product.BrandQuery;12 import cn.itcast.core.dao.product.BrandDao;13 @Service("brandService")14 @Transactional15 public class BrandServiceImpl implements BrandService {16 17 @Autowired18 private BrandDao brandDao;19 20 @Override21 public List<Brand> selectBrandListByQuery(String name, Integer isDisplay) {22 BrandQuery brandQuery = new BrandQuery();23 if (name != null) {24 brandQuery.setName(name);25 }26 if (isDisplay != null) {27 brandQuery.setIsDisplay(isDisplay);28 }29 else {30 //是: 1, 否:031 brandQuery.setIsDisplay(1);32 }33 34 return brandDao.selectBrandListByQuery(brandQuery);35 }36 37 //分页38 public Pagination selectPaginationByQuery(Integer pageNo, String name, Integer isDisplay) {39 BrandQuery brandQuery = new BrandQuery();40 //设置当前页 cpn方法: 如果pageNumber 是null或者 小于1, 那么就将pageNumber设置为1, 如果不是则使用传递进来的pageNumber41 brandQuery.setPageNo(Pagination.cpn(pageNo));42 //设置每页数43 brandQuery.setPageSize(3);44 45 //拼接条件46 StringBuilder sb = new StringBuilder();47 48 if (name != null) {49 brandQuery.setName(name);50 sb.append("name=").append(name);51 }52 53 if (isDisplay != null) {54 brandQuery.setIsDisplay(isDisplay);55 sb.append("&isDisplay=").append(isDisplay);56 }57 else {58 //是: 1, 否:059 brandQuery.setIsDisplay(1);60 sb.append("&isDisplay=").append(1);61 }62 //构建分页对象63 //三个参数: 当前页,每页显示行数,总记录数64 Pagination pagination = new Pagination(brandQuery.getPageNo(), brandQuery.getPageSize(), brandDao.selectCount(brandQuery));65 //查询结果集66 //使用查询语句: select * from bbs_brand where ... limit (pageNumber - 1) * 3, 367 pagination.setList(brandDao.selectBrandListByQuery(brandQuery));68 69 //分页在页面显示 /brand/list.do?name=aaa&&isDisplay=070 String url = "/brand/list.do";71 pagination.pageView(url, sb.toString());72 73 return pagination;74 }75 76 //通过ID查询一个品牌77 public Brand selectBrandById(Long id){78 return brandDao.selectBrandById(id);79 }80 81 }
解析: Service层中主要来说第二个分页的方法.
1 brandQuery.setPageNo(Pagination.cpn(pageNo));
这个cpn方法是Pagination中封装好的静态方法, 我们来看下源码:
1 /**2 * 检查页码 checkPageNo3 * 4 * @param pageNo5 * @return if pageNo==null or pageNo<1 then return 1 else return pageNo6 */7 public static int cpn(Integer pageNo) {8 return (pageNo == null || pageNo < 1) ? 1 : pageNo;9 }
使用StringBuilder 封装查询条件, 因为当我们根据查询条件查询到的数据也有分页效果时, 这时候我们点击页码的按钮时跳转到相应的页数后, 查询条件也应该回显.
1 //构建分页对象 2 //三个参数: 当前页,每页显示行数,总记录数 3 Pagination pagination = new Pagination(brandQuery.getPageNo(), brandQuery.getPageSize(), brandDao.selectCount(brandQuery)); 4 //查询结果集 5 //使用查询语句: select * from bbs_brand where ... limit (pageNumber - 1) * 3, 3 6 pagination.setList(brandDao.selectBrandListByQuery(brandQuery)); 7 8 //分页在页面显示 /brand/list.do?name=aaa&&isDisplay=0 9 String url = "/brand/list.do";10 pagination.pageView(url, sb.toString());
构建分页对象, 将查询的结果封装到pagination中, 且 将url和封装的条件封装到pageView中. 这里因为页码按钮的样式是固定的, 不固定的只是我们点击 每一个按钮跳转的url和查询的条件不同, 所以这里使用pageView属性来封装url和查询条件.
Dao层:
BrandDao.xml:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 3 4 <mapper namespace="cn.itcast.core.dao.product.BrandDao"> 5 6 <resultMap type="Brand" id="brand"> 7 <result column="img_url" property="imgUrl"/> 8 <result column="is_display" property="isDisplay"/> 9 </resultMap>10 <!-- 查询品牌结果集 List<Brand> -->11 <select id="selectBrandListByQuery" parameterType="BrandQuery" resultMap="brand">12 select id ,name,description,img_url,is_display,sort13 from bbs_brand14 <where>15 <if test="name != null">16 name like "%"#{name}"%"17 </if>18 <if test="isDisplay != null">19 and is_display = #{isDisplay}20 </if>21 </where>22 <if test="startRow != null">23 limit #{startRow}, #{pageSize}24 </if>25 </select>26 27 <!-- 查询品牌结果集 List<Brand> -->28 <select id="selectCount" parameterType="BrandQuery" resultType="Integer">29 select count(1)30 from bbs_brand31 <where>32 <if test="name != null">33 name like "%"#{name}"%"34 </if>35 <if test="isDisplay != null">36 and is_display = #{isDisplay}37 </if>38 </where>39 </select>40 41 <!-- 根据ID查询 -->42 <select id="selectBrandById" parameterType="Long" resultMap="brand">43 select id ,name,description,img_url,is_display,sort44 from bbs_brand45 <where>46 id = #{id}47 </where>48 </select>49 </mapper>
Model
BrandQuery.java:
1 package cn.itcast.core.bean.product; 2 3 import java.io.Serializable; 4 5 public class BrandQuery implements Serializable{ 6 /** 7 * 默认的ID 8 */ 9 private static final long serialVersionUID = 1L; 10 11 //品牌ID bigint 12 private Long id; 13 //品牌名称 14 private String name; 15 //描述 16 private String description; 17 //图片URL 18 private String imgUrl; 19 //排序 越大越靠前 20 private Integer sort; 21 //是否可用 0 不可用 1 可用 22 private Integer isDisplay;//is_display 23 public Long getId() { 24 return id; 25 } 26 public void setId(Long id) { 27 this.id = id; 28 } 29 public String getName() { 30 return name; 31 } 32 public void setName(String name) { 33 this.name = name; 34 } 35 public String getDescription() { 36 return description; 37 } 38 public void setDescription(String description) { 39 this.description = description; 40 } 41 public String getImgUrl() { 42 return imgUrl; 43 } 44 public void setImgUrl(String imgUrl) { 45 this.imgUrl = imgUrl; 46 } 47 public Integer getSort() { 48 return sort; 49 } 50 public void setSort(Integer sort) { 51 this.sort = sort; 52 } 53 public Integer getIsDisplay() { 54 return isDisplay; 55 } 56 public void setIsDisplay(Integer isDisplay) { 57 this.isDisplay = isDisplay; 58 } 59 public static long getSerialversionuid() { 60 return serialVersionUID; 61 } 62 @Override 63 public String toString() { 64 return "Brand [id=" + id + ", name=" + name + ", description=" + description + ", imgUrl=" + imgUrl + ", sort=" 65 + sort + ", isDisplay=" + isDisplay + "]"; 66 } 67 68 //附加字段 69 //当前页 70 private Integer pageNo = 1; 71 72 //每页数 73 private Integer pageSize = 10; 74 75 //开始行 76 private Integer startRow; 77 public Integer getPageNo() { 78 return pageNo; 79 } 80 public void setPageNo(Integer pageNo) { 81 //计算开始行 82 this.startRow = (pageNo - 1)*pageSize; 83 this.pageNo = pageNo; 84 } 85 public Integer getPageSize() { 86 return pageSize; 87 } 88 public void setPageSize(Integer pageSize) { 89 //计算开始行 90 this.startRow = (pageNo - 1)*pageSize; 91 this.pageSize = pageSize; 92 } 93 public Integer getStartRow() { 94 return startRow; 95 } 96 public void setStartRow(Integer startRow) { 97 this.startRow = startRow; 98 } 99 100 101 }
解析: mapper和model
这里model这接计算好了startRow, 所以在mapper就可以直接查询了.
1 //附加字段 2 //当前页 3 private Integer pageNo = 1; 4 5 //每页数 6 private Integer pageSize = 10; 7 8 //开始行 9 private Integer startRow;10 public Integer getPageNo() {11 return pageNo;12 }13 public void setPageNo(Integer pageNo) {14 //计算开始行15 this.startRow = (pageNo - 1)*pageSize;16 this.pageNo = pageNo;17 }18 public Integer getPageSize() {19 return pageSize;20 }21 public void setPageSize(Integer pageSize) {22 //计算开始行23 this.startRow = (pageNo - 1)*pageSize;24 this.pageSize = pageSize;25 }26 public Integer getStartRow() {27 return startRow;28 }29 public void setStartRow(Integer startRow) {30 this.startRow = startRow;31 }
View层:
list.jsp:
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@ include file="../head.jsp" %> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 4 <html xmlns="http://www.w3.org/1999/xhtml"> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 7 <title>babasport-list</title> 8 </head> 9 <body>10 <div class="box-positon">11 <div class="rpos">当前位置: 品牌管理 - 列表</div>12 <form class="ropt">13 <input class="add" type="button" value="添加" onclick="javascript:window.location.href='add.jsp'"/>14 </form>15 <div class="clear"></div>16 </div>17 <div class="body-box">18 <form action="/brand/list.do" method="post" style="padding-top:5px;">19 品牌名称: <input type="text" name="name" value="${name}"/>20 <select name="isDisplay"> 21 <option value="1" <c:if test="${isDisplay==1 }">selected="selected"</c:if>>是</option>22 <option value="0" <c:if test="${isDisplay==0 }">selected="selected"</c:if>>否</option>23 </select>24 <input type="submit" class="query" value="查询"/>25 </form>26 <table cellspacing="1" cellpadding="0" border="0" width="100%" class="pn-ltable">27 <thead class="pn-lthead">28 <tr>29 <th width="20"><input type="checkbox" onclick="checkBox('ids',this.checked)"/></th>30 <th>品牌ID</th>31 <th>品牌名称</th>32 <th>品牌图片</th>33 <th>品牌描述</th>34 <th>排序</th>35 <th>是否可用</th>36 <th>操作选项</th>37 </tr>38 </thead>39 <tbody class="pn-ltbody">40 <c:forEach items="${pagination.list }" var="brand">41 <tr bgcolor="#ffffff" onmouseout="this.bgColor='#ffffff'" onmouseover="this.bgColor='#eeeeee'">42 <td><input type="checkbox" value="${brand.id }" name="ids"/></td>43 <td align="center">${brand.id }</td>44 <td align="center">${brand.name }</td>45 <td align="center"><img width="40" height="40" src="/images/pic/ppp.jpg"/></td>46 <td align="center"></td>47 <td align="center">${brand.sort}</td>48 <td align="center">49 <c:if test="${brand.isDisplay == 1 }">是</c:if>50 <c:if test="${brand.isDisplay == 0 }">否</c:if>51 </td>52 <td align="center">53 <a class="pn-opt" href="/brand/toEdit.do?id=${brand.id}">修改</a> | <a class="pn-opt" onclick="if(!confirm('您确定删除吗?')) {return false;}" href="#">删除</a>54 </td>55 </tr>56 57 </c:forEach>58 59 </tbody>60 </table>61 <div class="page pb15">62 <span class="r inb_a page_b">63 <c:forEach items="${pagination.pageView }" var="page">64 ${page }65 </c:forEach>66 </span>67 </div>68 <div style="margin-top:15px;"><input class="del-button" type="button" value="删除" onclick="optDelete();"/></div>69 </div>70 </body>71 </html>
解析: 这里需要添加一些必要的说明:
这里 在显示分页页码的时候直接使用了 ${page}, 到底这个是怎么实现的呢? 下面来看下源码中的pageView.
1 /** 2 * 分页显示样示部分 3 */ 4 public void pageView(String url,String params){ 5 6 pageView = new ArrayList<String>(); 7 8 if(this.pageNo != 1){ 9 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo=1'\"><font size=2>首页</font></a>");10 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.pageNo-1)+"'\"><font size=2>上一页</font></a>");11 }else{12 pageView.add("<font size=2>首页</font>");13 pageView.add("<font size=2>上一页</font>");14 }15 16 if(this.getTotalPage() <= 10){17 for (int i = 0; i < this.getTotalPage(); i++) {18 if((i+1)==this.pageNo){19 pageView.add("<strong>"+this.pageNo+"</strong>");20 i = i+1;21 if(this.pageNo==this.getTotalPage())break;22 }23 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(i+1)+"'\">"+(i+1)+"</a>");24 }25 }else if(this.getTotalPage() <= 20){26 //没有把...加上27 int l = 0;28 int r = 0;29 if(this.pageNo<5){30 l=this.pageNo-1;31 r=10-l-1;32 }else if(this.getTotalPage()-this.pageNo<5){33 r=this.getTotalPage()-this.pageNo;34 l=10-1-r;35 }else{36 l=4;37 r=5;38 }39 int tmp = this.pageNo-l;40 for (int i = tmp; i < tmp+10; i++) {41 if(i==this.pageNo){42 pageView.add("<strong>"+this.pageNo+"</strong>");43 i = i+1;44 if(this.pageNo==this.getTotalPage()) break;45 }46 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(i)+"'\">"+(i)+"</a>");47 }48 49 }else if(this.pageNo<7){50 for (int i = 0; i < 8; i++) {51 if(i+1==this.pageNo){52 pageView.add("<strong>"+this.pageNo+"</strong>");53 i = i+1;54 }55 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(i+1)+"'\">"+(i+1)+"</a>");56 }57 pageView.add("...");58 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.getTotalPage()-1)+"'\">"+(this.getTotalPage()-1)+"</a>");59 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.getTotalPage())+"'\">"+(this.getTotalPage())+"</a>");60 }else if(this.pageNo>this.getTotalPage()-6){61 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(1)+"'\">"+(1)+"</a>");62 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(2)+"'\">"+(2)+"</a>");63 pageView.add("...");64 for (int i = this.getTotalPage()-8; i <this.getTotalPage() ; i++) {65 if(i+1==this.pageNo){66 pageView.add("<strong>"+this.pageNo+"</strong>");67 i = i+1;68 if(this.pageNo==this.getTotalPage()) break;69 }70 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(i+1)+"'\">"+(i+1)+"</a>");71 }72 }else{73 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(1)+"'\">"+(1)+"</a>");74 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(2)+"'\">"+(2)+"</a>");75 pageView.add("...");76 77 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.pageNo-2)+"'\">"+(this.pageNo-2)+"</a>");78 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.pageNo-1)+"'\">"+(this.pageNo-1)+"</a>");79 pageView.add("<strong>"+this.pageNo+"</strong>");80 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.pageNo+1)+"'\">"+(this.pageNo+1)+"</a>");81 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.pageNo+2)+"'\">"+(this.pageNo+2)+"</a>");82 83 pageView.add("...");84 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.getTotalPage()-1)+"'\">"+(this.getTotalPage()-1)+"</a>");85 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.getTotalPage())+"'\">"+(this.getTotalPage())+"</a>");86 } 87 if(this.pageNo != this.getTotalPage()){88 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+(this.pageNo+1)+"'\"><font size=2>下一页</font></a>");89 pageView.add("<a href=\"javascript:void(0);\" onclick=\"javascript:window.location.href='" + url + "?" + params + "&pageNo="+this.getTotalPage()+"'\"><font size=2>尾页</font></a>");90 } else{91 pageView.add("<font size=2>下一页</font>");92 pageView.add("<font size=2>尾页</font>");93 }94 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() \"/>");95 }
这里是直接将展示页拼接了出来, 而且加了url和查询参数.
到了这里整个分页的流程就搞完了, 下面来看下整体效果:
- mybatis结合分页的使用及解析.
- 自定义分页标签结合spring mvc、bootstrap、mybatis、mysql的使用
- Mybatis逆向工程及分页插件的使用
- Mybatis的分页插件PageHelper使用及注意事项
- mybatis分页插件使用(spring4.1.4结合mybatis3.2.8)
- Mybatis使用及原理解析
- Mybatis使用及原理解析
- Mybatis使用及原理解析
- mybatis 分页插件pagehelper集成及使用
- mybatis分页插件的使用
- 【MyBatis】MyBatis分页插件PageHelper的使用
- 【MyBatis】MyBatis分页插件PageHelper的使用
- 【MyBatis】MyBatis分页插件PageHelper的使用
- [项目构建]babasport 分页的使用及解析.
- Struts2结合Bootstrap-Table分页的使用
- MyBatis与Spring的结合使用
- springmvc 结合使用mybatis 的问题汇总
- Mybatis中分页插件PageHelper的使用
- SSM 三大框架整合
- 支持一下中国芯 “致龙芯15周年 胡伟武披露龙芯3号开发历程”
- Dubbo的使用及原理浅析.
- 用PythonPi实现门禁系统-功能实现
- C语言 线程临界资源--critical section
- mybatis结合分页的使用及解析.
- ajax图片上传及FastDFS入门案例.
- jquery获取当前天加减一天
- Mybatis逆向工程构建项目实例.
- [Java集合] 彻底搞懂HashMap,HashTable,ConcurrentHashMap之关联.
- [Redis]Redis 概述及基本使用规范.
- Session 'app': Error Launching activity
- Redis的介绍及使用实例.
- [常见问题]在Linux下执行Redis命令不起作用.