【Lehr】如何只依靠Jsp和Servlet實現網站的分頁功能
分析問題
首先,要明確各個部分的數據需求:
Jsp
輸入:總頁碼,該頁的內容
總頁碼:
知道了總的頁碼才能打印出對應的跳轉頁面的點擊鏈接。
該頁的內容:
…這個當然要知道了
輸出:跳轉頁碼
跳轉頁碼:
告訴Servlet你要跳轉到哪一頁,後端才能提供對應的數據。
Servlet
輸入:跳轉頁碼
跳轉頁碼:
通過跳轉頁面,執行邏輯層業務,去數據庫中取出對應的內容。
輸出:總頁碼,該頁的內容
總頁碼:
讓前端去打印。
該頁的內容:
讓前端去打印。
數據庫
輸入:每頁的文章數,跳轉頁碼
每頁的文章數:
提取數據
跳轉頁碼:
提取數據
輸出:該頁的內容,總文章量
該頁的內容:
從後端再傳給前端
總文章量:
用來計算總頁碼的
Servlet部分的實現
代碼
int nowPage = 1; //當前頁碼默認爲第一頁
if(request.getParameter("nowPage")!=null)
{
nowPage = Integer.valueOf(request.getParameter("nowPage"));
} //如果前端傳入了頁碼,那麼就改爲前端傳入的
int eachRow = 3; //這裏規定每頁顯示3篇文章
int totalRow = 0; //總的文章數
int totalPage = 0; //總的頁數
//得到文章總數
totalRow = dao.getTotalRow();
//得到本頁的文章內容
List<Article> list = dao.getList(nowPage, eachRow);
//文章放入session傳給前端
request.getSession().setAttribute("List", list);
//計算總頁碼
if(totalRow%eachRow==0) //如果剛好整除,就是那麼多了
{
totalPage = totalRow/eachRow;
}
else //如果每頁還單獨多了幾頁,那就多生成一頁
{
totalPage = totalRow/eachRow+1;
}
//把頁碼數傳給前端
request.getSession().setAttribute("totalPage", totalPage);
//跳轉回到主頁
response.sendRedirect("View.jsp");
}
說明
這裏我們需要有四個參數:
nowPage,eachRow,totalRow,totalPage
其中nowPage由前端獲得,結合eachRow到數據庫中進行篩選(後面會講)。而totalRow和totalPage則是基於數據庫獲取,用於計算總的頁碼。
數據庫部分的實現
原理
從上面的代碼裏發現,我們需要從數據庫裏得到總的文章數和當前頁的內容。
所以接下來分別講解這兩個語句的關鍵部分。(JDBC代碼量太大了我就不貼了,只寫sql語句了XD)
得到文章數
SELECT COUNT(*) AS NUM FROM XXX
獲取當前頁的內容
SELECT * FROM ARTICLE ORDER BY DATE DESC LIMIT ?, ?
這個我要好好談下…
爲了獲取指定頁的內容,需要用到Limit
Limit後面有兩個參數,分別表示從X行開始
,讀取X條數據
很顯然,從X行開始
就是我們要的數據的開始位置,比如,我們現在要看第三頁,(每頁有3條數據),那麼第三頁的第一條消息也就是第7條,是當前頁數-1乘以每頁條數的加一。(在草稿本上畫一下就知道了XD)。
讀取X條數據
其實就是我們規定的每頁的條數。
所以,採集者的問號補充應該就是這樣
st.setInt(1,(nowPage-1)*eachRow);
st.setInt(2,eachRow);
Jsp部分的實現
代碼
利用JSTL配合EL表達式,前端部分的跳 轉欄的代碼可以簡單的寫成:
<div>
<ul>
<c:forEach begin="1" end="${sessionScope.totalPage }" var = "i" >
<li>
<a href="ShowServlet?nowPage=${i}">${i}</a>
</li>
</c:forEach>
</ul>
</div>
說明
簡單解釋一下,首先從後端接受到總頁數(totalPage),然後逐個打印,動態生成對應的超鏈接。其中每個超鏈接會向後端傳遞自己對應的頁數。
就這樣
沒了!