freemarker?jsp?java內(nèi)存方式實現(xiàn)分頁示例
引言
很多時候我們都會用到分頁,模版渲染有的用的是 jsp,velocity,freemarker。。。
今天搞了下分頁的發(fā)現(xiàn)有點燒腦,哈。 首先后臺進行分頁的時候會直接在 sql 里面實現(xiàn),這個都大同小異,這里來說下在內(nèi)存中分頁,先上代碼:
java 內(nèi)存分頁
通過傳入查詢出來的總的 list 數(shù)據(jù),頁碼頁數(shù)來得到當頁的 list 數(shù)據(jù)。
/** ?*?內(nèi)存分頁,從1開始 ?*?@param?list?list ?*?@param?pageIndex?頁碼 ?*?@param?pageSize?頁數(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); }
#### 后臺得到數(shù)據(jù)之后需要由前端渲染得到分頁 html 代碼,下面是分別使用 freemarker 和 jsp 的實現(xiàn).
使用 freemarker
可以定義分頁宏方便的解決這個問題。
<#macro?page?pageUrl?totalCount?pageIndex?pageSize> ???<#--?頁碼為小于1的,惡意翻頁的情況直接退出?--> ???<#if?pageIndex<=0> ??????<#assign?pageIndex=1> ???</#if> ???<#--?數(shù)量大于總數(shù)量,惡意翻頁的情況直接退出?--> ???<#if?((pageIndex*pageSize-totalCount)>pageSize)> ??????<#return> ???</#if> ???<#--?只有一頁的數(shù)據(jù)就不顯示分頁了?--> ???<#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="首頁"><<</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頁">...</a></li> ??????<#else> ?????????<#assign?start=1> ??????</#if> ??????<#--?顯示當前頁附近的頁--> ??????<#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> ??????<#--如果后面頁數(shù)過多,顯示"...":--> ??????<#if?(end?lt?pageCount)> ?????????<#assign?endend=end+4> ?????????<#if?(endend>pageCount)> ????????????<#assign?endend=pageCount> ?????????</#if> ?????????<li><a?href="${pageUrl+endend?c}"?title="向后5頁">...</a><li> ??????</#if> ??????<#--?顯示"下一頁":--> ??????<#if?(pageIndex?lt?pageCount)> ?????????<li><a?href="${pageUrl+pageCount?c}"?title="末頁">>></a></li> ??????</#if> ??????</nav> </#macro>
使用 jsp
- 這里我是直接在 java 代碼里實現(xiàn)的分頁插件。
/** * 分頁工具 * @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(); // 惡意翻頁 } if( totalCount<=pageSize ){ return stringBuilder.toString(); //只有一頁就不顯示了 } 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='首頁'><<</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頁'>...</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頁'>...</a><li>"); } if( pageIndex<pageCount ){ stringBuilder.append("<li><a href='").append(pageUrl).append(pageCount).append("' title='末頁'>>></a></li>"); } stringBuilder.append("</ul></div>"); return stringBuilder.toString(); }
像這樣就可以了,至于傳入的 url 是什么鬼,比如 "index.jsp?p="
或者 "index.jsp?type=XXX&t=XXX&p="
。
這里我自己定義的頁碼參數(shù)是 p,看自己心情嘍。
總之不管你使用何種方法,這幾個參數(shù)是需要的:傳入的需要拼接的 url,頁碼 pageIndex,一頁顯示多少數(shù)據(jù) pageSize, 總共多少 totalCount.
以上就是freemarker jsp java內(nèi)存方式實現(xiàn)分頁示例的詳細內(nèi)容,更多關(guān)于freemarker jsp java內(nèi)存分頁的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
spring中@autowired、@Qualifier、@Primary注解的使用說明
這篇文章主要介紹了spring中@autowired、@Qualifier、@Primary注解的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11解讀動態(tài)數(shù)據(jù)源dynamic-datasource-spring-boot-starter使用問題
這篇文章主要介紹了解讀動態(tài)數(shù)據(jù)源dynamic-datasource-spring-boot-starter使用問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03JavaWeb項目中springmvc和tomcat對靜態(tài)文件的處理
這篇文章主要介紹了JavaWeb項目中springmvc和tomcat對靜態(tài)文件的處理 的相關(guān)資料,需要的朋友可以參考下2016-07-07Java后端WebSocket的Tomcat實現(xiàn)
這篇文章主要介紹了Java后端WebSocket的Tomcat實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06