先简单介绍一下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 春天的旁边(需要我们的参与)