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"/>