1、首先,新建一個類Page.java
1 public class Page implements Serializable { 2 private static final long serialVersionUID = -3198048449643774660L; 3 private int pageNow = 1; // 當前頁數 4 private int pageSize = 10; // 每頁顯示記錄的條數 5 private int totalCount; // 總記錄條數 6 private int totalPageCount; // 總頁數 7 private int startPos; // 開始位置,從0開始 8 //構造函數,參數:總記錄數和當前頁 9 public Page(int totalCount, int pageNow) { 10 this.totalCount = totalCount; 11 this.pageNow = pageNow; 12 } 13 //計算總頁數,總頁數=總記錄數/每頁顯示記錄的條數 14 public int getTotalPageCount() { 15 totalPageCount = getTotalCount() / getPageSize(); 16 return (totalCount % pageSize == 0) ? totalPageCount : totalPageCount + 1; 17 } 18 public void setTotalPageCount(int totalPageCount) { 19 this.totalPageCount = totalPageCount; 20 } 21 public int getPageNow() { 22 return pageNow; 23 } 24 public void setPageNow(int pageNow) { 25 this.pageNow = pageNow; 26 } 27 public int getPageSize() { 28 return pageSize; 29 } 30 public void setPageSize(int pageSize) { 31 this.pageSize = pageSize; 32 } 33 public int getTotalCount() { 34 return totalCount; 35 } 36 public void setTotalCount(int totalCount) { 37 this.totalCount = totalCount; 38 } 39 //取得選擇記錄的初始位置 40 public int getStartPos() { 41 return (pageNow - 1) * pageSize; 42 } 43 }
2、在Dao層加入兩個方法,分別獲取總的記錄數和每頁顯示的list集合,DBUtil.java是數據庫工具類。
1 // 獲取總的記錄數 2 public static int getCount() throws SQLException { 3 Connection conn = DBUtil.getConn(); 4 PreparedStatement pst = null; 5 String sql = "select count(*) from users"; 6 pst = conn.prepareStatement(sql); 7 ResultSet rs = pst.executeQuery(); 8 int count=0; 9 if(rs.next()){ 10 count=rs.getInt(1); 11 } 12 DBUtil.close(conn, pst, rs); 13 return count; 14 } 15 // 分頁查找 16 public static ArrayList<Users> findByPage(int pos, int size) throws SQLException { 17 Connection conn = DBUtil.getConn(); 18 ArrayList<Users> userList = new ArrayList<Users>(); 19 PreparedStatement pst = null; 20 String sql = "select * from users limit ?,?"; 21 pst = conn.prepareStatement(sql); 22 pst.setInt(1, pos); 23 pst.setInt(2, size); 24 ResultSet rs = pst.executeQuery(); 25 while (rs.next()) { 26 Users user = new Users(); 27 user.setUserid(rs.getInt(1)); 28 user.setUsername(rs.getString(2)); 29 } 30 DBUtil.close(conn, pst, rs); 31 return userList; 32 }
3、在Servlet中調用Dao層的方法,並向頁面傳遞參數,
1 String pageNow=request.getParameter("pageNow");//獲取當前頁 2 int totalCount=UsersDao.getCount();//獲取總的記錄數 3 List<Users> userList=new ArrayList<Users>(); 4 Page page=null; 5 if(pageNow!=null){ 6 page=new Page(totalCount, Integer.parseInt(pageNow)); 7 userList=UsersDao.findByPage(page.getStartPos(), page.getPageSize());//從startPos開始,獲取pageSize條數據 8 }else{ 9 page=new Page(totalCount, 1);//初始化pageNow為1 10 userList=UsersDao.findByPage(page.getStartPos(), page.getPageSize());//從startPos開始,獲取pageSize條數據 11 } 12 request.setAttribute("page", page); 13 request.setAttribute("userList", userList); 14 request.getRequestDispatcher("/WEB-INF/views/homePage.jsp").forward(request, response);
4、在jsp頁面中添加如下代碼:
1 <body> 2 <div class="page_nav"> 3 <c:choose> 4 <c:when test="${page.totalPageCount <= 10}"><!-- 如果總頁數小於10,則全部顯示 --> 5 <c:set var="begin" value="1"></c:set> 6 <c:set var="end" value="${page.totalPageCount }"></c:set> 7 </c:when> 8 <c:when test="${page.pageNow <= 5 }"><!-- 如果總頁數小於5,則顯示1-10頁 --> 9 <c:set var="begin" value="1"></c:set> 10 <c:set var="end" value="10"></c:set> 11 </c:when> 12 <c:otherwise><!-- 否則,顯示前5頁和后5頁,保證當前頁在中間 --> 13 <c:set var="begin" value="${page.pageNow-5 }"></c:set> 14 <c:set var="end" value="${page.pageNow+5 }"></c:set> 15 <c:if test="${end > page.totalPageCount }"><!-- 如果end值小於總的記錄數,則顯示最后10頁 --> 16 <c:set var="end" value="${page.totalPageCount}"></c:set> 17 <c:set var="begin" value="${end-10 }"></c:set> 18 </c:if> 19 </c:otherwise> 20 </c:choose> 21 <c:choose> 22 <c:when test="${page.pageNow != 1 }"><!-- 如果當前頁為1,則不顯示首頁和上一頁 --> 23 <a href="?oper=login&pageNow=1">首頁</a> 24 <a href="?oper=login&pageNow=${page.pageNow-1 }">上一頁</a> 25 </c:when> 26 </c:choose> 27 <!-- 遍歷頁碼 --> 28 <c:forEach begin="${begin }" end="${end }" var="index"> 29 <c:choose> 30 <c:when test="${page.pageNow == index }"><!-- 如果為當前頁,則特殊顯示 --> 31 <a style="height:24px; margin:0 3px; border:none; background:#C00;">${index}</a> 32 </c:when> 33 <c:otherwise><!-- 否則,普通顯示 --> 34 <a href="?oper=login&pageNow=${index }">${index }</a> 35 </c:otherwise> 36 </c:choose> 37 </c:forEach> 38 <c:choose> 39 <c:when test="${page.pageNow != page.totalPageCount }"><!-- 如果當前頁為總的記錄數,則不顯示末頁和下一頁 --> 40 <a href="?oper=login&pageNow=${page.pageNow+1 }">下一頁</a> 41 <a href="?oper=login&pageNow=${page.totalPageCount }">末頁</a> 42 </c:when> 43 </c:choose> 44 共${page.totalPageCount }頁,${page.totalCount }條記錄 到第<input 45 value="${page.pageNow }" name="pn" id="pn_input" />頁 <input 46 id="pn_btn" type="button" value="確定"> 47 <script type="text/javascript"> 48 //為按鈕綁定一個單擊響應函數 49 $("#pn_btn").click(function() { 50 //獲取到要跳轉的頁碼 51 var pageNow = $("#pn_input").val(); 52 //通過修改window.location屬性跳轉到另一個頁面 53 window.location = "?oper=login&pageNow=" + pageNow; 54 }); 55 </script> 56 </div> 57 </body>
最后附上數據庫工具類代碼DBUtil:
1 package com.bwlu.common; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.PreparedStatement; 6 import java.sql.ResultSet; 7 import java.sql.SQLException; 8 9 public class DBUtil { 10 11 private static String DRIVER = null; 12 13 private static String URL = null; 14 15 private static String USERNAME = null; 16 17 private static String PASSWORD = null; 18 19 static { 20 DRIVER = "com.mysql.jdbc.Driver"; 21 URL = "jdbc:mysql://localhost:3306/mytest"; 22 USERNAME = "root"; 23 PASSWORD = "mysql"; 24 } 25 26 public static Connection getConn() { 27 Connection conn = null; 28 try { 29 /* 加載驅動 */ 30 // System.out.println(DRIVER); 31 Class.forName(DRIVER); 32 /* 獲取連接 */ 33 conn = DriverManager.getConnection(URL, USERNAME, PASSWORD); 34 35 } catch (ClassNotFoundException e) { 36 e.printStackTrace(); 37 } catch (SQLException e) { 38 e.printStackTrace(); 39 } 40 return conn; 41 } 42 43 // 關閉連接 44 public static void close(Connection conn, PreparedStatement ps, ResultSet rs) { 45 try { 46 if (rs != null) { 47 rs.close(); 48 } 49 if (ps != null) { 50 ps.close(); 51 } 52 if (conn != null) { 53 conn.close(); 54 } 55 } catch (SQLException e) { 56 e.printStackTrace(); 57 } 58 } 59 }
SSM框架中【MyBatis分頁語句】
UsersMapper.java
1 public interface UsersMapper { 2 // 獲取分頁記錄,startPos:從第幾行開始獲取,pageSize:獲取的條數 3 List<Users> selectByPage(@Param(value = "startPos") Integer startPos, 4 @Param(value = "pageSize") Integer pageSize); 5 // 獲取數據庫總的記錄數,返回users表中總的記錄條數 6 int getCount(); 7 }
UsersMapper.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 <mapper namespace="com.bwlu.mapper.UsersMapper" > 4 <resultMap id="BaseResultMap" type="com.bwlu.bean.Users" > 5 <id column="userId" property="userid" jdbcType="INTEGER" /> 6 <result column="userName" property="username" jdbcType="VARCHAR" /> 7 <result column="password" property="password" jdbcType="VARCHAR" /> 8 <result column="userEmail" property="useremail" jdbcType="VARCHAR" /> 9 <result column="permission" property="permission" jdbcType="INTEGER" /> 10 </resultMap> 11 12 <!-- 分頁SQL語句 --> 13 <select id="selectByPage" resultMap="BaseResultMap"> 14 select * from Users limit #{startPos},#{pageSize} 15 </select> 16 <!-- 取得記錄的總數 --> 17 <select id="getCount" resultType="java.lang.Integer"> 18 SELECT COUNT(*) FROM Users 19 </select> 20 </mapper>
