思想:当查出来的数据很多时(例如:超过10万),采用精简的默认的样式,也就是指只显示首尾页上一页 和下一页。当总页数不大于9页时,把所有的具体页码以按钮形式显示出来,页码按钮如果等于当前则显于背景色。当总页数大于9页,分页样式以另外的样式显示,当当前页小于3页或大于等于后两页时,显示前六页的按钮和后两页按钮,其他情况显示前两页和后两页按钮,中间显示当前页码的和它后5页的页码,并且支持页码跳转,废话不多说,献上部分实现代码;
//跳转的样式
String tiao="
";//简单的样式,默认样式
String all=first+pre+next+last
+""+curpage+"/"
+sumPage+"一共有"+total+"条记录"
+""+tiao;
//样式一,如果总页数不大于9页,则输出所有页数
String allPage="";
if(sumPage<=9){
allPage = bindAllPage(1,pattern, sumPage,sumPage, allPage);
all=pre+allPage+next
+""+"当前第"+curpage+"页"+"/"
+"共"+sumPage+"页"+" 共"+total+"条记录"
+""+tiao;
}else{//样式二,当总页数大于9时显示
//第一、第二页
String one=bindAllPage(1,pattern, 2,sumPage, allPage);
//最后一页和倒数第一页
String floot=bindAllPage(sumPage-1,pattern, sumPage,sumPage, allPage);
if(curpage>2&&curpage<=sumPage-2){//当当前页小于后两页大于前两页时
allPage = bindAllPage(curpage,pattern, curpage+5,sumPage-2, allPage);
all=pre+one+"..."+allPage+"..."+floot
+""+next+"当前第"+curpage+"页"+"/"
+"共"+sumPage+"页"+" 共"+total+"条记录"
+""+tiao;
}else{//当当前页不大于前两页时,显示前六页
allPage = bindAllPage(3,pattern, 6,sumPage, allPage);
all=pre+one+allPage+"..."+floot
+""+next+"当前第"+curpage+"页"+"/"
+"共"+sumPage+"页"+" 共"+total+"条记录"
+""+tiao;
}
}
getJspContext().getOut().print(all);
}
还有需要一个绑定页码方法,还用于强调当前页的样式,因为这里面都有用到,所以重构了这个方法:
/**
* 绑定要显示的页数方法
* @param nub开始页数
* @param pattern
* @param page截止页数
* @param sumPage总页数
* @param allPage要输出的页数
* @return
*/
private String bindAllPage(int nub,String pattern, int page,int sumPage, String allPage) {
for( int i=nub;i<=page&&i<=sumPage;i++){
if(i==curpage){
allPage+=MessageFormat.format(pattern,
url,i,pagesize,where,
""
);
}else{
allPage+=MessageFormat.format(pattern,
url,i,pagesize,where,""
);
}
}
return allPage;
}
显示效果如下:
小于9页时:
大于9页并且当前页不大于2时或大于等于后两页时:
其他情况:
完整代码:
import java.io.IOException;
import java.text.MessageFormat;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/**
* 分页标签处理类
* @author DAM
*
*/
public class PageTag extends SimpleTagSupport {
private String url;//链接地址
private int curpage;//当前页数
private int pagesize;//一页中要显示的记录数
private int total;//总的记录数
private String where;//查询的条件名称
private String wheredata;//查询的条件值
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public int getCurpage() {
return curpage;
}
public void setCurpage(int curpage) {
this.curpage = curpage;
}
public int getPagesize() {
return pagesize;
}
public void setPagesize(int pagesize) {
this.pagesize = pagesize;
}
public int getTotal() {
return total;
}
public void setTotal(int tatal) {
this.total = tatal;
}
public String getWhere() {
return where;
}
public void setWhere(String where) {
this.where = where;
}
public String getWheredata() {
return wheredata;
}
public void setWheredata(String wheredata) {
this.wheredata = wheredata;
}
@Override
public void doTag() throws JspException, IOException {
super.doTag();
String pattern="{4}";
int sumPage=(total-1)/pagesize+1;//总页数
wheredata=wheredata==null?"":wheredata;
//上一页
String pre=null;
if(curpage<=1){
pre="";
}else{
pre=MessageFormat.format(pattern,
url,curpage-1,pagesize,wheredata,"");
}
//下一页
String next=null;
if(curpage>=sumPage){
next="";
}else{
next=MessageFormat.format(pattern,
url,curpage+1,pagesize,wheredata,"");
}
//首页
String first=MessageFormat.format(pattern,
url,1,pagesize,wheredata,"");
//尾页
String last=MessageFormat.format(pattern,
url,sumPage,pagesize,wheredata,"");
//跳转的样式
String tiao="";
//简单的样式,默认样式
String all=first+pre+next+last
+""+curpage+"/"
+sumPage+"一共有"+total+"条记录"
+""+tiao;
//样式一,如果总页数不大于9页,则输出所有页数
String allPage="";
if(sumPage<=9){
allPage = bindAllPage(1,pattern, sumPage,sumPage, allPage);
all=pre+allPage+next
+""+"当前第"+curpage+"页"+"/"
+"共"+sumPage+"页"+" 共"+total+"条记录"
+""+tiao;
}else{//样式二,当总页数大于9时显示
//第一、第二页
String one=bindAllPage(1,pattern, 2,sumPage, allPage);
//最后一页和倒数第一页
String floot=bindAllPage(sumPage-1,pattern, sumPage,sumPage, allPage);
if(curpage>2&&curpage<=sumPage-2){//当当前页小于后两页大于前两页时
allPage = bindAllPage(curpage,pattern, curpage+5,sumPage-2, allPage);
all=pre+one+"..."+allPage+"..."+floot
+""+next+"当前第"+curpage+"页"+"/"
+"共"+sumPage+"页"+" 共"+total+"条记录"
+""+tiao;
}else{//当当前页小于3页或大于等于后两页时,显示前六页的按钮和后两页按钮,
allPage = bindAllPage(3,pattern, 6,sumPage, allPage);
all=pre+one+allPage+"..."+floot
+""+next+"当前第"+curpage+"页"+"/"
+"共"+sumPage+"页"+" 共"+total+"条记录"
+""+tiao;
}
}
getJspContext().getOut().print(all);
}
/**
* 绑定要显示的页数方法
* @param nub开始页数
* @param pattern
* @param page截止页数
* @param sumPage总页数
* @param allPage要输出的页数
* @return
*/
private String bindAllPage(int nub,String pattern, int page,int sumPage, String allPage) {
for( int i=nub;i<=page&&i<=sumPage;i++){
if(i==curpage){
allPage+=MessageFormat.format(pattern,
url,i,pagesize,wheredata,
""
);
}else{
allPage+=MessageFormat.format(pattern,
url,i,pagesize,wheredata,""
);
}
}
return allPage;
}
}
XML代码:
version="2.0">
路径:
在jsp页面中使用:
curpage="${param.curpage }" />
jsp页面分页样式:
/* 分页样式 */
#page,#page a{
margin:10px 8px 10px 0px;
}
#page span,#page input{
font-size:12px;
color:gray;
}
#page input{
cursor: pointer;
background: white;
border:1px solid lightgray;
border-radius:5px;
padding:2px 6px;
}
#page input:hover{
font-size:13px;
}