這篇文章將為大家詳細(xì)講解有關(guān)java web如何實(shí)現(xiàn)分頁功能,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
榆陽網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。成都創(chuàng)新互聯(lián)于2013年開始到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。
現(xiàn)在很多流行的框架,都可以很快的把分頁效果做出來,但是作為一名程序員你必須得知道手寫分頁的流程:
場景效果:
一、分頁的思路
首先我們得知道寫分頁代碼的思路,保持思路清晰,才能行云流水的去寫代碼,其實(shí)不管是在寫什么代碼,思路,思想特別重要,先想好再動(dòng)手,就會(huì)事半功倍!
先來分析SQL語句實(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)前頁 起始值 每頁數(shù)據(jù)大小
1 0 5
2 5 5
3 10 5
4 15 5
結(jié)論:
(1)(當(dāng)前頁-1)*(每頁數(shù)量)=起始值
(2)要想實(shí)現(xiàn)分頁,向服務(wù)端發(fā)起請求的時(shí)候,必須傳遞當(dāng)前頁。
二、創(chuàng)建PageBean存放數(shù)據(jù)
這時(shí)候我們需要封裝一個(gè)包裝類,來封裝我們的分頁數(shù)據(jù)
package cn.itcast.store.domain; import java.util.List; /** * 存放分頁相關(guān)的數(shù)據(jù) * * @author yechengchao */ public class PageModel { //基本屬性 /**當(dāng)前頁數(shù),由用戶指定 */ private int currentPageNum; /**每頁顯示的條數(shù),可以由用戶指定每頁顯示多少 */ private int pageSize =5; /**總記錄條數(shù),數(shù)據(jù)庫查出來的 */ private int totalRecords; /**總頁數(shù),計(jì)算出來的 */ private int totalPageNum; /**每頁開始記錄的索引,計(jì)算出來的 (當(dāng)前頁-1)*(每頁數(shù)量)=起始值 */ private int startIndex; /**上一頁 */ private int prePageNum; /**下一頁 */ private int nextPageNum; /**已經(jīng)分好頁的結(jié)果集,存放我們查出來的結(jié)果集*/ private List list; /**擴(kuò)展屬性 一共每頁顯示9個(gè)頁碼按鈕*/ /**開始頁碼*/ private int startPage; /**結(jié)束頁碼*/ private int endPage; /**完善屬性*/ private String url; /**要想使用我的分頁,必須給我兩個(gè)參數(shù)。一個(gè)是要看哪一頁,另一個(gè)是總記錄條數(shù)*/ public PageModel(int currentPageNum,int totalRecords,int pageSize){ this.currentPageNum = currentPageNum; this.totalRecords = totalRecords; this.pageSize=pageSize; //計(jì)算查詢記錄的開始索引 startIndex = (currentPageNum-1)*pageSize; //計(jì)算總頁數(shù) totalPageNum = totalRecords%pageSize==0?(totalRecords/pageSize):(totalRecords/pageSize+1); //5 startPage = currentPageNum - 4; //結(jié)束頁碼 endPage = currentPageNum + 4; //看看總頁數(shù)夠不夠9頁 if(totalPageNum>9){ //超過了9頁 if(startPage < 1){ startPage = 1; endPage = startPage+8; } if(endPage>totalPageNum){ endPage = totalPageNum; startPage = endPage-8; } }else{ //不夠9頁 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編寫控制代碼
首先用戶發(fā)送請求,帶上當(dāng)前頁數(shù),在這表調(diào)用業(yè)務(wù)層的代碼,把以分頁的形式查詢商品,再把商品查詢出來之后賦值給我們創(chuàng)建的pageModel對象,這時(shí)候把這個(gè)對象傳到前端頁面,就可以把值取出來,實(shí)現(xiàn)分頁。
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ù)層的功能:以分頁的形式查詢當(dāng)前頁類別下商品信息 //返回PageModel對象(1當(dāng)前頁商品信息2分頁3 url) ProductService productService=new ProductServiceImp(); PageModel pm=productService.findProductByCidWithPage(cid,curNum); //將PageModel對象放入request request.setAttribute("page", pm); //轉(zhuǎn)發(fā)到/jsp/product_list.jsp return "/jsp/product_list.jsp"; }
四、業(yè)務(wù)層service編寫業(yè)務(wù)邏輯代碼
當(dāng)調(diào)用業(yè)務(wù)層的業(yè)務(wù)邏輯的時(shí)候,在這邊我們是通過Dao層把我們要查詢的商品查詢出來用一個(gè)list接收,再傳給pageModel的屬性list,這時(shí)候就把整個(gè)pageModel對象傳回去,這邊主要是調(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對象 目的:計(jì)算分頁參數(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ù)庫
為什么我們要在最開始分析sql語句,最根源就是在這邊查詢數(shù)據(jù)庫,我們需要把起始頁和分頁大小傳進(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); }
六、前端頁面,顯示分頁
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%--分頁顯示的開始 --%> <div > 共${page.totalPageNum}頁/第${page.currentPageNum}頁 <a href="${pageContext.request.contextPath}/${page.url}&num=1" rel="external nofollow" >首頁</a> <a href="${pageContext.request.contextPath}/${page.url}&num=${page.prePageNum}" rel="external nofollow" >上一頁</a> <%--顯示的頁碼,使用forEach遍歷顯示的頁面 --%> <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" >下一頁</a> <a href="${pageContext.request.contextPath}/${page.url}&num=${page.totalPageNum}" rel="external nofollow" >末頁</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("請輸入符合規(guī)定的數(shù)字"); return ; } //判斷輸入的數(shù)字不能大于總頁數(shù) if(parseInt(pagenum)>parseInt(totalpage)){ //超過了總頁數(shù) alert("不能大于總頁數(shù)"); return; } //轉(zhuǎn)向分頁顯示的Servlet window.location.href="${pageContext.request.contextPath}/${page.url}&num=" rel="external nofollow" +pagenum; } </script> </div> <%--分頁顯示的結(jié)束--%>
因?yàn)閷⑽覀兯行枰臄?shù)據(jù)都封裝在了pageModel中,pageModel對象又在request域中,所以在jsp頁面中,我們只需要拿到我們所需要的數(shù)據(jù),進(jìn)行顯示即可,構(gòu)造導(dǎo)航圖需要注意的有一點(diǎn),邏輯要搞清楚,想要顯示什么不想顯示什么,全屏自己控制了,只需要記得一點(diǎn),在請求Servlet時(shí),需要把請求的頁碼交給服務(wù)器。不然服務(wù)器不知道你要獲得第幾頁的數(shù)據(jù)。
關(guān)于“java web如何實(shí)現(xiàn)分頁功能”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請把它分享出去讓更多的人看到。
網(wǎng)站名稱:javaweb如何實(shí)現(xiàn)分頁功能
鏈接分享:http://jinyejixie.com/article36/ggsisg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、虛擬主機(jī)、網(wǎng)站維護(hù)、企業(yè)建站、品牌網(wǎng)站設(shè)計(jì)、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)