問題分析:
當我們想檢索數據庫中的信息並將其顯示到網頁上時,如果數據庫中的信息過多時 。一方面會使數據庫開銷非常大,降低性能;另一方面在一張頁面上顯示過多數據也會降低用戶體驗。
解決辦法:
1.由於在分頁之后每一頁顯示的信息不再僅僅是數據空中的數據而是類似於下圖:
1)所以我們需要創建一個page類:
1 package com.neuedu.manage.bean; 2 3 import java.util.List; 4 5 public class page <T>{ 6 private List<T> data;//數據庫查詢出的數據 7 private int totalRecord;//總記錄數,數據庫查詢 8 9 private int pageNumber;//當前頁碼 10 private int pageSize;//每頁的記錄數 11 12 private String path;//jsp頁面鏈接所要跳轉的地址 13 14 // private int index; //當前索引,計算得到 15 // private int totalPage;//總頁數 計算得到 16 17 }
2)其中我們為前5個變量創建GET和SET方法;由於后兩個變量是計算得到的,只為他們創建GET方法:
1 public int getIndex() { 2 /** 3 * 當前索引值,計算得到的 4 */ 5 return (getPageNumber()-1)*pageSize; 6 } 7 8 public int getTotalPage() { 9 /** 10 * 總頁數 11 */ 12 if(totalRecord%pageSize==0){ 13 return totalRecord/pageSize; 14 } 15 return (totalRecord/pageSize +1); 16 }
3)為page創建一個有參構造函數
1 public page( int pageNumber, int pageSize ,int totalRecord) { 2 super(); 3 this.pageNumber = pageNumber; 4 this.pageSize = pageSize; 5 this.totalRecord = totalRecord; 6 }
2.dao層代碼:根據當前索引值和每頁的記錄數將結果查詢出來,然后將其封裝成user對象並保存到Student類的LIst鏈表中,將其返回。
1 public List<Student> getLimitStuList(int index, int pageSize) { 2 JDBCUtil jdbcUtil=new JDBCUtil(); 3 Connection con = jdbcUtil.getConnection(); 4 PreparedStatement pst=null; 5 ResultSet rSet=null; 6 List<Student>list= new ArrayList<Student>(); 7 String sql="SELECT * FROM students limit ?,?"; 8 try { 9 pst = con.prepareStatement(sql); 10 pst.setInt(1, index); 11 pst.setInt(2, pageSize); 12 rSet = pst.executeQuery(); 13 while(rSet.next()) 14 { 15 int id=rSet.getInt("id"); 16 String name=rSet.getString("name"); 17 String school=rSet.getString("school"); 18 double score=rSet.getDouble("score"); 19 list.add(new Student(id, name, school, score)); 20 } 21 } catch (SQLException e) { 22 e.printStackTrace(); 23 } finally{ 24 JDBCUtil.close(con, pst, rSet); 25 } 26 System.out.println(list); 27 return list; 28 }
3.service層代碼:查詢數據庫中的數據並將其放入page對象。
1 public class studentService { 2 private studentDao studentDao=new studentDao(); 3 public page<Student> getStudentList(int pageNo, int pageSize){ 4 //查詢當前表的所有記錄數 5 int totalRecord = studentDao.getTotalRecord(); 6 //調用有參構造函數,創建page對象 7 page<Student> page=new page<Student>(pageNo,pageSize,totalRecord); 8 //第三步,查詢分頁列表數據並設置到page對象中 9 List<Student> list=studentDao.getLimitStuList(page.getIndex(),page.getPageSize()); 10 System.out.println(list); 11 page.setData(list); 12 return page; 13 } 14 }
4.我們為jsp頁面上的鏈接所要跳轉的路徑編寫一個工具類,並將其放在util包下。
1 //獲取截取路徑 2 public class WEBUtils { 3 public static String grtPath(HttpServletRequest request) { 4 String requestURI = request.getRequestURI();//請求路徑 5 String queryString = request.getQueryString();//請求參數 6 System.out.println("請求URI"+requestURI+"?"+queryString); 7 String url=requestURI+"?"+queryString; 8 if(url.contains("?pageNo")){ 9 url=url.substring(0, url.indexOf("?pageNo")); 10 } 11 return url; 12 } 13 }
5.創建一個servlet,用於接收jsp頁面的分頁查詢數據的請求。
1 @WebServlet("/studentCheck") 2 public class studentCheck extends HttpServlet { 3 private static final long serialVersionUID = 1L; 4 private static int pageSize=2;//每頁記錄數 5 private static int pageNo=1;//當前頁碼 6 private studentService service= new studentService(); 7 public studentCheck() { 8 super(); 9 } 10 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 11 try{ 12 pageNo=Integer.parseInt(request.getParameter("pageNo"));//鏈接所要跳轉的"當前頁碼", 當jsp頁面的a標簽發生跳轉時,從地址欄直接攜帶過來 13 }catch (Exception e) { 14 e.getMessage(); 15 } 16 String url = WEBUtils.grtPath(request);//獲取當前請求路徑 17 page<Student> page= service.getStudentList(pageNo,pageSize); 18 page.setPath(url);//創建page對象 19 request.setAttribute("page",page);//將page對象放入請求域 20 request.getRequestDispatcher("/WEB-INF/view/stu-list.jsp").forward(request, response); 21 } 22 23 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 24 request.setCharacterEncoding("utf8"); 25 doGet(request, response); 26 } 27 28 }
至此,我們基本完成分頁顯示的后台代碼。接下來還要完成前端網頁的顯示,請見下篇。