先簡單介紹一下Pager-taglib。實際上,她是一個Jsp標籤庫,爲在JSP上顯示分頁信息而設計的一套標籤,通過這些標籤的不同的組合,會形成 多種不一樣的分頁頁面,風格各異,她自帶的DEMO就有七種左右的分頁風格,包括Google的分頁風格。而需要訂製自已的風格的分頁頁面也非常簡單。
接觸的當天、匆匆看了下Demo和文檔,發現這個很早(2002年最新版一直到現在)就已經有的東西,似 乎比較擅長顯示端分頁。如,把所有的數據傳到頁面,通過參數設定頁面大小等,可能得到很完美的分頁效果。
第二天回家,做了些小動作,把一個頁碼參數塞進URL裏面,讓程序在頁面之下分了頁再把結果傳出來,簡單地實現了服務器的分頁的功能。
Pager-taglib的文檔很詳盡,我如果有說也只有翻譯的份,要是真的翻譯也就免了,文檔還是挺容易看懂的。於是我開始作了另外一個小Demo,用了原先Demo裏面的一個分頁風格(Simple),稍作修改。希望能幫助自已理清脈絡和對朋友們有用:P
一、模擬業務類:
import java.util.ArrayList;
import java.util.List;
public class PageManager {
private static List names;
{
names = new ArrayList();
names.add( " black " );
names.add( " black " );
names.add( " black " );
names.add( " black " );
names.add( " blue " );
names.add( " blue " );
names.add( " blue " );
names.add( " blue " );
names.add( " blue " );
names.add( " red " );
names.add( " yellow " );
names.add( " blue " );
names.add( " green " );
names.add( " blue " );
names.add( " black " );
names.add( " green " );
names.add( " black " );
}
/** */ /**
* 查詢函數
* @param pageNum 頁碼
* @param pageSize 頁大小
* @param condition 查詢條件
* */
public List query( int pageNum, int pageSize,String condition) {
List tmpNames = getNames(condition);
List ret = new ArrayList();
int start = (pageNum - 1 ) * pageSize;
int end = start + pageSize - 1 ;
if (start >= tmpNames.size())
return ret;
for ( int i = 0 ; i < tmpNames.size(); i ++ ) {
if (i >= start && i <= end)
ret.add(tmpNames.get(i));
}
return ret;
}
/** */ /**
* 按條件查詢所有名字
* */
private List getNames(String condition) {
if ( null == condition) return names;
List ret = new ArrayList();
for ( int i = 0 ; i < names.size(); i ++ ) {
if (condition.equals(names.get(i)))
ret.add(names.get(i));
}
return ret;
}
/** */ /**
* 獲得條件指定的名字的數量
* */
public int getSize(String condition) {
return getNames(condition).size();
}
}
二、JSP代碼:
本頁面提供了列表、查找功能。目的在於演示在Pager-taglib裏面如何傳遞參數(如Form的Post後URL是找不到參數的,但是要保持原來的查詢條件必須把這些參數在分頁的時候加到URL上去)。
<% @ taglib uri = " http://jsptags.com/tags/navigation/pager " prefix = " pg " %>
<%
request.setCharacterEncoding( " UTF-8 " );
%>
< jsp:useBean id = " pm " scope = " page " class = " net.jf.ajax.business.PageManager " />
<! DOCTYPE HTML PUBLIC " -//W3C//DTD HTML 4.01 Transitional//EN " >
< html >
< head >
</ head >
< body >
< form name = " cc " action = " pager.jsp " method = " post " >
< input type = " text " name = " name " value = " <%=request.getParameter( " name " )%> " />< input type = " submit " value = " search " />
</ form >
< pg:pager
items = " <%= pm.getSize(request.getParameter( " name " )) %> "
index = " center "
maxPageItems = " 5 "
maxIndexPages = " 5 "
isOffset = " <%= false %> "
export = " pageOffset,currentPageNumber=pageNumber "
scope = " request " >
<%
int pageNum = 1 ;
if (request.getParameter( " pageNo " ) != null )
pageNum = Integer.valueOf(request.getParameter( " pageNo " ));
int pageSize = 5 ;
List result = pm.query(pageNum,pageSize,request.getParameter( " name " ));
%>
< table >
< tr >
< td > result </ td >
</ tr >
<% for ( int i = 0 ; i < result.size(); i ++ ) { %>
< tr >
< td >
<%= result.get(i) %>
</ td >
</ tr >
<% } %>
</ table >
< pg:param name = " name " />
< pg:index >
< jsp:include page = " /pagination/jsptags.jsp " flush = " true " />
</ pg:index >
</ pg:pager >
</ body >
</ html >
從頁面裏可以看到,這裏使用了三個標籤
1、
,在這個標籤庫裏就充當着一個領袖的作用,一切子標籤都在它裏面工作。就以上出現的參數進行解釋一下:
items:數據的紀錄數
index:說起來比較麻煩,反正是一次大跳躍之後,當前頁面在各個頁數的什麼位置,默認爲Center,不動也罷了。
maxPageItems:顯示最多的紀錄數/頁
maxIndexPages:顯示最多的分頁數/次,如設爲5的話,則會出現這樣的情況 1 2 3 4 5 .或 3 4 5 6 7 這樣的形式,其實她自帶的DEMO都喜歡把頁數展現出來排成一排。
isOffset:與pg:item配套使用,頁pg:item基本上被我淘汰出局。
export: 這個屬性比較重要,文檔也對此作好相對長篇幅的說明。這個屬性是讓標籤給你暴露什麼變量,當然這些變量是有選擇的,如在Pager標籤裏,可以暴露出來的 變量有pageOffset及pageNumber,即頁碼偏移量及頁碼。通過這兩個變量名,可以在Jsp或Java裏面從Request裏獲得。 Export屬性接受的值還有表達式,如currentPage=pageNumber表示,把pageNumber的值暴露出來,並賦給一個叫 CurrentPage的變量,這個變量將被保存到Request中,在Jsp或Java中可以得到。
scope:咳。還需要講麼?
2、
這個標籤很有用,用來設置將要加入到URL的變量。使用Name屬性指定即可。
3、
這個標籤說明分頁顯示開始了。跳進我們Include的頁面。再看看詳細的情況。
三、分頁顯示頁面
<% @ taglib uri = " http://jsptags.com/tags/navigation/pager " prefix = " pg " %>
< pg:first >
< a href = " <%= pageUrl %>&pageNo=<%= pageNumber %> " >< nobr > [ # <%= pageNumber %> 首頁 ] </ nobr ></ a >
</ pg:first >
< pg:skip pages = " <%= -5 %> " >
< a href = " <%= pageUrl %>&pageNo=<%= pageNumber %> " >< nobr > [ # <%= pageNumber %> 後退 ] </ nobr ></ a >
</ pg:skip >
< pg:prev >
< a href = " <%= pageUrl %>&pageNo=<%= pageNumber %> " >< nobr > [ # <%= pageNumber %> 前一頁 ] </ nobr ></ a >
</ pg:prev >
< pg:pages >
< a href = " <%= pageUrl %>&pageNo=<%= pageNumber %> " ><%= pageNumber %></ a >
</ pg:pages >
< pg:next >
< a href = " <%= pageUrl %>&pageNo=<%= pageNumber %> " >< nobr > [ 下一頁 # <%= pageNumber %> ] </ nobr ></ a >
</ pg:next >
< pg:skip pages = " <%= 5 %> " >
< a href = " <%= pageUrl %>&pageNo=<%= pageNumber %> " >< nobr > [ 跳進 # <%= pageNumber %> ] </ nobr ></ a >
</ pg:skip >
< pg:last >
< a href = " <%= pageUrl %>&pageNo=<%= pageNumber %> " >< nobr > [ 尾頁 # <%= pageNumber %> ] </ nobr ></ a >
</ pg:last >
沒 錯,你看到的這些標籤都是導航標籤。很容易明白,用法基本上一致,從標籤的名字上就能看出是什麼作用。告訴你我動了手腳的地方就是我在每一個 PageUrl後面都加了&pageNo=<%= pageNumber %>。讓我們的URL帶上頁碼的參數,這樣程序可以拿到頁碼去查找所需要的數據。
結果很理想。在SpringSide領了個分頁標籤的任務,原來還想着自已實現一套標籤的。還好被白衣喝住了。。卡卡。摸清楚了整套標籤的使用方法後,很容易就可以把一些重複的東西再稍作封裝,變成有“特色”的東西。幸虧沒有重複發明輪子(臉紅啊,還發明呢~~~)。
天色已早。這幾天再繼續研究和“拿來”。有經驗再一起交流。。
參考資料:
http://jsptags.com/tags/navigation/pager/index.jsp Pager-taglibs官網
http://www.springside.org.cn/ SpringSide 春天的旁邊(需要我們的參與)