SSM框架下分页的实现(封装page.java和List<?>)

来源:互联网 发布:mac dock栏图标隐藏 编辑:程序博客网 时间:2024/06/04 20:12

实现分页时,我们需要向页面中传两个参数:

  • page对象(封装了页码,页容,总页数,总记录数,取得选择记录的初始位置)
  • 集合对象(封装了bean类的信息)

也就是说,我们需要从service层获取到两个值,但是一个函数只有返回值(?),如何解决?

(1)第一种:写两个函数不就行了;

(2)第二种:添加引用;

(3)第三种:封装:

  ① 将 List 封装到 Page 中

  ② 新建一个类,封装 Page 和 List 

个人认为,分开写比较好(3.2),

1、新建一个 LimitPageList 

复制代码
 1 public class LimitPageList { 2     private Page page; 3     private List<?> list; 4     public Page getPage() { 5         return page; 6     } 7     public void setPage(Page page) { 8         this.page = page; 9     }10     public List<?> getList() {11         return list;12     }13     public void setList(List<?> list) {14         this.list = list;15     }16 }
复制代码

Page工具类

复制代码
 1 public class Page implements Serializable { 2     private static final long serialVersionUID = -3198048449643774660L; 3  4     private int pageNow = 1; // 当前页数 5  6     private int pageSize = 10; // 每页显示记录的条数 7  8     private int totalCount; // 总的记录条数 9 10     private int totalPageCount; // 总的页数11 12     @SuppressWarnings("unused")13     private int startPos; // 开始位置,从0开始14     15     public Page(){}16     17     //通过构造函数 传入 总记录数 和 当前页18     public Page(int totalCount, int pageNow) {19         this.totalCount = totalCount;20         this.pageNow = pageNow;21     }22 23     //取得总页数,总页数=总记录数/每页显示记录的条数24     public int getTotalPageCount() {25         totalPageCount = getTotalCount() / getPageSize();26         return (totalCount % pageSize == 0) ? totalPageCount : totalPageCount + 1;27     }28 29     public void setTotalPageCount(int totalPageCount) {30         this.totalPageCount = totalPageCount;31     }32 33     public int getPageNow() {34         return pageNow;35     }36 37     public void setPageNow(int pageNow) {38         this.pageNow = pageNow;39     }40 41     public int getPageSize() {42         return pageSize;43     }44 45     public void setPageSize(int pageSize) {46         this.pageSize = pageSize;47     }48 49     public int getTotalCount() {50         return totalCount;51     }52 53     public void setTotalCount(int totalCount) {54         this.totalCount = totalCount;55     }56 57     //取得选择记录的初始位置58     public int getStartPos() {59         return (pageNow - 1) * pageSize;60     }61     62 }
复制代码

2、在mapper层实现获取分页记录获取总的记录数的方法,并在 xml 文件中做实现

复制代码
 1 public interface StudentMapper { 2     /** 3      * 获取分页记录 4      * @param startPos:从数据库中第几行开始获取 5      * @param pageSize:获取的条数 6      * @return 返回pageSize条数据的集合,数据足够多 7      */ 8     List<Student> selectByPage(@Param(value = "startPos") Integer startPos, 9             @Param(value = "pageSize") Integer pageSize);10     11     /**12      * 获取数据库总的记录数13      * @return 返回数据库表的总条数14      */15     int getCount();16     17 }
复制代码
复制代码
 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 <mapper namespace="com.bwlu.mapper.StudentMapper" > 4   <resultMap id="BaseResultMap" type="com.bwlu.bean.Student" > 5     <id column="stu_id" property="stu_id" jdbcType="INTEGER" /> 6     <result column="stu_name" property="stu_name" jdbcType="VARCHAR" /> 7     <result column="stu_age" property="stu_age" jdbcType="INTEGER" /> 8     <result column="stu_gender" property="stu_gender" jdbcType="INTEGER" /> 9   </resultMap>10   11     <!-- 分页SQL语句 -->  12     <select id="selectByPage" resultMap="BaseResultMap">  13         select *  from student limit #{startPos},#{pageSize}14     </select>  15     16     <!-- 取得记录的总数 -->  17     <select id="getCount" resultType="java.lang.Integer">18         SELECT COUNT(*) FROM student  19     </select> 20     21 </mapper>
复制代码

3、在service层添加业务逻辑(方法)

复制代码
 1 @Autowired 2 private StudentMapper studentMapper; 3 /** 4  * 获取分页记录 5  * @param pageNow:当前页码,若为null值,则为1 6  * @return 返回page和list集合 7  */ 8 public LimitPageList getLimitPageList(Integer pageNow) { 9     LimitPageList LimitPageStuList = new LimitPageList();10     int totalCount=studentMapper.getCount();//获取总的记录数11     List<Student> stuList=new ArrayList<Student>();12     Page page=null;13     if(pageNow!=null){14         page=new Page(totalCount, pageNow);15         page.setPageSize(4);16         stuList=studentMapper.selectByPage(page.getStartPos(), page.getPageSize());//从startPos开始,获取pageSize条数据17     }else{18         page=new Page(totalCount, 1);//初始化pageNow为119         page.setPageSize(4);20         stuList=studentMapper.selectByPage(page.getStartPos(), page.getPageSize());//从startPos开始,获取pageSize条数据21     }22     LimitPageStuList.setPage(page);23     LimitPageStuList.setList(stuList);24     return LimitPageStuList;25 }
复制代码

4、controller实现

复制代码
 1 @Autowired 2 private StudentService studentService; 3 @RequestMapping(value="/show",method=RequestMethod.GET) 4 public String getStuList(Model m,@RequestParam(value="pageNow",required=false) Integer pageNow){ 5     LimitPageList limitPageStuList = studentService.getLimitPageList(pageNow); 6     Page page = limitPageStuList.getPage(); 7     //强制类型转换 8     List<Student> stuList = (List<Student>) limitPageStuList.getList(); 9     m.addAttribute("page", page);10     m.addAttribute("stuList", stuList);11     return "student/showInfo";12 }
复制代码

5、页面实现

复制代码
 1 <%@page import="com.bwlu.common.Page"%> 2 <%@ page language="java" contentType="text/html; charset=UTF-8" 3     pageEncoding="UTF-8"%> 4 <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 5 <% 6     String rootPath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/"; 7 %> 8 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 9 <html>10 <head>11 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">12 <title>Insert title here</title>13 <link href="<%=rootPath %>public/css/pageBar.css" rel="stylesheet" type="text/css"/>14 <script type="text/javascript" src="<%=rootPath %>public/js/jquery-3.2.1.js"></script>15 <script type="text/javascript" src="<%=rootPath %>public/js/jquery-3.2.1.min.js"></script>16 </head>17 <body>18     <div class="page_nav">19         <c:choose>20             <c:when test="${page.totalPageCount <= 10}"><!-- 如果总页数小于10,则全部显示 -->21                 <c:set var="begin" value="1"></c:set>22                 <c:set var="end" value="${page.totalPageCount }"></c:set>23             </c:when>24             <c:when test="${page.pageNow <= 5 }"><!-- 如果总页数小于5,则显示1-10页 -->25                 <c:set var="begin" value="1"></c:set>26                 <c:set var="end" value="10"></c:set>27             </c:when>28             <c:otherwise><!-- 否则,显示前5页和后5页,保证当前页在中间 -->29                 <c:set var="begin" value="${page.pageNow-5 }"></c:set>30                 <c:set var="end" value="${page.pageNow+5 }"></c:set>31                 <c:if test="${end > page.totalPageCount }"><!-- 如果end值小于总的记录数,则显示最后10页 -->32                     <c:set var="end" value="${page.totalPageCount}"></c:set>33                     <c:set var="begin" value="${end-10 }"></c:set>34                 </c:if>35             </c:otherwise>36         </c:choose>37         <c:choose>38             <c:when test="${page.pageNow != 1 }"><!-- 如果当前页为1,则不显示首页和上一页 -->39                 <a href="?pageNow=1">首页</a> 40                 <a href="?pageNow=${page.pageNow-1 }">上一页</a>41             </c:when>42         </c:choose>43         <!-- 遍历页码 -->44         <c:forEach begin="${begin }" end="${end }" var="index">45             <c:choose>46                 <c:when test="${page.pageNow == index }"><!-- 如果为当前页,则特殊显示 -->47                     <a style="height:24px; margin:0 3px; border:none; background:#C00;">${index}</a>48                 </c:when>49                 <c:otherwise><!-- 否则,普通显示 -->50                     <a href="?pageNow=${index }">${index }</a>51                 </c:otherwise>52             </c:choose>53         </c:forEach>54         <c:choose>55             <c:when test="${page.pageNow != page.totalPageCount }"><!-- 如果当前页为总的记录数,则不显示末页和下一页 -->56                 <a href="?pageNow=${page.pageNow+1 }">下一页</a> 57                 <a href="?pageNow=${page.totalPageCount }">末页</a>58             </c:when>59         </c:choose>60         共${page.totalPageCount }页,${page.totalCount }条记录 到第<input61             value="${page.pageNow }" name="pn" id="pn_input" /><input62             id="pn_btn" type="button" value="确定">63         <script type="text/javascript">64             //为按钮绑定一个单击响应函数65             $("#pn_btn").click(function() {66                 //获取到要跳转的页码67                 var pageNow = $("#pn_input").val();68                 //通过修改window.location属性跳转到另一个页面69                 window.location = "?pageNow=" + pageNow;70             });71         </script>72     </div>73 </body>74 </html>

原创粉丝点击