1. 程式人生 > >Oracle+JSP+Servlet實現的資料分頁展示

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。

綜上,完成了對資料庫資料的分頁查詢和顯示,水平有限,如有地方寫的有錯誤,歡迎留言指出。