發現在系統中有好多寫得很好的代碼,也不知道是哪位前輩留下來的.整理一下...
自定義分頁標簽庫
1:在配置文件中配置
<!--?self?Tag?Library?Descriptors?-->
??<taglib>
????<taglib-uri>/WEB-INF/self-html.tld</taglib-uri>
????<taglib-location>/WEB-INF/self-html.tld</taglib-location>
??</taglib>2:在self-html.tld中page標簽的配置
<tag>
????????<name>page</name>
????????<tagclass>com.jbbis.netedu.common.util.taglib.PageTag</tagclass>
????????<bodycontent>empty</bodycontent>
????????<info>tag?here</info>
????????<attribute>
????????<name>name</name>
????????<required>true</required>
????????<rtexprvalue>false</rtexprvalue>
????????</attribute>????
????????<attribute>
????????<name>pageNum</name>
????????<required>false</required>
????????<rtexprvalue>false</rtexprvalue>
????????</attribute>????????
????????<attribute>
????????<name>method</name>
????????<required>false</required>
????????<rtexprvalue>false</rtexprvalue>
????????</attribute>????
????????<attribute>
????????<name>methodValue</name>
????????<required>false</required>
????????<rtexprvalue>true</rtexprvalue>
????????</attribute>????
????????<attribute>
????????<name>form</name>
????????<required>true</required>
????????<rtexprvalue>false</rtexprvalue>
????????</attribute>????????
????????<attribute>
????????<name>action</name>
????????<required>flase</required>
????????<rtexprvalue>true</rtexprvalue>
????????</attribute>
????????<attribute>
????????<name>returnLevel</name>
????????<required>flase</required>
????????<rtexprvalue>true</rtexprvalue>
????????</attribute>????????????????????????????????????
????</tag>其實從這兒也可以看到在PageTag文件中是一些什么值了...
3:PageTag中的具體操作(精華全部在這兒啦)

/**//*
?*?Created?on?2004-6-25
?*
?*/
package?com.jbbis.netedu.common.util.taglib;

import?java.io.IOException;

import?javax.servlet.jsp.JspException;
import?javax.servlet.jsp.JspWriter;
import?javax.servlet.jsp.tagext.TagSupport;

import?com.jbbis.netedu.common.page.NullPage;
import?com.jbbis.netedu.common.page.Page;


/**?*//**
?*?@author?leo_deng
?*
?*/

public?class?PageTag?extends?TagSupport?
{
????


????/**//*?(non-Javadoc)
?????*?@see?javax.servlet.jsp.tagext.Tag#doStartTag()
?????*/
????private?String?name;
????private?String?pageNum="pageNum";
????private?String?method="method";
????private?String?methodValue;
????private?String?form="mainForm";
????private?String?action;
????private?String?returnLevel;
????
????private?final?int?CONST_FIRST=1;
????private?final?int?CONST_NEXT=2;
????private?final?int?CONST_PRIOR=3;
????private?final?int?CONST_LAST=4;
????
????
????
????

????public?int?doStartTag()?throws?JspException?
{
????????//?TODO?Auto-generated?method?stub

????????try
{
????????????JspWriter?out?=?pageContext.getOut()?;
????????????Page?page=(Page)pageContext.getRequest().getAttribute(name);
????????????if(page==null)
????????????????page=NullPage.instance();
????????????out.print(getHtml(page.getPageNumber(),page.getPageCount()));
????????????out.print(getJs(page.getPageNumber(),page.getPageCount()));
????????????//jspwriter是一個隱含對象,用于向jsp網頁輸出內容。輸出的目標由
????????????//?pagecontext.getout提供
????????????
????????????//向jsp網頁上下文輸出

??????????}catch(IOException?ioException)
{
????????????throw?new?JspException(ioException.getMessage()?);
??????????}//catch
??????????return(SKIP_BODY);
????}

????/**//*
?????*?<
?????*?<!--
?????*?function?page_next(){
?????*??form.action=""
?????*?????form.pageNum=""
?????*?????form.method.value=""
?????*?????form.submit;
?????*?
?????*?}
?????*?function?page_prior()
?????*?function?page_first()
?????*?funciotn?page_last()
?????*?
?????*?//-->
?????*?<div?class="listbox_page">
????????????<a?class="page"?><img?src="public/icon/first.gif"?alt="首頁"?align="absmiddle"?border="0"?onclick="page_first()"/></a>
????????????<a?class="page"?><img?src="public/icon/previous.gif"?alt="上頁"?align="absmiddle"?border="0"?onclick="page_first()"/></a>
????????????第<input?class="page_number"?name="pageNum"?value="">????<img?src="page_go.gif"?class="page_go">頁
????????????<a?class="page"?><img?src="public/icon/next.gif"?alt="下頁"?align="absmiddle"?border="0"/?onclick="page_next()"></a>
????????????<a?class="page"?><img?src="public/icon/last.gif"?alt="末頁"?align="absmiddle"?border="0"/?onclick="page_prior()"></a>
????????????共?<span?class="page_sum">1000</span>?頁?
????????</div>
?????*
?????*?*/

????private?String?getJs(int?pageNum,int?totalNum)
{
????????StringBuffer?sb=new?StringBuffer();
????????sb.append("\n<script?language=\"JavaScript\">\n<!--");
????????????sb.append(printFunction("page_first",pageNum,totalNum,CONST_FIRST));
????????????sb.append(printFunction("page_next",pageNum,totalNum,CONST_NEXT));
????????????sb.append(printFunction("page_prior",pageNum,totalNum,CONST_PRIOR));
????????????sb.append(printFunction("page_last",pageNum,totalNum,CONST_LAST));
????????????getGoJs(sb,pageNum,totalNum);
????????sb.append("\n?//-->\n</script>");

????????return?sb.toString();
????}

????private?void?getGoJs(StringBuffer?sb,int?pageNum,int?totalNum)
{
????????sb.append("function?page_go(obj){\n");
????????sb.append("var?page_number=document.getElementById(\"page_number\");\n");
????????sb.append("if(?page_number.value?!=?new?Number(page_number.value))return?alert(\"請輸入正確的頁數\");\n");
????????sb.append("if(page_number.value<1)?page_number.value=1;if(page_number.value>");
????????sb.append(totalNum);
????????sb.append(")page_number.value=");
????????sb.append(totalNum);
????????sb.append(";\n");
????????sb.append("if(page_number.value!="+pageNum+")");
????????sb.append("submitForPageNum(obj);\n");
????????sb.append("}");
????}

????private?StringBuffer?printFunction(String?function,int?pageNumber,int?totalNumber,int?pageConst)
{
????????StringBuffer?sb=new?StringBuffer();
????????sb.append("\nfunction?"+function+"(){");
????????sb.append("\nevent.returnValue=false;");
????????sb.append(printAction());
????????sb.append(printMethod());
????????//sb.append("\n"+this.form+".submit();\n}");

????????if(totalNumber>1)
{

????????????switch(pageConst)
{
????????????????case?CONST_FIRST:

????????????????????if(pageNumber>1)
{
????????????????????????sb.append(printPageNum(String.valueOf(1)));
????????????????????????sb.append("\n?submitForPageNum("+this.form+");");
????????????????????}
????????????????????break;
????????????????case?CONST_LAST:

????????????????????if(pageNumber<totalNumber)
{
????????????????????????sb.append(printPageNum(String.valueOf(totalNumber)));
????????????????????????sb.append("\n?submitForPageNum("+this.form+");");
????????????????????}
????????????????????break;
????????????????case?CONST_PRIOR:

????????????????????if(pageNumber>1)
{
????????????????????????sb.append(printPageNum(String.valueOf(pageNumber-1)));
????????????????????????sb.append("\n?submitForPageNum("+this.form+");");
????????????????????}
????????????????????break;????????????????????????
????????????????case?CONST_NEXT:

????????????????????if(pageNumber<totalNumber)
{
????????????????????????sb.append(printPageNum(String.valueOf(pageNumber+1)));
????????????????????????sb.append("\n?submitForPageNum("+this.form+");");
????????????????????}
????????????????????break;
????????????}
????????}
????????
????????sb.append("\n}");
????????return?sb;????????
????}

????/**//*
????private?StringBuffer?printFunction(String?function,String?pageNum,int?pageConst){
????????StringBuffer?sb=new?StringBuffer();
????????sb.append("\nfunction?"+function+"(){");
????????sb.append("\nevent.returnValue=false;");
????????sb.append(printAction());
????????sb.append(printMethod());
????????sb.append(printPageNum(pageNum));
????????//sb.append("\n"+this.form+".submit();\n}");

????????????????
????????????????sb.append("\n?submitForPageNum("+this.form+");\n}");

????????
????????sb.append("\n}");
????????
????????return?sb;
????}
????*/

????private?String?printAction()
{
????????if(this.action!=null)
????????????return?("\n"+this.form+".action=\""+action+"\";");
????????else
????????????return?"";
????}

????private?String?printMethod()
{
????????if(this.methodValue!=null)
????????????return?("\n"+this.form+"."+this.method+".value=\""+this.methodValue+"\";");
????????else
????????????return?"";
????}????

????private?String?printPageNum(String?num)
{
????????return?"\n"+this.form+"."+this.pageNum+".value=\""+num+"\";";
????}

????private?String?getHtml(int?pageNum,int?totalNum)
{
????????StringBuffer?sb=new?StringBuffer();
????????sb.append("\n<a?class=\"page\"?href=\"javascript:void(0)\"?onclick=\"page_first()\"?><img?src=\"public/icon/first.gif\"?alt=\"首頁\"?align=\"absmiddle\"?border=\"0\"?/></a>");
????????sb.append("\n<a?class=\"page\"?href='javascript:void(0)'?onclick='page_prior()'?><img?src=\"public/icon/previous.gif\"?alt=\"上頁\"?align=\"absmiddle\"?border=\"0\"?/></a>");
????????sb.append("\n第<input?id=\"page_number\"?class=\"page_number\"?name=\"pageNum\"?value=\"");
????????sb.append(String.valueOf(pageNum));
????????sb.append("\"><button?class='page_go'?onclick='page_go(this.form);'></button>頁????");
????????//sb.append(""<img?src=\"page_go.gif\"?class=\"page_go\">");
????????sb.append("\n<a?class=\"page\"?href=\"javascript:void(0)\"?onclick=\"page_next()\"><img?src=\"public/icon/next_page.gif\"?alt=\"下頁\"?align=\"absmiddle\"?border=\"0\"/></a>");
????????sb.append("\n<a?class=\"page\"?href=\"javascript:void(0)\"?onclick=\"page_last()\"><img?src=\"public/icon/last.gif\"?alt=\"末頁\"?align=\"absmiddle\"?border=\"0\"/></a>");
????????sb.append("\n共?<span?class=\"page_sum\">");
????????sb.append(String.valueOf(totalNum));
????????sb.append("</span>?頁");
????????return?sb.toString();
????}


????/**?*//**
?????*?@return?Returns?the?pageNum.
?????*/

????public?String?getPageNum()?
{
????????return?pageNum;
????}

... ....(other getter and setter method ^_^)????
}

4:在JSP布面中導入:

<%
@?taglib?uri="/WEB-INF/self-html.tld"?prefix="netedu"?%>5:在JSP頁面中引用:
<form?name="newsForm"?method="post"?action="<%=request.getContextPath()?%>/portal/newsAction.page"?id="newsForm">
<!--?TIP008:
??翻頁部分
?-->
???<div?class="listbox_page">
????<netedu:page?name="page"?form="newsForm"?/>
???</div>
<!--?TIP008:END-->
?</form>6:page文件



/**//*
?*?Created?on?2004-6-8
?*/
package?com.jbbis.netedu.common.page;

import?java.util.Collection;



/**?*//**
?*?分頁表示?Bean
?*?用于前臺顯示分頁數據
?*?@author?qqs
?*/

public?interface?Page?
{


??/**?*//**
???*?whether?or?not?is?the?last?page?of?list?data
???*?是否為最后一頁
???*?@return
???*/
??public?boolean?isLast();


??/**?*//**
???*?是否為第一頁
???*?@return
???*/
??public?boolean?isFirst();


??/**?*//**
???*?List?of?page?data
???*?@return?Page?data
???*/
??public?Collection?getData();
??

??/**?*//**
???*?List?of?page?data
???*?@return?Page?data
???*/
??public?void?setData(Collection?data);


??/**?*//**
???*?當前頁數
???*?@return?Page?Number
???*/
??public?int?getPageNumber();


??/**?*//**
???*?Next?page?number
???*?if?current?page??is?the?first?page?then
???*???return?0;
???*?else
???*???return?pageNumber+1;
???*?下一頁的頁數
???*?
???*?@return?next?page?number
???*/
??public?int?getNextPageNumber();


??/**?*//**
???*?前一頁的頁數
???*?if?previous?pge?lest?than?last?the?first?page?then
???*???return?0
???*?esle
???*???return?PageNumber?-?1
???*?@return?previous?page?number
???*/
??public?int?getPrevPageNumber();


??/**?*//**
???*?Current?page?size
???*?當前頁的記錄數
???*?@return?Current?page?size
???*/
??public?int?getSize();


??/**?*//**
???*?Page?size
???*?定義的每頁的頁數
???*?@return
???*/
??public?int?getPageSize();

??/**?*//**
???*?Total?pages?count
???*?總頁數
???*?@return?Total?pages?count
???*/
??public?int?getPageCount();


??/**?*//**
???*?當前頁中第一條記錄在數據庫中的順序
???*?get?index?of?the?first?data?of?the?page
???*?@return?index?of?the?first?data?of?the?page
???*/
??public?int?getStartIndex();


??/**?*//**
???*?get?index?of?the?last?data?of?the?page
???*?當頁的最后一條記錄在數據庫中的順序
???*?@return?index?of?the?first?data?of?the?page
???*/
??public?int?getEndIndex();


??/**?*//**
???*?總的記錄數
???*?@return
???*/
??public?int?getTotalSize();


??/**?*//**
???*?是否為空頁
???*?@return
???*/
??public?boolean?isNull();
}7:其它
7.1
可以注意到在標簽的定義文件中用到了名為page_go的css層來美化界面,可能是出于滿足不同用戶對界面的不同要求所以在此沒有對此css定義,你可以在JSP布面中重寫此css.這兒有個可以參考一下.
下載7.2
根據標簽的定義可以看到,此page應該放到form中.
7.3
根據在標簽庫中的
Page?page=(Page)pageContext.getRequest().getAttribute(name);語句,可見page應該在request.setAttribute("pageattribute",page);中定義.
7.4
如何通過對DB的操作得到了page ?通過DB操作可以獲得一系統的data(應該注意到了在page文件夾中有個data屬性,高人就是高人^_^),當然在得到這些data之前,先可能得進行一系統邏輯處理,比如說當前頁碼(pagenum),頁長(pagesize)等等.通過這些數據就可以得到一個page實例了! ~ ~ :?)
... ...
相關:一個相當好的自定義標簽---分頁(二)