題外話:該分頁顯示是用 “表示層-控制層-DAO層-數據庫”的設計思想實現的,有什麼需要改進的地方大家提出來,共同學習進步。
思路:首先得在 DAO 對象中提供分頁查詢的方法,在控制層調用該方法查到指定頁的數據,在表示層通過 EL 表達式和 JSTL 將該頁數據顯示出來。
重點:兩個方法:(1)計算總的頁數。 (2)查詢指定頁數據。
1.DAO層-數據庫
JDBCUtils 類用於打開和關閉數據庫,核心代碼如下:
1 import java.sql.Connection; 2 import java.sql.DriverManager; 3 import java.sql.PreparedStatement; 4 import java.sql.ResultSet; 5 import java.sql.SQLException; 6 7 public class JDBCUtils { 8 private Connection conn=null; 9 private PreparedStatement pstmt=null; 10 11 12 /** 13 * connect 連接數據庫 14 * @return 15 */ 16 public Connection connect(){ 17 String user="root"; 18 String password="1234"; 19 String driverClass = "com.mysql.jdbc.Driver"; 20 String jdbcUrl = "jdbc:mysql://localhost:3306/book"; 21 22 try { 23 Class.forName(driverClass); 24 conn = DriverManager.getConnection(jdbcUrl, user, password); 25 } catch (Exception e) { 26 // TODO Auto-generated catch block 27 e.printStackTrace(); 28 } 29 return conn; 30 31 } 32 33 /** 34 * close 關閉數據庫 35 * @param conn 36 * @param pstmt 37 * @param resu 38 */ 39 public void close(Connection conn,PreparedStatement pstmt,ResultSet result){ 40 if(conn != null){ 41 try { 42 conn.close(); 43 } catch (SQLException e) { 44 // TODO Auto-generated catch block 45 } 46 } 47 if(pstmt != null){ 48 try { 49 pstmt.close(); 50 } catch (SQLException e) { 51 // TODO Auto-generated catch block 52 e.printStackTrace(); 53 } 54 } 55 if(result != null){ 56 try { 57 result.close(); 58 } catch (SQLException e) { 59 // TODO Auto-generated catch block 60 e.printStackTrace(); 61 } 62 } 63 } 64 65 }
UserDao 類中的方法 getPage() 和方法 listUser() 分別用來計算總頁數和查詢指定頁的數據,核心代碼如下:
1 import java.sql.Connection; 2 import java.sql.PreparedStatement; 3 import java.sql.ResultSet; 4 import java.sql.SQLException; 5 import java.util.ArrayList; 6 import java.util.List; 7 8 import com.db.JDBCUtils; 9 10 public class UserDao { 11 /** 12 * 計算總的頁數 13 * @return 14 */ 15 public int getPage(){ 16 int recordCount=0,t1=0,t2=0; 17 PreparedStatement pstmt=null; 18 ResultSet result=null; 19 JDBCUtils jdbc=new JDBCUtils(); 20 Connection conn=jdbc.connect(); 21 String sql="select count(*) from books"; 22 try { 23 pstmt=conn.prepareStatement(sql); 24 result=pstmt.executeQuery(); 25 result.next(); 26 recordCount=result.getInt(1); 27 t1=recordCount%5; 28 t2=recordCount/5; 29 } catch (Exception e) { 30 // TODO Auto-generated catch block 31 e.printStackTrace(); 32 }finally{ 33 jdbc.close(conn, pstmt, result); 34 } 35 if(t1 != 0){ 36 t2=t2+1; 37 } 38 39 return t2; 40 } 41 42 /** 43 * 查詢指定頁的數據 44 * @param pageNo 45 * @return 46 */ 47 public List<User> listUser(int pageNo){ 48 PreparedStatement pstmt=null; 49 ResultSet result=null; 50 List<User> list=new ArrayList<User>(); 51 int pageSize=5; 52 int page=(pageNo-1)*5; 53 JDBCUtils jdbc=new JDBCUtils(); 54 Connection conn=jdbc.connect(); 55 String sql="select * from books order by id limit ?,?"; 56 try { 57 pstmt=conn.prepareStatement(sql); 58 pstmt.setInt(1, page); 59 pstmt.setInt(2, pageSize); 60 result=pstmt.executeQuery(); 61 while(result.next()){ 62 User user=new User(); 63 user.setId(result.getInt(1)); 64 user.setName(result.getString(2)); 65 user.setNumber(result.getString(3)); 66 list.add(user); 67 68 } 69 } catch (Exception e) { 70 // TODO Auto-generated catch block 71 e.printStackTrace(); 72 }finally{ 73 jdbc.close(conn, pstmt, result); 74 } 75 return list; 76 } 77 78 }
User 類用於存儲查詢到的數據,核心代碼如下:
1 public class User { 2 private int id; 3 private String name; 4 private String number; 5 public int getId() { 6 return id; 7 } 8 public void setId(int id) { 9 this.id = id; 10 } 11 public String getName() { 12 return name; 13 } 14 public void setName(String name) { 15 this.name = name; 16 } 17 public String getNumber() { 18 return number; 19 } 20 public void setNumber(String number) { 21 this.number = number; 22 } 23 }
2.控制層
ListUser 類內部調用 UserDao 對象查詢數據並指派頁面顯示數據,核心代碼如下:
1 import java.io.IOException; 2 import java.io.PrintWriter; 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 import com.dao.User; 12 import com.dao.UserDao; 13 14 public class ListUser extends HttpServlet { 15 public ListUser() { 16 super(); 17 } 18 19 public void destroy() { 20 super.destroy(); // Just puts "destroy" string in log 21 // Put your code here 22 } 23 24 public void doGet(HttpServletRequest request, HttpServletResponse response) 25 throws ServletException, IOException { 26 27 doPost(request, response); 28 } 29 30 public void doPost(HttpServletRequest request, HttpServletResponse response) 31 throws ServletException, IOException { 32 33 34 response.setCharacterEncoding("utf-8"); 35 int pageNo = 1; 36 UserDao userdao=new UserDao(); 37 List<User> lists=new ArrayList<User>(); 38 String pageno=request.getParameter("pageNos"); 39 if(pageno != null){ 40 pageNo=Integer.parseInt(pageno); 41 } 42 lists=userdao.listUser(pageNo); 43 int recordCount=userdao.getPage(); 44 request.setAttribute("recordCount", userdao.getPage()); 45 request.setAttribute("listss", lists); 46 request.setAttribute("pageNos", pageNo); 47 request.getRequestDispatcher("userlist.jsp").forward(request, response); 48 } 49 50 public void init() throws ServletException { 51 // Put your code here 52 } 53 54 }
3.表示層
輸出頁面 userlist.jsp ,使用 EL 和 JSTL 輸出查詢結果,核心代碼如下:
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 3 <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> 4 <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> 5 <% 6 String path = request.getContextPath(); 7 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 8 %> 9 10 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 11 <html> 12 <head> 13 <base href="<%=basePath%>"> 14 15 <title>My JSP 'userlist.jsp' starting page</title> 16 17 <meta http-equiv="pragma" content="no-cache"> 18 <meta http-equiv="cache-control" content="no-cache"> 19 <meta http-equiv="expires" content="0"> 20 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 21 <meta http-equiv="description" content="This is my page"> 22 <!-- 23 <link rel="stylesheet" type="text/css" href="styles.css"> 24 --> 25 <style type="text/css"> 26 th,td{width: 150px;border: 2px solid gray;text-align: center;} 27 body{text-align: center;} 28 a{text-decoration: none;} 29 table {border-collapse: collapse;} 30 </style> 31 </head> 32 33 <body> 34 <h2 align="center">圖書信息</h2> 35 <table align="center"> 36 <tr><td>書號</td><td>書名</td><td>庫存量</td></tr> 37 </table> 38 <table align="center"> 39 <c:forEach items="${listss}" var="person"> 40 <tr> 41 <td class="hidden-480">${person.id}</td> 42 <td class="hidden-480">${person.name }</td> 43 <td class="hidden-480">${person.number }</td> 44 </tr> 45 </c:forEach> 46 </table> 47 <br> 48 49 <c:if test="${pageNos>1 }"> 50 <a href="ListUser?pageNos=1" >首頁</a> 51 <a href="ListUser?pageNos=${pageNos-1 }">上一頁</a> 52 </c:if> 53 54 <c:if test="${pageNos <recordCount }"> 55 <a href="ListUser?pageNos=${pageNos+1 }">下一頁</a> 56 <a href="ListUser?pageNos=${recordCount }">末頁</a> 57 </c:if> 58 59 <form action="ListUser"> 60 <h4 align="center">共${recordCount}頁   61 <input type="text" value="${pageNos}" name="pageNos" size="1">頁 62 <input type="submit" value="到達"> 63 </h4> 64 </form> 65 </body> 66 </html>
4.效果圖