用自定義標籤實現分頁
用自定義標籤實現分頁
如果我們要寫出分頁標籤,最少我們要有三個變量,
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>
如果我們要寫出分頁標籤,最少我們要有三個變量,
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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.