分頁顯示對於數據在頁面中的展示是非常重要的工具,當數據條數較多時,就需要使用分頁來顯示。實現分頁顯示的思路包括:(1)確定數據庫中一共有多少條數據,即數據總數;(2)設定每頁準備顯示多少條數據,計算出一共需要分多少頁,即分頁數目=數據總數/每頁數目,由於用到除法,當數據總數能被每頁數目整除時,那就正好那麼多頁;當不能整除時就需要在分頁數目上加上一頁纔行;(3)有了數據總數,每頁數據條數,分頁數目後,開始使用數據庫查詢出每頁的數據,然後傳遞給Servlet處理,然後在視圖層顯示。(4)其中的數據總數,通過數據庫查詢獲得,每頁顯示數據條數,需要直接給定值,獲取每頁的數據,使用sql語句的"select * from user order by ID desc limit 每頁數目*當前頁數,每頁數目", 包括兩個變量:每頁數目,這是可以直接賦值的,當前頁數,則需要從前端jsp頁面獲取纔行。因此要實現分頁顯示,正好將數據庫、servlet、jsp頁面三個層次都用到。
下面進行一個實例,說明分頁顯示實現過程:
(1)先保證數據庫裏的表數據條目較多,比如本案例中學生用戶表一共8個用戶數據,每頁顯示3條,因此這裏就需要3頁顯示。
每頁數目=3;數據總數則需要查詢獲取。
(2)新建兩個實體:User和Page,User用於學生對象,Page用於分頁對象。
package org.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 org.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
分頁接口:
package org.student.dao;
public interface IpageDao {
public int getTotalPage(int pageSize);
}
分頁實現類:
package org.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 org.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 org.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)上述用戶分頁查詢實現類中參數每頁數目可以直接賦值,而當前頁數則需要前端頁面獲取,如當前頁爲1,當前頁爲2等。在實現的時候在jsp頁面使用javabean封裝,頁面列表下方呈現分頁標記:首頁 前一頁 後一頁 末頁。每一組文字均爲超鏈接a,首頁<a href="?start=0">,使用?傳值,start爲起始頁數變量,index爲0表示第一頁,末頁<a href="?start=TotalPage-1>",TotalPage爲總頁數,在page實現類中傳值過來。如下爲前端jsp頁面。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*" import="org.student.entity.User" import="org.student.entity.Page"%>
<jsp:useBean id="user" scope="page" class="org.student.dao.UserDaoImpl"/>
<jsp:useBean id="pg" scope="page" class="org.student.dao.PageDaoImpl"/>
<!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");
//獲取當前頁數,首次進入時start爲0,點擊超鏈接時獲取start頁數
int start=request.getParameter("start")==null?0:Integer.parseInt(request.getParameter("start"));
//通過page實現類獲得總頁數,這裏的3爲每頁數目
int pageSize=3;
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);
List<User> currentUser=(List<User>)user.queryUserByPage(pg1);
//遍歷顯示
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="?start=0">
<span>首頁</span>
</a>
</li>
<li>
<a href="?start=${requestScope.prePage }">
<span>前一頁</span>
</a>
</li>
<li>
<a href="?start=${requestScope.nextPage }">
<span>後一頁</span>
</a>
</li>
<li>
<a href="?start=${requestScope.totalPage-1} ">
<span>尾頁</span>
</a>
</li>
</ul>
</nav>
</body>
</html>
上述頁面中頭部有不少java代碼,從MVC角度考慮如果需要將頁面不含java代碼,可以考慮增加一個servlet服務層,將這些java代碼放到servlet服務層中,然後再來進行頁面跳轉。如下爲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();
}
}
}
然後在userPage.jsp頁面中只需要request.getAttributes獲取到數據,即可。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*" import="org.student.entity.User" import="org.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>