java web手寫(xiě)實(shí)現(xiàn)分頁(yè)功能
現(xiàn)在很多流行的框架,都可以很快的把分頁(yè)效果做出來(lái),但是作為一名程序員你必須得知道手寫(xiě)分頁(yè)的流程:
場(chǎng)景效果:

一、分頁(yè)的思路
首先我們得知道寫(xiě)分頁(yè)代碼的思路,保持思路清晰,才能行云流水的去寫(xiě)代碼,其實(shí)不管是在寫(xiě)什么代碼,思路,思想特別重要,先想好再動(dòng)手,就會(huì)事半功倍!
先來(lái)分析SQL語(yǔ)句實(shí)現(xiàn)
Select * from product limit 0 ,5 Select * from product limit 5 ,5 Select * from product limit 10 ,5 Select * from product limit 15 ,5
#當(dāng)前頁(yè) 起始值 每頁(yè)數(shù)據(jù)大小
1 0 5
2 5 5
3 10 5
4 15 5
結(jié)論:
(1)(當(dāng)前頁(yè)-1)*(每頁(yè)數(shù)量)=起始值
(2)要想實(shí)現(xiàn)分頁(yè),向服務(wù)端發(fā)起請(qǐng)求的時(shí)候,必須傳遞當(dāng)前頁(yè)。
二、創(chuàng)建PageBean存放數(shù)據(jù)
這時(shí)候我們需要封裝一個(gè)包裝類,來(lái)封裝我們的分頁(yè)數(shù)據(jù)
package cn.itcast.store.domain;
import java.util.List;
/**
* 存放分頁(yè)相關(guān)的數(shù)據(jù)
*
* @author yechengchao
*/
public class PageModel {
//基本屬性
/**當(dāng)前頁(yè)數(shù),由用戶指定 */
private int currentPageNum;
/**每頁(yè)顯示的條數(shù),可以由用戶指定每頁(yè)顯示多少 */
private int pageSize =5;
/**總記錄條數(shù),數(shù)據(jù)庫(kù)查出來(lái)的 */
private int totalRecords;
/**總頁(yè)數(shù),計(jì)算出來(lái)的 */
private int totalPageNum;
/**每頁(yè)開(kāi)始記錄的索引,計(jì)算出來(lái)的 (當(dāng)前頁(yè)-1)*(每頁(yè)數(shù)量)=起始值 */
private int startIndex;
/**上一頁(yè) */
private int prePageNum;
/**下一頁(yè) */
private int nextPageNum;
/**已經(jīng)分好頁(yè)的結(jié)果集,存放我們查出來(lái)的結(jié)果集*/
private List list;
/**擴(kuò)展屬性
一共每頁(yè)顯示9個(gè)頁(yè)碼按鈕*/
/**開(kāi)始頁(yè)碼*/
private int startPage;
/**結(jié)束頁(yè)碼*/
private int endPage;
/**完善屬性*/
private String url;
/**要想使用我的分頁(yè),必須給我兩個(gè)參數(shù)。一個(gè)是要看哪一頁(yè),另一個(gè)是總記錄條數(shù)*/
public PageModel(int currentPageNum,int totalRecords,int pageSize){
this.currentPageNum = currentPageNum;
this.totalRecords = totalRecords;
this.pageSize=pageSize;
//計(jì)算查詢記錄的開(kāi)始索引
startIndex = (currentPageNum-1)*pageSize;
//計(jì)算總頁(yè)數(shù)
totalPageNum = totalRecords%pageSize==0?(totalRecords/pageSize):(totalRecords/pageSize+1);
//5
startPage = currentPageNum - 4;
//結(jié)束頁(yè)碼
endPage = currentPageNum + 4;
//看看總頁(yè)數(shù)夠不夠9頁(yè)
if(totalPageNum>9){
//超過(guò)了9頁(yè)
if(startPage < 1){
startPage = 1;
endPage = startPage+8;
}
if(endPage>totalPageNum){
endPage = totalPageNum;
startPage = endPage-8;
}
}else{
//不夠9頁(yè)
startPage = 1;
endPage = totalPageNum;
}
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public int getStartPage() {
return startPage;
}
public void setStartPage(int startPage) {
this.startPage = startPage;
}
public int getEndPage() {
return endPage;
}
public void setEndPage(int endPage) {
this.endPage = endPage;
}
public int getPrePageNum() {
prePageNum = currentPageNum-1;
if(prePageNum<1){
prePageNum = 1;
}
return prePageNum;
}
public int getNextPageNum() {
nextPageNum = currentPageNum+1;
if(nextPageNum>totalPageNum){
nextPageNum = totalPageNum;
}
return nextPageNum;
}
public int getCurrentPageNum() {
return currentPageNum;
}
public void setCurrentPageNum(int currentPageNum) {
this.currentPageNum = currentPageNum;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalRecords() {
return totalRecords;
}
public void setTotalRecords(int totalRecords) {
this.totalRecords = totalRecords;
}
public int getTotalPageNum() {
return totalPageNum;
}
public void setTotalPageNum(int totalPageNum) {
this.totalPageNum = totalPageNum;
}
public int getStartIndex() {
return startIndex;
}
public void setStartIndex(int startIndex) {
this.startIndex = startIndex;
}
public void setPrePageNum(int prePageNum) {
this.prePageNum = prePageNum;
}
public void setNextPageNum(int nextPageNum) {
this.nextPageNum = nextPageNum;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
}
三、在servlet編寫(xiě)控制代碼
首先用戶發(fā)送請(qǐng)求,帶上當(dāng)前頁(yè)數(shù),在這表調(diào)用業(yè)務(wù)層的代碼,把以分頁(yè)的形式查詢商品,再把商品查詢出來(lái)之后賦值給我們創(chuàng)建的pageModel對(duì)象,這時(shí)候把這個(gè)對(duì)象傳到前端頁(yè)面,就可以把值取出來(lái),實(shí)現(xiàn)分頁(yè)。
public String findProductByCidWithPage(HttpServletRequest request, HttpServletResponse response) throws Exception {
//獲取cid,num
String cid=request.getParameter("cid");
int curNum=Integer.parseInt(request.getParameter("num"));
//調(diào)用業(yè)務(wù)層的功能:以分頁(yè)的形式查詢當(dāng)前頁(yè)類別下商品信息
//返回PageModel對(duì)象(1當(dāng)前頁(yè)商品信息2分頁(yè)3 url)
ProductService productService=new ProductServiceImp();
PageModel pm=productService.findProductByCidWithPage(cid,curNum);
//將PageModel對(duì)象放入request
request.setAttribute("page", pm);
//轉(zhuǎn)發(fā)到/jsp/product_list.jsp
return "/jsp/product_list.jsp";
}
四、業(yè)務(wù)層service編寫(xiě)業(yè)務(wù)邏輯代碼
當(dāng)調(diào)用業(yè)務(wù)層的業(yè)務(wù)邏輯的時(shí)候,在這邊我們是通過(guò)Dao層把我們要查詢的商品查詢出來(lái)用一個(gè)list接收,再傳給pageModel的屬性list,這時(shí)候就把整個(gè)pageModel對(duì)象傳回去,這邊主要是調(diào)用Dao層查詢和 關(guān)聯(lián)集合,關(guān)聯(lián)URL。
public PageModel findProductByCidWithPage(String cid, int curNum) throws Exception {
//1 創(chuàng)建pageModel對(duì)象 目的:計(jì)算分頁(yè)參數(shù)
//統(tǒng)計(jì)當(dāng)前分類下商品的個(gè)數(shù) select count(*) from product where cid=?
int totalRecords=productDao.findtotalRecords(cid);
PageModel pageModel=new PageModel(curNum, totalRecords, 12);
//2.關(guān)聯(lián)集合 select * form product where cid=? limit ?,?
List list=productDao.findProductByCidWithPage(cid,pageModel.getStartIndex(),pageModel.getPageSize());
pageModel.setList(list);
//3.關(guān)聯(lián)url
pageModel.setUrl("ProductServlet?method=findProductByCidWithPage&cid="+cid);
return pageModel;
}
五、Dao層操作數(shù)據(jù)庫(kù)
為什么我們要在最開(kāi)始分析sql語(yǔ)句,最根源就是在這邊查詢數(shù)據(jù)庫(kù),我們需要把起始頁(yè)和分頁(yè)大小傳進(jìn)去。
public List findProductByCidWithPage(String cid, int startIndex, int pageSize) throws Exception {
String sql="select * from product where cid=? limit ?,?";
QueryRunner qr=new QueryRunner(JDBCUtils.getDataSource());
return qr.query(sql, new BeanListHandler<Product>(Product.class),cid,startIndex,pageSize);
}
六、前端頁(yè)面,顯示分頁(yè)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%--分頁(yè)顯示的開(kāi)始 --%>
<div style="text-align:center">
共${page.totalPageNum}頁(yè)/第${page.currentPageNum}頁(yè)
<a href="${pageContext.request.contextPath}/${page.url}&num=1" rel="external nofollow" >首頁(yè)</a>
<a href="${pageContext.request.contextPath}/${page.url}&num=${page.prePageNum}" rel="external nofollow" >上一頁(yè)</a>
<%--顯示的頁(yè)碼,使用forEach遍歷顯示的頁(yè)面 --%>
<c:forEach begin="${page.startPage}" end="${page.endPage}" var="pagenum">
<a href="${pageContext.request.contextPath}/${page.url}&num=${pagenum}" rel="external nofollow" >${pagenum}</a>
</c:forEach>
<a href="${pageContext.request.contextPath}/${page.url}&num=${page.nextPageNum}" rel="external nofollow" >下一頁(yè)</a>
<a href="${pageContext.request.contextPath}/${page.url}&num=${page.totalPageNum}" rel="external nofollow" >末頁(yè)</a>
<input type="text" id="pagenum" name="pagenum" size="1"/><input type="button" value="前往" onclick="jump()" />
<script type="text/javascript">
function jump(){
var totalpage = ${page.totalPageNum};
var pagenum = document.getElementById("pagenum").value;
//判斷輸入的是一個(gè)數(shù)字
var reg =/^[1-9][0-9]{0,1}$/;
if(!reg.test(pagenum)){
//不是一個(gè)有效數(shù)字
alert("請(qǐng)輸入符合規(guī)定的數(shù)字");
return ;
}
//判斷輸入的數(shù)字不能大于總頁(yè)數(shù)
if(parseInt(pagenum)>parseInt(totalpage)){
//超過(guò)了總頁(yè)數(shù)
alert("不能大于總頁(yè)數(shù)");
return;
}
//轉(zhuǎn)向分頁(yè)顯示的Servlet
window.location.href="${pageContext.request.contextPath}/${page.url}&num=" rel="external nofollow" +pagenum;
}
</script>
</div>
<%--分頁(yè)顯示的結(jié)束--%>
因?yàn)閷⑽覀兯行枰臄?shù)據(jù)都封裝在了pageModel中,pageModel對(duì)象又在request域中,所以在jsp頁(yè)面中,我們只需要拿到我們所需要的數(shù)據(jù),進(jìn)行顯示即可,構(gòu)造導(dǎo)航圖需要注意的有一點(diǎn),邏輯要搞清楚,想要顯示什么不想顯示什么,全屏自己控制了,只需要記得一點(diǎn),在請(qǐng)求Servlet時(shí),需要把請(qǐng)求的頁(yè)碼交給服務(wù)器。不然服務(wù)器不知道你要獲得第幾頁(yè)的數(shù)據(jù)。
總結(jié)
其實(shí)分頁(yè)也不太難,一個(gè)難點(diǎn)就是javaBean的構(gòu)建,只要弄清楚pageModel里面需要哪些屬性,各種屬性的作用是什么,就會(huì)很清晰了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
如何在Java中調(diào)用python文件執(zhí)行詳解
豐富的第三方庫(kù)使得python非常適合用于進(jìn)行數(shù)據(jù)分析,最近在項(xiàng)目中就涉及到j(luò)ava調(diào)用python實(shí)現(xiàn)的算法,下面這篇文章主要給大家介紹了關(guān)于如何在Java中調(diào)用python文件執(zhí)行的相關(guān)資料,需要的朋友可以參考下2022-05-05
Java實(shí)現(xiàn)將word轉(zhuǎn)換為html的方法示例【doc與docx格式】
這篇文章主要介紹了Java實(shí)現(xiàn)將word轉(zhuǎn)換為html的方法,結(jié)合實(shí)例形式分析了java針對(duì)doc與docx格式文件的相關(guān)轉(zhuǎn)換操作技巧,需要的朋友可以參考下2019-03-03
支票金額大寫(xiě)轉(zhuǎn)換示例(金額大寫(xiě)轉(zhuǎn)換器)
這篇文章主要介紹了支票金額大寫(xiě)轉(zhuǎn)換示例(金額大寫(xiě)轉(zhuǎn)換器),需要的朋友可以參考下2014-02-02
SpringMVC+Spring+Mybatis實(shí)現(xiàn)支付寶支付功能的示例代碼
這篇文章主要介紹了SpringMVC+Spring+Mybatis實(shí)現(xiàn)支付寶支付功能的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
Java實(shí)現(xiàn)注冊(cè)登錄與郵箱發(fā)送賬號(hào)驗(yàn)證激活功能
這篇文章主要介紹了Java實(shí)現(xiàn)注冊(cè)登錄與郵箱發(fā)送賬號(hào)驗(yàn)證激活功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-12-12
Java實(shí)現(xiàn)支付對(duì)接常用加密方式的示例代碼
這篇文章主要為大家詳細(xì)介紹了Java如何實(shí)現(xiàn)支付對(duì)接時(shí)常用加密方式,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一點(diǎn)幫助,需要的可以參考一下2023-02-02
SpringMVC4.3?HttpMessageConverter接口實(shí)現(xiàn)源碼分析
這篇文章主要為大家介紹了SpringMVC4.3?HttpMessageConverter接口實(shí)現(xiàn)源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09

