分頁顯示對於數據在頁面中的展示是非常重要的工具,當數據條數較多時,就需要使用分頁來顯示。實現分頁顯示的思路包括:
- 確定數據庫中一共有多少條數據,即數據總數;
- 設定每頁准備顯示多少條數據,計算出一共需要分多少頁,即分頁數目=數據總數/每頁數目,當數據總數能被每頁數目整除時,就正好那么多頁;當不能整除時就要在分頁數目上再加上一頁;
- 有了數據總數,每頁數據條數、分頁數目后,開始使用數據庫查詢出每頁的數據,然后傳遞給Servlet處理,接着在視圖層顯示。
- 其中數據總數通過數據庫查詢獲得,每頁顯示數據條數,需要直接給定值,獲取每頁的數據使用sql語句的"select * from user order by ID desc limit 每頁數目*當前頁數,每頁數目", 包括兩個變量:每頁數目,這是可以直接賦值的,當前頁數,則需要從前端jsp頁面獲取才行。
下面以一個實例,說明分頁顯示實現過程:
(1)先保證數據庫里的表數據條目較多,比如本案例中學生用戶表一共8個用戶數據,每頁顯示3條,因此這里就需要3頁顯示。每頁數目=3;數據總數則需要查詢獲取。
(2)新建兩個實體:User和Page,User用於學生對象,Page用於分頁對象。
package com.student.entity; public class User { private int ID; private String Name; private String Sex; public User(int iD) { this.ID = iD; } public User(int iD, String name, String sex) { this.ID = iD; this.Name = name; this.Sex = sex; } public int getID() { return ID; } public void setID(int iD) { ID = iD; } public String getName() { return Name; } public void setName(String name) { Name = name; } public String getSex() { return Sex; } public void setSex(String sex) { Sex = sex; } }
package com.student.entity; public class Page { private int pageSize; private int totalPage; private int Index; public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public int getTotalPage() { return totalPage; } public void setTotalPage(int totalPage) { this.totalPage = totalPage; } public int getIndex() { return Index; } public void setIndex(int index) { this.Index = index; } public Page() { super(); } public Page(int Index, int pageSize) { this.Index = Index; this.pageSize = pageSize; } }
(3)根據需求編寫學生用戶、分頁接口及其實現類,習慣上接口命名為IName,實現類命名為NameImpl
分頁接口類:
1 package com.student.dao; 2 3 public interface IpageDao { 4 public int getTotalPage(int pageSize); 5 }
分頁實現類:
package com.student.dao; import java.sql.SQLException; public class PageDaoImpl implements IpageDao { @Override public int getTotalPage(int pageSize) { // 總共多少頁數 DButil db = new DButil(); int total = 0, totalPage = 0; String sql = "select count(ID) from user"; try { total = db.getTotalCount(sql); // 總數 totalPage = total % pageSize > 0 ? total / pageSize + 1 : total / pageSize; // 總頁數 } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 總數量 return totalPage; } }
用戶接口類:
package com.student.dao; import java.util.List; import org.student.entity.Page; import org.student.entity.User; public interface IUser { public List<User> queryUserByPage(Page page); }
用戶實現類,實現分頁查詢獲得每頁的數據,關鍵參數給定就是當前頁數和每頁數目:
package com.student.dao; import java.sql.*; import java.util.*; import org.student.entity.Page; import org.student.entity.User; public class UserDaoImpl implements IUser { public Connection con = null; public PreparedStatement pst = null; public Statement sm = null; public ResultSet rs = null; @Override public List<User> queryUserByPage(Page page) throws SQLException { List<User> arr = new ArrayList(); DButil db = new DButil(); // 實例化數據庫db try { con = db.initConnection(); // 連接數據庫 String sql1 = "select * from user limit ?,? "; // 分頁查詢 pst = con.prepareStatement(sql1); pst.setInt(1, page.getIndex() * page.getPageSize()); // 當前頁*每頁數目 pst.setInt(2, page.getPageSize());// 每頁數目 rs = pst.executeQuery(); while (rs.next()) { User stu = new User(rs.getInt(1), rs.getString(2), rs.getString(3));// 查詢數據存到user對象 arr.add(stu);// 存成List集合 } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } db.close();// 關閉數據庫 return arr; } }
(4)userPageServlet代碼
@WebServlet("/userPageServlet" ) public class userPageServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); System.out.println("welcome"); //獲取當前頁數,首次進入時start為0,點擊超鏈接時獲取start頁數 int start=request.getParameter("start")==null?0:Integer.parseInt(request.getParameter("start")); //通過page實現類獲得總頁數,這里的3為每頁數目 int pageSize=3; PageDaoImpl pg=new PageDaoImpl(); int totalPage=pg.getTotalPage(pageSize); //前一頁頁數、后一頁變量值 int prePage=start-1>0?start-1:start+1; int nextPage=start+1<totalPage?start+1:totalPage-1; //使用request.setAttribute方法便於頁面中使用el語法 request.setAttribute("totalPage", totalPage); request.setAttribute("prePage", prePage); request.setAttribute("nextPage", nextPage); //獲得當前頁的數據 Page pg1=new Page(start,pageSize); UserDaoImpl user=new UserDaoImpl(); try { List<User> currentUser=(List<User>)user.queryUserByPage(pg1); request.setAttribute("userList", currentUser); request.getRequestDispatcher("userPage.jsp").forward(request, response); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
(6)前段jsp代碼
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*" import="com.student.entity.User" import="com.student.entity.Page"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h4>所有用戶列表</h4> <table border="1" width="60%"> <tr> <td>用戶姓名</td> <td>用戶性別</td> <td>操作</td> </tr> <% request.setCharacterEncoding("UTF-8"); List<User> currentUser = (List<User>) request.getAttribute("userList"); //遍歷顯示 for (User userlist : currentUser) { %> <tr> <td><%=userlist.getName()%></td> <td><%=userlist.getSex()%></td> <td><a href="deleteStudent.jsp?ID=<%=userlist.getID()%>">刪除</a><br> <a href="updateStudent.jsp?ID=<%=userlist.getID()%>">修改</a></td> </tr> <% } %> </table> <nav> <ul class="pagination"> <li><a href="userPageServlet?start=0"> <span>首頁</span> </a></li> <li><a href="userPageServlet?start=${requestScope.prePage }"> <span>前一頁</span> </a></li> <li><a href="userPageServlet?start=${requestScope.nextPage }"> <span>后一頁</span> </a></li> <li><a href="userPageServlet?start=${requestScope.totalPage-1} "> <span>尾頁</span> </a></li> </ul> </nav> </body> </html>