一、顯示數據庫中的多條數據為什么要用分頁
在真正的開發中,數據庫中所存儲的數據絕對不像我們平時所寫的那樣,僅僅有幾條數據,而是有幾十條甚至上百條,像淘寶京東的用戶把都是上幾十萬甚至百萬的。如果這時候在將所有的數據都顯示出來那肯定是不現實的,第一、瀏覽器的頁面就那么大,肯定顯示不全;第二、一次將這些數據全部查詢出來再進行操作,那對於整個數據庫的消耗那是相當大的。
因此,實際開發中使用分頁來顯示數據是十分有必要的。話不多說,進入今天咱們的話題:分頁的具體實現步驟。(這里以我自己做的一個小程序為例)
二、讓我們先來看一下分頁之后的效果。

這是我自己做的一個jsp顯示出來的,沒有加多少css樣式,很簡單,有點丑,各位就湊合看吧,畢竟今天咱們的重點不是這!
從這張圖中我么你可以看出來,本頁面實現了分頁的功能,一共分為7頁,每頁5條記錄。這里面的超鏈接以及文本框都是可以操作的。
三、具體的實現步驟
1、首先你需要有一個類,Student.java用來生成學生的各種屬性以及它們的get、set方法。還需要有一個page類,用來存儲Student對象列表以及總記錄數、當前頁、每頁的記錄條數等屬性以及它們的get、set方法。如圖:

加了注釋的那兩個屬性我們不可以對其進行set,因此只有它們的get方法。


之所以這么寫這兩個的get方法想必不用我多說了吧,稍微懂點腦子就能計算出來。
2、你需要連接數據庫
3、進入重點部分,即Dao層的編寫(這里只說與分頁有關的)
public List<Student> limitAll(int index,int pageSize){
Connection conn=DBUtils.getConnection();
String sql="select * from student limit ?,?";
PreparedStatement ps = null;
List<Student> list = null;
ResultSet rs = null;
try {
ps=conn.prepareStatement(sql);
ps.setInt(1, index);
ps.setInt(2, pageSize);
rs = ps.executeQuery();
list=new ArrayList<Student>();
while(rs.next()){
Student student=new Student();
student.setId(rs.getInt(1));
student.setName(rs.getString(2));
student.setNumber(rs.getString(3));
student.setSchool(rs.getString(4));
student.setEmail(rs.getString(5));
list.add(student);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
DBUtils.colse(conn, ps, rs);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return list;
}
public int getTotalRecord(){
Connection conn=DBUtils.getConnection();
String sql="select count(*) as total from student";
PreparedStatement ps = null;
ResultSet rs = null;
int total=0;
try {
ps=conn.prepareStatement(sql);
rs = ps.executeQuery();
if(rs.next()){
total=rs.getInt("total");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
DBUtils.colse(conn, ps, rs);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return total;
}
select * from student limit ?,?;
這句代碼是數據庫中的分頁查詢的語句。第一個“?”為索引值,第二個“?”為每頁的記錄數。
例如:select * from student limit 0,3 便是輸出表中的前三條數據。
第一個函數通過輸入索引值和每頁的記錄數,返回一個Student的List;第二個函數計算出此表的總記錄數。
4、service層的編寫:
public Page<Student> limitAll(int pageNumber,int pageSize){
int totalRecord=studentDao.getTotalRecord();
Page<Student> page=new Page<Student>();
page.setPageSize(pageSize);
page.setTotalRecord(totalRecord);
if(pageNumber<1){
pageNumber=1;
}else if(pageNumber>page.getTotalPage()){
pageNumber=page.getTotalPage();
}
page.setPageNumber(pageNumber);
List<Student> list=studentDao.limitAll(page.getIndex(), pageSize);
page.setData(list);
return page;
}
通過這一部分的編寫,我們可以在servlet中只需輸入兩個參數:當前頁和每頁的記錄條數。就能將整個分頁后當前頁student的List得到。
5、Servlet層的編寫
private static int pagesize=5;
private static int pagenum=1;
這里我們聲明兩個static的變量,即默認顯示的當前頁為第一頁,每頁的記錄條數為5條。
通過:Page<Student> page=service.limitAll(pagenum, pagesize);
我們可以生成當前五條記錄的一個學生信息的列表。當然這里你需要有一個登錄頁面來登錄進去。此時我們就得到了開始的那個頁面。
6、對jsp頁面的編寫:
<body>
<div id="find">
<form action="Servlet?oper=findByNameOrId" method="post">
<input type="text" name="find">
<input type="submit" value="查找">
</form>
</div>
<div id="tablee">
<table border="1" align="center">
<tr>
<th>姓名</th>
<th>學號</th>
<th>學校</th>
<th>郵箱</th>
<th colspan="2">操作</th>
</tr>
<c:forEach items="${page.data}" var="student">
<tr>
<td>${student.name}</td>
<td>${student.number}</td>
<td>${student.school}</td>
<td>${student.email}</td>
<td><a href="Servlet?id=${student.id}&oper=update&fnum=two&pagenum=${page.pageNumber}">修改</a></td>
<td><a href="Servlet?id=${student.id}&oper=delete&fnum=two&pagenum=${page.pageNumber}">刪除</a></td>
</tr>
</c:forEach>
<tr>
<th colspan="4"><a href="Servlet?oper=register&fnum=two&pagenum=${page.pageNumber}">添加</a></th>
</tr>
</table>
這是整個table,包含學生信息和修改,刪除,添加等超鏈接。
<div id="page">
<a href="Servlet?pagenum=1&oper=login&fnum=two&fl=1">首頁</a>
<a href="Servlet?pagenum=${page.pageNumber-1}&oper=login&fl=1&fnum=two&fl=1">上一頁</a>
<c:choose>
<c:when test="${page.totalPage<=5}">
<c:forEach begin="1" end="${page.totalPage}" var="num">
<c:if test="${page.pageNumber==num }">
[${num}]
</c:if>
<c:if test="${page.pageNumber!=num}">
<a href="Servlet?pagenum=${num}&fnum=two&oper=login&fl=1"> ${num}</a>
</c:if>
</c:forEach>
</c:when>
<c:when test="${page.totalPage>5}">
<c:if test="${page.pageNumber<=3}">
<c:set var="begin" value="1"></c:set>
<c:set var="end" value="5"></c:set>
<c:forEach begin="${begin}" end="${end}" var="num">
<c:if test="${page.pageNumber==num }">
[${num}]
</c:if>
<c:if test="${page.pageNumber!=num}">
<a href="Servlet?pagenum=${num}&fnum=two&oper=login&fl=1"> ${num}</a>
</c:if>
</c:forEach>
</c:if>
<c:if test="${page.pageNumber>3}">
<c:set var="begin" value="${page.pageNumber-2}"></c:set>
<c:set var="end" value="${page.pageNumber+2}"></c:set>
<c:if test="${page.pageNumber>=page.totalPage-2}">
<c:set var="begin" value="${page.totalPage-4}"></c:set>
<c:set var="end" value="${page.totalPage}"></c:set>
<c:forEach begin="${begin}" end="${end}" var="num">
<c:if test="${page.pageNumber==num }">
[${num}]
</c:if>
<c:if test="${page.pageNumber!=num}">
<a href="Servlet?pagenum=${num}&fnum=two&oper=login&fl=1"> ${num}</a>
</c:if>
</c:forEach>
</c:if>
<c:if test="${page.pageNumber<page.totalPage-2}">
<c:forEach begin="${begin}" end="${end}" var="num">
<c:if test="${page.pageNumber==num }">
[${num}]
</c:if>
<c:if test="${page.pageNumber!=num}">
<a href="Servlet?pagenum=${num}&fnum=two&oper=login&fl=1"> ${num}</a>
</c:if>
</c:forEach>
</c:if>
</c:if>
</c:when>
</c:choose>
<a href="Servlet?pagenum=${page.pageNumber+1}&fnum=two&oper=login&fl=1">下一頁</a>
<a href="Servlet?pagenum=${page.totalPage}&fnum=two&oper=login&fl=1">末頁</a>
共${page.totalPage}頁 ${page.totalRecord}條記錄
去第<input type="text" id="num">頁
<input type="button" value="確定" id="btn_id">
<script type="text/javascript">
$("#btn_id").click(function(){
var num1=$("#num").val();
window.location="Servlet?oper=login&fl=1&fnum=two&pagenum="+num1;
});
</script>
</div>
這是顯示table下面關於分頁的顯示以及超鏈接代碼。
說道這,有關分頁的特別核心的內容已經說完。剩下的代碼就需要各位小伙伴們自己去寫了。
如果還有不懂的地方或者還需要完整的代碼可以留言!
