很多时候我们都会用到分页,模版渲染有的用的是jsp,velocity,freemarker。。。
今天搞了下分页的发现有点烧脑,哈。 首先后台进行分页的时候会直接在sql里面实现,这个都大同小异,这里来说下在内存中分页,先上代码:
java内存分页: 通过传入查询出来的总的list数据,页码页数来得到当页的list数据。
/**
* 内存分页,从1开始
* @param list list
* @param pageIndex 页码
* @param pageSize 页数
* @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);
}
####后台得到数据之后需要由前端渲染得到分页html代码,下面是分别使用freemarker和jsp的实现.
使用freemarker,可以定义分页宏方便的解决这个问题。
#if>
pageSize)>
#if>
#if>
1)>
<<#if>
5)>
#if>
...#if>
pageCount)>
#if>
${index?c} ${index?c}#if>
#list>
pageCount)>
#if>
...#if>
>>#if>
#macro>
使用jsp,这里我是直接在java代码里实现的分页插件。
/**
* 分页工具
* @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("
- ");
int pageCount = (int) (totalCount%pageSize==0?totalCount/pageSize:totalCount/pageSize+1);
int start;
if(pageIndex>1) {
stringBuilder.append("
<<");}
if( pageIndex>5 ){
int prevPages = pageIndex-9;
if( prevPages<1 ){
prevPages=1;
}
start = pageIndex-4;
stringBuilder.append("
...");}else{
start=1;
}
int end = pageIndex+4;
if( end>pageCount ) end=pageCount;
for(int index=start;index<=end;index++){
if( pageIndex==index ){
stringBuilder.append("
").append(index) ");}else if(index!=0){
stringBuilder.append("
").append(index).append("");}
}
if( end
int endFive = end+4;
if( end>pageCount ){
endFive=pageCount;
}
stringBuilder.append("
...");}
if( pageIndex
stringBuilder.append("
>>");}
stringBuilder.append("
return stringBuilder.toString();
}
像这样就可以了,至于传入的url是什么鬼,比如"index.jsp?p="或者"index.jsp?type=XXX&t=XXX&p="。
这里我自己定义的页码参数是p,看自己心情喽。
总之不管你使用何种方法,这几个参数是需要的:传入的需要拼接的url,页码pageIndex,一页显示多少数据pageSize, 总共多少totalCount.