freemarker?jsp?java內(nèi)存方式實(shí)現(xiàn)分頁(yè)示例
引言
很多時(shí)候我們都會(huì)用到分頁(yè),模版渲染有的用的是 jsp,velocity,freemarker。。。
今天搞了下分頁(yè)的發(fā)現(xiàn)有點(diǎn)燒腦,哈。 首先后臺(tái)進(jìn)行分頁(yè)的時(shí)候會(huì)直接在 sql 里面實(shí)現(xiàn),這個(gè)都大同小異,這里來(lái)說(shuō)下在內(nèi)存中分頁(yè),先上代碼:
java 內(nèi)存分頁(yè)
通過(guò)傳入查詢出來(lái)的總的 list 數(shù)據(jù),頁(yè)碼頁(yè)數(shù)來(lái)得到當(dāng)頁(yè)的 list 數(shù)據(jù)。
/** ?*?內(nèi)存分頁(yè),從1開(kāi)始 ?*?@param?list?list ?*?@param?pageIndex?頁(yè)碼 ?*?@param?pageSize?頁(yè)數(shù) ?*?@param??T ?*?@return?T ?*/ public?static??List?pagination(List?list,?int?pageIndex,?int?pageSize){ ????final?int?totalSize?=?list.size(); ????pageIndex?=?pageIndex?<=?1???1?:?pageIndex; ????int?startIndex?=?Math.max((pageIndex?-?1)?*?pageSize,?0); ????startIndex?=?Math.min(startIndex,?totalSize); ????int?endIndex?=?startIndex?+?pageSize; ????endIndex?=?Math.min(endIndex,?totalSize); ????return?list.subList(startIndex,?endIndex); }
#### 后臺(tái)得到數(shù)據(jù)之后需要由前端渲染得到分頁(yè) html 代碼,下面是分別使用 freemarker 和 jsp 的實(shí)現(xiàn).
使用 freemarker
可以定義分頁(yè)宏方便的解決這個(gè)問(wèn)題。
<#macro?page?pageUrl?totalCount?pageIndex?pageSize> ???<#--?頁(yè)碼為小于1的,惡意翻頁(yè)的情況直接退出?--> ???<#if?pageIndex<=0> ??????<#assign?pageIndex=1> ???</#if> ???<#--?數(shù)量大于總數(shù)量,惡意翻頁(yè)的情況直接退出?--> ???<#if?((pageIndex*pageSize-totalCount)>pageSize)> ??????<#return> ???</#if> ???<#--?只有一頁(yè)的數(shù)據(jù)就不顯示分頁(yè)了?--> ???<#if?(totalCount<=pageSize)> ??????<#return> ???</#if> ???<nav?class="nav-pagination"> ??????<ul?class="pagination"> ??????<#assign?pageCount=(totalCount/pageSize)?ceiling> ??????<#if?(pageIndex>1)> ?????????<li><a?href="${pageUrl+1}"?title="首頁(yè)"><<</a></li> ??????</#if> ??????<#if?(pageIndex>5)> ?????????<#assign?prevPages=pageIndex-9> ?????????<#if?prevPages?lt?1> ????????????<#assign?prevPages=1> ?????????</#if> ?????????<#assign?start=pageIndex-4> ?????????<li><a?href="${pageUrl+prevPages?c}"?title="向前5頁(yè)">...</a></li> ??????<#else> ?????????<#assign?start=1> ??????</#if> ??????<#--?顯示當(dāng)前頁(yè)附近的頁(yè)--> ??????<#assign?end=pageIndex+4> ??????<#if?(end>pageCount)> ?????????<#assign?end=pageCount> ??????</#if> ??????<#list?start..end?as?index> ?????????<#if?pageIndex==index> ????????????<li?class="active"><a?href="${pageUrl+index?c}"><b>${index?c}</b></a></li> ?????????<#elseif?index!=0> ????????????<li><a?href="${pageUrl+index?c}">${index?c}</a></li> ?????????</#if> ??????</#list> ??????<#--如果后面頁(yè)數(shù)過(guò)多,顯示"...":--> ??????<#if?(end?lt?pageCount)> ?????????<#assign?endend=end+4> ?????????<#if?(endend>pageCount)> ????????????<#assign?endend=pageCount> ?????????</#if> ?????????<li><a?href="${pageUrl+endend?c}"?title="向后5頁(yè)">...</a><li> ??????</#if> ??????<#--?顯示"下一頁(yè)":--> ??????<#if?(pageIndex?lt?pageCount)> ?????????<li><a?href="${pageUrl+pageCount?c}"?title="末頁(yè)">>></a></li> ??????</#if> ??????</nav> </#macro>
使用 jsp
- 這里我是直接在 java 代碼里實(shí)現(xiàn)的分頁(yè)插件。
/** * 分頁(yè)工具 * @param pageUrl * @param pageIndex * @param pageSize * @param totalCount * @return string */ public static String page(String pageUrl,int pageIndex,int pageSize,long totalCount){ StringBuilder stringBuilder = new StringBuilder(""); if( pageIndex<=0 ){ pageIndex=1; } if( (pageIndex*pageSize-totalCount) >pageSize ){ return stringBuilder.toString(); // 惡意翻頁(yè) } if( totalCount<=pageSize ){ return stringBuilder.toString(); //只有一頁(yè)就不顯示了 } stringBuilder.append("<div class='pagination'><ul>"); int pageCount = (int) (totalCount%pageSize==0?totalCount/pageSize:totalCount/pageSize+1); int start; if(pageIndex>1) { stringBuilder.append("<li><a href='").append(pageUrl).append("1' title='首頁(yè)'><<</a></li>"); } if( pageIndex>5 ){ int prevPages = pageIndex-9; if( prevPages<1 ){ prevPages=1; } start = pageIndex-4; stringBuilder.append("<li><a href='").append(pageUrl).append(prevPages).append("' title='向前5頁(yè)'>...</a></li>"); }else{ start=1; } int end = pageIndex+4; if( end>pageCount ) end=pageCount; for(int index=start;index<=end;index++){ if( pageIndex==index ){ stringBuilder.append("<li class='active'><a href='") .append(pageUrl).append(index) .append("'><b>").append(index) .append("</b></a></li>"); }else if(index!=0){ stringBuilder.append("<li><a href='").append(pageUrl).append(index).append("'>").append(index).append("</a></li>"); } } if( end<pageCount ){ int endFive = end+4; if( end>pageCount ){ endFive=pageCount; } stringBuilder.append("<li><a href='").append(pageUrl).append(endFive).append("' title='向后5頁(yè)'>...</a><li>"); } if( pageIndex<pageCount ){ stringBuilder.append("<li><a href='").append(pageUrl).append(pageCount).append("' title='末頁(yè)'>>></a></li>"); } stringBuilder.append("</ul></div>"); return stringBuilder.toString(); }
像這樣就可以了,至于傳入的 url 是什么鬼,比如 "index.jsp?p="
或者 "index.jsp?type=XXX&t=XXX&p="
。
這里我自己定義的頁(yè)碼參數(shù)是 p,看自己心情嘍。
總之不管你使用何種方法,這幾個(gè)參數(shù)是需要的:傳入的需要拼接的 url,頁(yè)碼 pageIndex,一頁(yè)顯示多少數(shù)據(jù) pageSize, 總共多少 totalCount.
以上就是freemarker jsp java內(nèi)存方式實(shí)現(xiàn)分頁(yè)示例的詳細(xì)內(nèi)容,更多關(guān)于freemarker jsp java內(nèi)存分頁(yè)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
spring中@autowired、@Qualifier、@Primary注解的使用說(shuō)明
這篇文章主要介紹了spring中@autowired、@Qualifier、@Primary注解的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11解讀動(dòng)態(tài)數(shù)據(jù)源dynamic-datasource-spring-boot-starter使用問(wèn)題
這篇文章主要介紹了解讀動(dòng)態(tài)數(shù)據(jù)源dynamic-datasource-spring-boot-starter使用問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03JavaWeb項(xiàng)目中springmvc和tomcat對(duì)靜態(tài)文件的處理
這篇文章主要介紹了JavaWeb項(xiàng)目中springmvc和tomcat對(duì)靜態(tài)文件的處理 的相關(guān)資料,需要的朋友可以參考下2016-07-07Java 實(shí)現(xiàn)LZ78壓縮算法的示例代碼
這篇文章主要介紹了Java 實(shí)現(xiàn)LZ78壓縮算法的示例代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05java根據(jù)負(fù)載自動(dòng)抓取jstack?dump詳情
這篇文章主要介紹了java根據(jù)負(fù)載自動(dòng)抓取jstack?dump詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09Java后端WebSocket的Tomcat實(shí)現(xiàn)
這篇文章主要介紹了Java后端WebSocket的Tomcat實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06