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

之前写过一篇博客  java分页的实现(后台工具类和前台jsp页面),介绍了分页的原理。

今天整合了Spring和SpringMVC和MyBatis,做了增删改查和分页,之前的逻辑都写在了Servlet里,

如今用了SSM框架,业务逻辑应该放在业务层(service),

这里有一个小问题:实现分页时,我们需要向页面中传两个参数:

  • 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 }
Page

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 }
StudentMapper.java
 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>
StudentMapper.xml

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为1
19         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 }条记录 到第<input
61             value="${page.pageNow }" name="pn" id="pn_input" /><input
62             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>
page.jsp

 

posted @ 2017-09-04 17:10  bwlu---ed  阅读(11140)  评论(1编辑  收藏  举报