jsp利用自定义标签制作精美的分页标签

思想:当查出来的数据很多时(例如:超过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代码:


xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
2.0
caipu
http://www.eleme.com/caipu

page
cn.gson.cai.model.tags.PageTag
empty

url
true
true




curpage
true
true




pagesize
true
true


total
true
true




where
false
true


wheredata
false
true





路径:



在jsp页面中使用:

pagesize="${param.pagesize }" total="${map.total}" 
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;
}


你可能感兴趣的:(javaWeb开发)