JSP自定义分页标签TAG全过程
首先我们需要在WEB-INF/tld/目录下创建page.tld文件
<?xmlversion="1.0"encoding="ISO-8859-1"?> <taglib> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name>page</short-name> <uri>http://www.kevin.com/taglibs/page</uri> <tag> <name>htmlPage</name> <tag-class>com.lss.common.tag.PageTag</tag-class> <body-content>JSP</body-content> <description>htmlPageTag</description> <attribute> <name>pageNo</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>pageSize</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>totalSum</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>url</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>showPage</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
packagecom.lss.common.tag; importjava.io.IOException; importjavax.servlet.jsp.JspException; importjavax.servlet.jsp.JspWriter; importjavax.servlet.jsp.tagext.TagSupport; importcom.lss.common.page.HtmlPage; importcom.lss.common.page.Page; importcom.lss.common.page.VariablePage; /** *分页处理标签 * *@description *@DATE2012-3-11下午09:08:46 */ publicclassPageTagextendsTagSupport{ privateintpageNo; privateintpageSize=10; privateinttotalSum; privateintshowPage=10; privateStringurl; publicintgetPageNo(){ returnpageNo; } publicvoidsetPageNo(intpageNo){ this.pageNo=pageNo; } publicintgetPageSize(){ returnpageSize; } publicvoidsetPageSize(intpageSize){ this.pageSize=pageSize; } publicintgetTotalSum(){ returntotalSum; } publicvoidsetTotalSum(inttotalSum){ this.totalSum=totalSum; } publicintgetShowPage(){ returnshowPage; } publicvoidsetShowPage(intshowPage){ this.showPage=showPage; } publicStringgetUrl(){ returnurl; } publicvoidsetUrl(Stringurl){ this.url=url; } @Override publicintdoEndTag()throwsJspException{ if(pageSize==0){ returnTagSupport.SKIP_PAGE;//不显示分页 }elseif(pageSize>totalSum){ returnTagSupport.SKIP_BODY;//不显示分页 } JspWriterout=pageContext.getOut(); try{ if(url.indexOf(";jsessionid=")==-1){ if(url.indexOf("?")==-1){ url+=";jsessionid="+pageContext.getSession().getId()+"?pageNo="; }else{ url=url.replaceFirst("\\?",";jsessionid="+pageContext.getSession().getId()+"?"); if(url.indexOf("pageNo=")==-1){ url+="&pageNo="; } } } url=pageContext.getServletContext().getContextPath()+url; VariablePagevariablePage=newVariablePage(pageNo,totalSum,pageSize,url); variablePage.setShowPageNum(showPage); Pagepage=newHtmlPage(variablePage); out.print(page.getFirstNo()+""+page.getBackpageNum()+""+page.pagination()+""+page.getNextpageNum()+""+page.getLastNo()); }catch(IOExceptionex){ ex.printStackTrace(); } returnsuper.doEndTag(); } @Override publicvoidrelease(){ url=null; pageNo=0; totalSum=0; pageSize=10; super.release(); } privatestaticfinallongserialVersionUID=-2642907859641024483L; }
/** *HTML分页类 * *@description *@DATE2012-3-11下午10:33:14 */ publicclassHtmlPageextendsPage{ publicHtmlPage(VariablePagevariablePage){ super(variablePage); } publicStringpagination(){ StringprintNo=""; //如果已分页;并且页数小于等于要显示的页数 if(variablePage.totalPage>1&&variablePage.totalPage<=variablePage.showPageNum){ returndisplayAll(); //如果分页数:大于显示的页码数 }elseif(variablePage.totalPage>1&&variablePage.totalPage>variablePage.showPageNum){ if(variablePage.pageNo==1){//当前页等于第一页 returnfromFirstPagePrint(); }elseif(variablePage.pageNo==variablePage.totalPage){//当前页等于最后一页 returnfromLastPagePrint(); }else{//如果当前页:即不是首页也不是尾页 if(variablePage.showPageNum%2==0){//可以平分页码 intprint$No=variablePage.showPageNum/2; if(variablePage.pageNo>=print$No){ intindex$No=variablePage.pageNo-print$No; if(variablePage.pageNo+print$No>=variablePage.totalPage){ returnfromLastPagePrint(); }else{ if(index$No==0) index$No=1; for(inti=index$No;i<(variablePage.showPageNum+index$No);i++){ if(i==variablePage.pageNo){//如果是当前页:不添加连接URL printNo+=(i+variablePage.split); }else{ printNo+=(buildA(variablePage,i)+variablePage.split); } } } }else{ returnfromFirstPagePrint(); } }else{//打印页数不是偶数时: intprint$No=variablePage.showPageNum/2+1; if(variablePage.pageNo>=print$No&&variablePage.pageNo+print$No<variablePage.totalPage){ intindex$No=variablePage.pageNo-print$No+1; for(inti=index$No;i<variablePage.showPageNum+index$No;i++){ if(i==variablePage.pageNo){//如果是当前页:不添加连接URL printNo+=(i+variablePage.split); }else{ printNo+=(buildA(variablePage,i)+variablePage.split); } } }elseif(variablePage.pageNo<=print$No){//从第一页开始 returnfromFirstPagePrint(); }else{ returnfromLastPagePrint(); } } } return(printNo); }else{ return"1"; } } publicStringgetBackpageNum(){ if(variablePage.pageNo<=1){ returnbuildSpan("上一页",variablePage); }else{ returnbuildA("上一页",(variablePage.url+(variablePage.pageNo-1))); } } publicStringgetNextpageNum(){ if(variablePage.pageNo>=variablePage.totalPage){ returnbuildSpan("下一页",variablePage); }else{ returnbuildA("下一页",variablePage.url+(variablePage.pageNo+1)); } } publicStringbuildSpan(Stringtext,VariablePagevariablePage){ return"<spanstyle=\"color:gray;\">"+text+"</span>"; } publicStringbuildA(Stringtext,Stringurl){ return"<ahref=\""+url+"\">"+text+"</a>"; } publicStringbuildA(VariablePagevariablePage,intnum){ return("<ahref=\""+variablePage.url+num+"\">"+num+"</a>"); } }
publicabstractclassPage{ protectedVariablePagevariablePage; publicPage(VariablePagevariablePage){ this.variablePage=variablePage; calculateTotalPage(); } publicintgetStartIndex(){ return(getValidpageNum()-1)*variablePage.pageSize; } publicStringgetBackpageNum(){ if(variablePage.pageNo<=1){ returnbuildSpan("上一页",variablePage); }else{ returnbuildA("上一页",variablePage.getUrl()+(variablePage.pageNo-1)); } } publicStringgetNextpageNum(){ if(variablePage.pageNo>=variablePage.totalPage){ returnbuildSpan("下一页",variablePage); }else{ returnbuildA("下一页",variablePage.getUrl()+(variablePage.pageNo+1)); } } /** *计算总页数 */ privatevoidcalculateTotalPage(){ if(variablePage.totalSum%variablePage.pageSize==0){ variablePage.totalPage=variablePage.totalSum/variablePage.pageSize; }else{ variablePage.totalPage=variablePage.totalSum/variablePage.pageSize+1; } if(variablePage.totalPage<variablePage.pageNo){ variablePage.pageNo=variablePage.totalPage; }elseif(variablePage.pageNo<1){ variablePage.pageNo=1; } } protectedStringdisplayAll(){ StringBuildersBuilder=newStringBuilder(10); sBuilder.append(variablePage.split); for(inti=1;i<=variablePage.totalPage;i++){ if(i==variablePage.pageNo){ sBuilder.append(i+variablePage.split); }else{ sBuilder.append(buildA(variablePage,i)+variablePage.split); } } returnsBuilder.toString(); } /** *抽象出分页方法 * *@return */ publicabstractStringpagination(); /** *实现从第一页开始打印 * *@return */ protectedfinalStringfromFirstPagePrint(){ StringBufferbuffer=newStringBuffer(100); for(inti=1;i<=variablePage.showPageNum;i++){ if(i==variablePage.pageNo){//如果是当前页:不添加连接URL buffer.append(i+variablePage.split); }else{ buffer.append(buildA(variablePage,i)+variablePage.split); } } returnbuffer.toString(); } /** *实现从最后一页开始打印 * *@return */ protectedfinalStringfromLastPagePrint(){ StringBufferbuffer=newStringBuffer(100); intstartPage=variablePage.totalPage-(variablePage.showPageNum-1); for(inti=startPage;i<=variablePage.totalPage;i++){ if(i==variablePage.pageNo){//如果是当前页:不添加连接URL buffer.append(i+variablePage.split); }else{ buffer.append(buildA(variablePage,i)+variablePage.split); } } returnbuffer.toString(); } publicStringgetFirstNo(){ if(isExistsPagination()){ returnbuildA("首页",variablePage.url+1); }else{ returnbuildSpan("首页",variablePage); } } /** *判断是否存在分页 * *@return */ privatebooleanisExistsPagination(){ if(variablePage.totalSum>1&&variablePage.totalPage>1){ returntrue; } returnfalse; } publicStringgetLastNo(){ if(isExistsPagination()){ returnbuildA("尾页",variablePage.url+variablePage.totalPage); }else{ returnbuildSpan("尾页",variablePage); } } protectedintgetValidpageNum(){ if(variablePage.totalPage<variablePage.pageNo){ returnvariablePage.pageNo=variablePage.totalPage; }elseif(variablePage.pageNo<1){ returnvariablePage.pageNo=1; }else{ returnvariablePage.pageNo; } } publicVariablePagegetPageContant(){ returnthis.variablePage; } publicabstractStringbuildSpan(Stringtext,VariablePagevariablePage); publicabstractStringbuildA(Stringtext,Stringurl); publicabstractStringbuildA(VariablePagevariablePage,intnum); publicStringprintModifyPageSize(intpageSize){ StringBuilderbuilder=newStringBuilder(100); builder.append("每页<inputtype='text'id='pageSize'style='width:20px'maxlength='2'name='pageSize'"); if(pageSize>0){ builder.append("value='"+pageSize+"'"); } builder.append("/>条"); returnbuilder.toString(); } }
/** *分页基础变量 * *@description *@DATE2012-3-11下午10:34:00 */ publicclassSimpleVariable{ /** *显示页码 */ protectedintshowPageNum=10; /** *连接URL */ protectedStringurl=null; /** *当前页码 */ protectedintpageNo=1; /** *总页码 */ protectedinttotalPage=1; /** *总条数 */ protectedinttotalSum=0; /** *每页显示条数 */ protectedintpageSize=10; publicStringgetUrl(){ returnurl; } publicvoidsetUrl(Stringurl){ this.url=url; } publicintgetTotalPage(){ returntotalPage; } publicvoidsetTotalPage(inttotalPage){ this.totalPage=totalPage; } publicintgetTotalSum(){ returntotalSum; } publicvoidsetTotalSum(inttotalSum){ this.totalSum=totalSum; } publicintgetPageSize(){ returnpageSize; } publicvoidsetPageSize(intpageSize){ this.pageSize=pageSize; } publicintgetShowPageNum(){ returnshowPageNum; } publicvoidsetShowPageNum(intshowPageNum){ this.showPageNum=showPageNum; } publicintgetPageNo(){ returnpageNo; } publicvoidsetPageNo(intpageNo){ this.pageNo=pageNo; } }
/** *分页变量 * *@description *@DATE2012-3-11下午10:34:08 */ publicclassVariablePageextendsSimpleVariable{ protectedStringsplit=""; protectedStringstyle="class='page'"; publicVariablePage(intpageNo,inttotalSum,intpageSize,Stringurl){ pageNo=pageNo<1?1:pageNo; super.pageNo=pageNo; this.totalSum=totalSum; this.url=url; this.pageSize=pageSize; } publicVariablePage(intpageNum,inttotalSum,Stringurl){ pageNum=pageNum<1?1:pageNum; super.pageNo=pageNum; this.totalSum=totalSum; this.url=url; } publicStringgetSplit(){ returnsplit; } publicvoidsetSplit(Stringsplit){ this.split=split; } }
#需要使用该分页标签的JSP使用方法如下:
JSP头部引入
<%@tagliburi="http://www.kevin.com/taglibs/page"prefix="page"%>
使用以下标签生成分页HTML代码
<page:htmlPagepageNo="${pageNo}"url="your_url"totalSum="${totalSum}"showPage="10"pageSize="12"/>