用自定義標籤實現分頁

 用自定義標籤實現分頁
如果我們要寫出分頁標籤,最少我們要有三個變量,

curPage//當前頁 --也就是說現在用戶正在瀏覽第幾頁.
total //總記錄數 -- 我們從數據庫得到的總記錄數
PAGE_SIZE//頁大小 --也就是說每頁我們用來顯示多少數據,這一般是常量,有時在Servlet指定,有時在properties文件裏讀取.
總頁數=total/PAGE_SIZE+1

有了上面的數據,那麼實現上面圖片的需求應該就沒有問題了.
首頁 -- 把當前頁設爲1;
上一頁--把當前頁-1,如果當前頁小於1則當前頁還是爲1;
下一面--把當前頁+1,如果當前頁大於總頁數,當前頁不變
末頁--把當前頁設爲總頁數

顯示最近的9個頁面-- 把(當前頁-4)到(當前頁+4)的頁碼顯示出來.
指定跳轉 -- 把當前頁設爲指定的頁數.如果指定頁數小於1,則爲1,如果大於總頁數,則爲總頁數

其實,我們分頁標籤的主要目的就是把我們的數據分成N頁,並方便用戶快速訪問自己需要的頁面,也就是說,告訴接受處理顯示數據的Serlvet,他要負責處理顯示的那一頁的數據(也就是我們上面提到的當前頁).具體實現的語句很簡單,在這裏,假設處理數據的Servlet的名字叫做PageSerlvet,那麼我們通過Get方法顯示傳參訪問PageSerlvet,語句爲:PageSerlvet?curpage=當前頁

上面我們講了很多的業務處理方式,現在提下自定義標籤.如果你根本不會寫自定義標籤的話,那麼你先找點淺的例子,這個例子不適合學習自定義標籤~

用標籤來實現以上的需求,我們必須得到我們要得到的三個參數(curPage,total,PAGE_SZIE),當然,用過自定義標籤的朋友都知道,用標籤屬性來傳是最好的!那麼,我們確定了用屬性來傳參,就不要用到標籤體,所有,處理分頁標籤問題,我們還是用TagSupport來解決分頁標籤.

下面,是我們的標籤處理類:PageTag.java

public class PageTag extends TagSupport {
/**
  * 當前頁
  */
private String curPage;

/**
  * 總頁數
  */
private String totalPage;

/**
  * 頁大小(一頁顯示的大小)
  */
private String pageSize;


public void setCurPage(String curPage) {
  this.curPage = curPage;
}


public void setPageSize(String pageSize) {
  this.pageSize = pageSize;

public void setTotalPage(String totalPage) {
  this.totalPage = totalPage;
}

@Override
public int doStartTag() throws JspException {
  JspWriter out = pageContext.getOut();
  // 得到分頁後的頁數,(總頁數/頁大小)+1
 
if (pageSize == null || pageSize == "") {
  pageSize = "1";
  }
  int pageNumber = (Integer.parseInt(totalPage) / Integer
    .parseInt(pageSize));
  if (Integer.parseInt(curPage) > pageNumber) {
  curPage = String.valueOf(pageNumber);
  }
  if (Integer.parseInt(curPage) < 1) {
  curPage = "1";
  }
  // 顯示給用戶操作的頁面開始端
  int start = Integer.parseInt(curPage) - 4;
  // 顯示給用戶操作的頁面結束端
  int end = Integer.parseInt(curPage) + 4;
  // 特殊情況處理(開始端小於0)
  if ((Integer.parseInt(curPage) - 4) <= 0) {
  start = 1;
  }
  // 特殊情況處理(結束端大於總頁數)
  if ((Integer.parseInt(curPage) + 4) > pageNumber) {
  end = pageNumber;
  }

  try {
  out
    .print("<form action='bbs/SubjectListServlet'><table align=center><tr height=10 align=justify ><td width=100>");
  out
    .print("<a href='bbs/SubjectListServlet?curpage=1'>[首頁]</a>  <a href='bbs/SubjectListServlet?curpage="
      + (((Integer.parseInt(curPage) - 1) == 0) ? curPage
        : (Integer.parseInt(curPage) - 1))
      + "'>[上一頁]</a></td><td width=180 align=center>");
  for (int i = start; i <= end; i++) {
    if(i != Integer.parseInt(curPage)){
    out.print("<a href='bbs/SubjectListServlet?curpage=" + i + "'>["
      + i + "]</a>  ");
    }else{
    out.print("<b>"+i+"</b>  ");
    }
   
  }
  out
    .print("</td><td width=100><a href='bbs/SubjectListServlet?curpage="
      + (((Integer.parseInt(curPage) + 1) > pageNumber) ? curPage
        : (Integer.parseInt(curPage) + 1))
      + "'>[下一頁]</a>  <a href='bbs/SubjectListServlet?curpage="
      + pageNumber + "'>[末頁]</a>");
  out
    .print("</td><td width=100><input name='curpage' style='width:22px;height:22px;' /><input type=submit value=go /></td></tr></table></form>");
  } catch (IOException e) {
  e.printStackTrace();
  }

  return super.doStartTag();
}
}


也許看上去比較複雜,但是大家是否還記得在Serlvet裏面輸出HTML代碼的例子,我們學Servlet的時候都是這麼過來的, 雖然現在不推薦在java類用再寫HTML語法, 但是分頁標籤就是用的這種理念去實現的,有點像include.

上面的代碼一共分三總色.紫色主要是初始代標籤屬性,因爲我們在用標籤時,他會自己調用setter方法給屬性傳值.紅色爲doStartTag()方法.主要是輸出我們想要的格式.在紅色中有一塊藍色的代碼.那都是給屬性在特殊情況下賦初值.

下面是tag的tld文件.記住.這個文件一定要放在WEB-INF/tlds目錄下.tlds是默認不存在的,手動創建!
<?xml version="1.0" encoding="ISO-8859-1" ?>
<taglib xmlns="
http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>My Taglib For Holle Word!</description>
<tlib-version>1.0</tlib-version>
<short-name>page</short-name>
<uri></uri>
<tag>
  <name>outpage</name>
  <tag-class>com.tag.PageTag</tag-class>
  <body-content>JSP</body-content>
  <attribute>
  <name>curPage</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  <type>java.lang.String</type>
  </attribute>
  <attribute>
  <name>totalPage</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  <type>java.lang.String</type>
  </attribute>
  <attribute>
  <name>pageSize</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  <type>java.lang.String</type>
  </attribute>
</tag>

</taglib>


一個attribute表示定義一個屬性.
name -屬性名
required-是否爲空
rtexprvalue-是不能用EL語言或表達式(這個是個人理解,因爲我如果不加這對標籤,那我就用不了EL給屬性賦值)
type-屬性類型

然後你就在你要用的JSP頁面上加上
<%@ taglib prefix="page" uri="/WEB-INF/tlds/pageTag.tld" %>

<page:outpage pageSize="${pageSize }" totalPage="${totalPage }" curPage="${curpage}"></page:outpage>

如果你在測試的時候你可以不用EL語言測試,直接給值就可以了.比如寫成
<page:outpage pageSize="10" totalPage="270" curPage="9"></page:outpage>184376.html?webview=1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章