最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java web手寫實(shí)現(xiàn)分頁功能

 更新時(shí)間:2020年02月18日 10:16:55   作者:yechengchao  
這篇文章主要為大家詳細(xì)介紹了java web手寫實(shí)現(xiàn)分頁功能的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

現(xiàn)在很多流行的框架,都可以很快的把分頁效果做出來,但是作為一名程序員你必須得知道手寫分頁的流程:

場(chǎng)景效果:

一、分頁的思路

首先我們得知道寫分頁代碼的思路,保持思路清晰,才能行云流水的去寫代碼,其實(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ā)起請(qǐng)求的時(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ā)送請(qǐng)求,帶上當(dāng)前頁數(shù),在這表調(diào)用業(yè)務(wù)層的代碼,把以分頁的形式查詢商品,再把商品查詢出來之后賦值給我們創(chuàng)建的pageModel對(duì)象,這時(shí)候把這個(gè)對(duì)象傳到前端頁面,就可以把值取出來,實(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對(duì)象(1當(dāng)前頁商品信息2分頁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編寫業(yè)務(wù)邏輯代碼

當(dāng)調(diào)用業(yè)務(wù)層的業(yè)務(wù)邏輯的時(shí)候,在這邊我們是通過Dao層把我們要查詢的商品查詢出來用一個(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ì)算分頁參數(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 style="text-align:center">
 共${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("請(qǐng)輸入符合規(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對(duì)象又在request域中,所以在jsp頁面中,我們只需要拿到我們所需要的數(shù)據(jù),進(jìn)行顯示即可,構(gòu)造導(dǎo)航圖需要注意的有一點(diǎn),邏輯要搞清楚,想要顯示什么不想顯示什么,全屏自己控制了,只需要記得一點(diǎn),在請(qǐng)求Servlet時(shí),需要把請(qǐng)求的頁碼交給服務(wù)器。不然服務(wù)器不知道你要獲得第幾頁的數(shù)據(jù)。

總結(jié)

其實(shí)分頁也不太難,一個(gè)難點(diǎn)就是javaBean的構(gòu)建,只要弄清楚pageModel里面需要哪些屬性,各種屬性的作用是什么,就會(huì)很清晰了。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于重定向RedirectAttributes的用法解析

    基于重定向RedirectAttributes的用法解析

    這篇文章主要介紹了基于重定向RedirectAttributes的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Springboot使用thymeleaf動(dòng)態(tài)模板實(shí)現(xiàn)刷新

    Springboot使用thymeleaf動(dòng)態(tài)模板實(shí)現(xiàn)刷新

    這篇文章主要介紹了Springboot使用thymeleaf動(dòng)態(tài)模板實(shí)現(xiàn)刷新,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • redis中存儲(chǔ)list<map>,list<entity>的處理

    redis中存儲(chǔ)list<map>,list<entity>的處理

    本文主要介紹了redis中存儲(chǔ)list<map>,list<entity>的處理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • SpringBoot條件注解之@ConditionalOnClass等注解的使用場(chǎng)景分析

    SpringBoot條件注解之@ConditionalOnClass等注解的使用場(chǎng)景分析

    文章詳細(xì)介紹了SpringBoot中條件注解的體系,包括基本概念、@ConditionalOnClass等常用注解的工作原理和使用場(chǎng)景,文章還探討了條件注解的組合使用、實(shí)戰(zhàn)應(yīng)用以及最佳實(shí)踐,幫助開發(fā)者更好地理解和應(yīng)用條件注解,實(shí)現(xiàn)更靈活和智能的應(yīng)用配置,感興趣的朋友一起看看吧
    2025-03-03
  • Java中的集合工具類Collections詳解

    Java中的集合工具類Collections詳解

    這篇文章主要介紹了Java中的集合工具類Collections詳解,java.utils.Collections是集合工具類,用來對(duì)集合進(jìn)行操作,不是Collection集合的根接口,這個(gè)要區(qū)分開來,需要的朋友可以參考下
    2024-01-01
  • SpringBoot之如何搭建SpringBoot+Maven項(xiàng)目

    SpringBoot之如何搭建SpringBoot+Maven項(xiàng)目

    這篇文章主要介紹了SpringBoot之如何搭建SpringBoot+Maven項(xiàng)目問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 一文帶你真正理解Java中的內(nèi)部類

    一文帶你真正理解Java中的內(nèi)部類

    不知道大家在平時(shí)的開發(fā)過程中或者源碼里是否留意過內(nèi)部類,那有思考過為什么要有內(nèi)部類,內(nèi)部類都有哪幾種形式,本篇文章主要帶領(lǐng)大家理解下這塊內(nèi)容
    2022-08-08
  • Java中sort排序函數(shù)實(shí)例詳解

    Java中sort排序函數(shù)實(shí)例詳解

    我們經(jīng)常使用java中的sort排序,確實(shí)好用,但是其中原理大多數(shù)人都是不了解的,下面這篇文章主要給大家介紹了關(guān)于Java中sort排序函數(shù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • Java操作Mongodb數(shù)據(jù)庫實(shí)現(xiàn)數(shù)據(jù)的增刪查改功能示例

    Java操作Mongodb數(shù)據(jù)庫實(shí)現(xiàn)數(shù)據(jù)的增刪查改功能示例

    這篇文章主要介紹了Java操作Mongodb數(shù)據(jù)庫實(shí)現(xiàn)數(shù)據(jù)的增刪查改功能,結(jié)合完整實(shí)例形式分析了java針對(duì)MongoDB數(shù)據(jù)庫的連接、增刪改查等相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • Java泛型類型擦除

    Java泛型類型擦除

    這篇文章主要為大家詳細(xì)介紹了Java泛型類型擦除,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03

最新評(píng)論

板桥市| 鄄城县| 临桂县| 大新县| 屯留县| 平乡县| 通榆县| 碌曲县| 普兰店市| 景宁| 南召县| 正镶白旗| 高碑店市| 元阳县| 东乡| 祁连县| 长宁区| 遵义市| 鄂温| 石台县| 固镇县| 大名县| 安岳县| 古交市| 乐昌市| 宁明县| 隆化县| 南丰县| 浦城县| 木里| 田东县| 定安县| 桂阳县| 淮南市| 呼图壁县| 波密县| 梅河口市| 崇礼县| 祁阳县| 滨州市| 乐东|