Oracle+JSP+Servlet實現的資料分頁展示
前言
在做任何事情之前,我們都應該清楚的知道這件事是什麼以及我們為什麼做這件事,分頁也不例外,我們在分頁之前首要要知道什麼是分頁?還要知道為什麼要去進行分頁?我們只有弄清楚了這兩個問題,才能去討論如何實現分頁。
首先,說一下什麼是分頁以及為什麼進行分頁(這兩個概念放在一起講最合適)?
在我的認知裡,分頁正如字面上的意思,分成一頁一頁,我們從小到大應該都接觸過書籍,沒有哪一本書籍是放在一頁上的吧,當然文章內容少一頁就可以放完的除外,我們發現:文章的內容,都是分成一頁一頁去展示,而我們都是一頁一頁去閱讀內容。現實生活中如此,在資料庫中也是如此,當我們遇到一個容量大的資料庫(比如幾十個G的容量),如果要一下子從資料庫中取到所有資料,暫且不考慮伺服器端的壓力問題,取出來的幾百萬,幾千萬條量的資料在頁面這顯示都成了問題。而且在淘寶或者京東這些購物平臺上,一般使用者的選擇大部分不會超出資料庫中資料的前100,條資料,但淘寶、京東這些電商資料庫的內容只有緊緊100條嗎,不,他們的資料庫更大,只不過對於使用者的需求,前100條資料就可以完全滿足。讀到了這裡,我想大家應該明白資料庫分頁的必要了吧,下面來看如何在Oracle資料庫中實現分頁,並且在JSP頁面中去得到顯示出來。
Servlet頁面
@WebServlet("/EmpServlet") public class EmpServlet extends HttpServlet { private static final long serialVersionUID = 1L; private EmpService es = new EmpServiceImpl(); public EmpServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //預設起始頁為第一頁 int pageIndex = 1; String pageStr = request.getParameter("page"); if(pageStr != null){ pageIndex = Integer.parseInt(pageStr); } //獲得總頁碼 int maxPage = es.getTotalPage(); //獲得員工列表 List<Emp> emps = es.getEmpByPage(pageIndex); request.setAttribute("emps", emps); request.setAttribute("page", pageIndex); request.setAttribute("maxPage", maxPage); request.getRequestDispatcher("emps.jsp").forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
在servlet中,設定一個起始頁(為第一頁),然後獲得提交過來的引數:本業的頁碼。通過預先寫的service層等到資料庫中資料的最大頁碼數和本業頁碼的資料,將資料設定為request屬性並轉發交給emps主頁面進行顯示。
jsp頁面
<table border="1"> <caption>員工列表</caption> <tr> <td>編號</td> <td>姓名</td> <td>職位</td> <td>上級編號</td> <td>入職日期</td> <td>工資</td> <td>獎金</td> <td>部門編號</td> <td colspan="2">操作</td> </tr> <c:forEach items="${emps }" var="emp"> <tr> <td>${emp.empNo }</td> <td>${emp.empName }</td> <td>${emp.job }</td> <td>${emp.mgr }</td> <td>${emp.hiredate }</td> <td>${emp.sal }</td> <td>${emp.comm }</td> <td>${emp.deptNo }</td> <td><button>修改</button></td> <td><button>刪除</button></td> </tr> </c:forEach> </table> <c:url var="first" value="EmpServlet"> <c:param name="page" value="1"></c:param> </c:url> <c:url var="forward" value="EmpServlet"> <c:param name="page" value="${page-1 }"></c:param> </c:url> <c:url var="next" value="EmpServlet"> <c:param name="page" value="${page+1 }"></c:param> </c:url> <c:url var="end" value="EmpServlet"> <c:param name="page" value="${maxPage }"></c:param> </c:url> <c:if test="${page>1 }"> <a href="${first }">首頁</a> <a href="${forward }">上一頁</a> </c:if> <c:if test="${page<maxPage }"> <a href="${next }">下一頁</a> <a href="${end }">末頁</a> </c:if>
在JSP頁面裡,通過servlert裡面設定的屬性可以得到本業頁碼、總頁碼、本業頁碼資料這三個資訊,進而通過JSTL表示式的C標籤進行相應的資料讀取和判斷,比如foreach進行資料的讀取,通過url設定頁碼的超連結,通過if來來判斷是否為第一頁或者最後一頁,若為第一頁的話,設定首頁和上一頁不顯示,相應的為最後一頁時,下一頁和末頁不進行顯示。
Oracle中的分頁
--首先得到EMP表中所有的資料,通過工資欄位sal進行排序
SELECT E.* FROM EMP E ORDER BY SAL DESC
--為上查詢出的表新增ROWNUM欄位
SELECT ED.*, ROWNUM RN FROM (SELECT E.* FROM EMP E ORDER BY SAL DESC) ED
--固化ROWNUM欄位,並判斷取第幾頁
SELECT *
FROM (SELECT ED.*, ROWNUM RN
FROM (SELECT T.* FROM EMP T WHERE 1 = 1 ORDER BY SAL DESC) ED)
WHERE RN >= 1
AND RN <= 5
資料庫分頁一般分為三步驟進行:
第一步、查詢出欄位並進行相應的排序。
第二步、為上述查出的表新增ROWNUM欄位。
第三步、固化ROWNUM,並進行分頁查詢。
上述三步驟如果不進行排序的話可以將第一步和第二步進行合併,那樣兩步就可以完成分頁查詢,ROWNUM進行的排序,前面為(page-1)*pageSize-1,後面為page*pageSize。
綜上,完成了對資料庫資料的分頁查詢和顯示,水平有限,如有地方寫的有錯誤,歡迎留言指出。