pager-taglib 体验

      可能是自已习惯了用自已的分页组件。一直不知道有这样一个现成的分页标签。直到那天,白衣跟我提起了一下,我Search了一下,发现了Pager-taglib这个东东。支持多种风格的分页显示。
       先简单介绍一下Pager-taglib。实际上,她是一个Jsp标签库,为在JSP上显示分页信息而设计的一套标签,通过这些标签的不同的组合,会形成多种不一样的分页页面,风格各异,她自带的DEMO就有七种左右的分页风格,包括Google的分页风格。而需要订制自已的风格的分页页面也非常简单。
      接触的当天、匆匆看了下Demo和文档,发现这个很早(2002年最新版一直到现在)就已经有的东西,似 乎比较擅长显示端分页。如,把所有的数据传到页面,通过参数设定页面大小等,可能得到很完美的分页效果。
      第二天回家,做了些小动作,把一个页码参数塞进URL里面,让程序在页面之下分了页再把结果传出来,简单地实现了服务器的分页的功能。
      Pager-taglib的文档很详尽,我如果有说也只有翻译的份,要是真的翻译也就免了,文档还是挺容易看懂的。于是我开始作了另外一个小Demo,用了原先Demo里面的一个分页风格(Simple),稍作修改。希望能帮助自已理清脉络和对朋友们有用:P
一、模拟业务类:

None.gif package  net.jf.ajax.business;
None.gif
None.gif
import  java.util.ArrayList;
None.gif
import  java.util.List;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
public   class  PageManager  dot.gif {
InBlock.gif    
private   static  List names;
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif {
InBlock.gif        names 
=   new  ArrayList();
InBlock.gif        names.add(
" black " );
InBlock.gif        names.add(
" black " );
InBlock.gif        names.add(
" black " );
InBlock.gif        names.add(
" black " );
InBlock.gif        names.add(
" blue " );
InBlock.gif        names.add(
" blue " );
InBlock.gif        names.add(
" blue " );
InBlock.gif        names.add(
" blue " );
InBlock.gif        names.add(
" blue " );
InBlock.gif        names.add(
" red " );
InBlock.gif        names.add(
" yellow " );
InBlock.gif        names.add(
" blue " );
InBlock.gif        names.add(
" green " );
InBlock.gif        names.add(
" blue " );
InBlock.gif        names.add(
" black " );
InBlock.gif        names.add(
" green " );
InBlock.gif        names.add(
" black " );
ExpandedSubBlockEnd.gif    }

ExpandedSubBlockStart.gifContractedSubBlock.gif    
/** */ /**
InBlock.gif     * 查询函数
InBlock.gif     * 
@param  pageNum 页码
InBlock.gif     * 
@param  pageSize 页大小
InBlock.gif     * 
@param  condition 查询条件
ExpandedSubBlockEnd.gif     * 
*/

ExpandedSubBlockStart.gifContractedSubBlock.gif    
public  List query( int  pageNum, int  pageSize,String condition) dot.gif {
InBlock.gif        List tmpNames 
=  getNames(condition);
InBlock.gif        List ret 
=   new  ArrayList();
InBlock.gif        
int  start  =  (pageNum  -   1 *  pageSize;
InBlock.gif        
int  end  =  start  +  pageSize  -   1 ;
InBlock.gif        
if (start  >=  tmpNames.size())
InBlock.gif            
return  ret;
ExpandedSubBlockStart.gifContractedSubBlock.gif        
for ( int  i  =   0 ; i  <  tmpNames.size(); i  ++ ) dot.gif {
InBlock.gif            
if (i  >=  start  &&  i  <=  end)
InBlock.gif                ret.add(tmpNames.get(i));
ExpandedSubBlockEnd.gif        }

InBlock.gif        
return  ret;
ExpandedSubBlockEnd.gif    }

ExpandedSubBlockStart.gifContractedSubBlock.gif    
/** */ /**
InBlock.gif     * 按条件查询所有名字
ExpandedSubBlockEnd.gif     * 
*/

ExpandedSubBlockStart.gifContractedSubBlock.gif    
private  List getNames(String condition)  dot.gif {
InBlock.gif        
if ( null   ==  condition)  return  names;
InBlock.gif        List ret 
=   new  ArrayList();
InBlock.gif        
ExpandedSubBlockStart.gifContractedSubBlock.gif        
for ( int  i  =   0 ; i  <  names.size(); i  ++ ) dot.gif {
InBlock.gif            
if (condition.equals(names.get(i)))
InBlock.gif                ret.add(names.get(i));
ExpandedSubBlockEnd.gif        }

InBlock.gif        
return  ret;
ExpandedSubBlockEnd.gif    }

ExpandedSubBlockStart.gifContractedSubBlock.gif    
/** */ /**
InBlock.gif     * 获得条件指定的名字的数量
ExpandedSubBlockEnd.gif     * 
*/

ExpandedSubBlockStart.gifContractedSubBlock.gif    
public   int  getSize(String condition) dot.gif {
InBlock.gif            
return  getNames(condition).size();
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif

二、JSP代码:
本页面提供了列表、查找功能。目的在于演示在Pager-taglib里面如何传递参数(如Form的Post后URL是找不到参数的,但是要保持原来的查询条件必须把这些参数在分页的时候加到URL上去)。

None.gif <% @ page language = " java "   import = " java.util.* "  pageEncoding = " UTF-8 " %>
None.gif
<% @ taglib uri = " http://jsptags.com/tags/navigation/pager "  prefix = " pg "   %>
None.gif
<%
None.gifrequest.setCharacterEncoding(
" UTF-8 " );
None.gif
%>
None.gif
< jsp:useBean id  =   " pm "  scope = " page "   class = " net.jf.ajax.business.PageManager " />
None.gif
<! DOCTYPE HTML PUBLIC  " -//W3C//DTD HTML 4.01 Transitional//EN " >
None.gif
< html >
None.gif  
< head >
None.gif  
</ head >
None.gif  
None.gif  
< body >
None.gif    
< form name = " cc "  action = " pager.jsp "  method = " post " >
None.gif        
< input type = " text "  name = " name "  value = " <%=request.getParameter( " name " )%> " />< input type = " submit "  value = " search " />
None.gif    
</ form >
None.gif    
< pg:pager
None.gif    items
= " <%= pm.getSize(request.getParameter( " name " )) %> "
None.gif    index
= " center "
None.gif    maxPageItems
= " 5 "
None.gif    maxIndexPages
= " 5 "
None.gif    isOffset
= " <%= false %> "
None.gif    export
= " pageOffset,currentPageNumber=pageNumber "
None.gif    scope
= " request " >
None.gif    
<%
None.gif    
int  pageNum  =   1 ;
None.gif    
if (request.getParameter( " pageNo " !=   null )
None.gif        pageNum 
=  Integer.valueOf(request.getParameter( " pageNo " ));
None.gif    
int  pageSize  =   5 ;
None.gif      List result 
=  pm.query(pageNum,pageSize,request.getParameter( " name " ));
None.gif  
%>
None.gif    
< table >
None.gif        
< tr >
None.gif            
< td > result </ td >
None.gif        
</ tr >
ExpandedBlockStart.gifContractedBlock.gif        
<% for ( int  i  =   0 ; i  <  result.size(); i  ++ ) dot.gif { %>
InBlock.gif        
< tr >
InBlock.gif            
< td >
InBlock.gif                
<%= result.get(i) %>
InBlock.gif            
</ td >
InBlock.gif        
</ tr >
ExpandedBlockEnd.gif        
<% }
%>
None.gif    
</ table >
None.gif    
None.gif    
< pg:param name = " name " />
None.gif    
< pg:index >
None.gif        
< jsp:include page = " /pagination/jsptags.jsp "  flush = " true " />
None.gif    
</ pg:index >
None.gif    
</ pg:pager >
None.gif  
</ body >
None.gif
</ html >


从页面里可以看到,这里使用了三个标签

1、<pg:pager>,在这个标签库里就充当着一个领袖的作用,一切子标签都在它里面工作。就以上出现的参数进行解释一下:
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、<pg:param>这个标签很有用,用来设置将要加入到URL的变量。使用Name属性指定即可。

3、<pg:index>这个标签说明分页显示开始了。跳进我们Include的页面。再看看详细的情况。

三、分页显示页面

None.gif <% @ page session = " false "  contentType = " text/html;charset=utf-8 " %>
None.gif
<% @ taglib uri = " http://jsptags.com/tags/navigation/pager "  prefix = " pg "   %>
None.gif
< pg:first >
None.gif  
< a href = " <%= pageUrl %>&pageNo=<%= pageNumber %> " >< nobr > [ # <%=  pageNumber  %>  首页 ] </ nobr ></ a >
None.gif
</ pg:first >
None.gif
< pg:skip pages = " <%= -5 %> " >
None.gif  
< a href = " <%= pageUrl %>&pageNo=<%= pageNumber %> " >< nobr > [ # <%=  pageNumber  %>  后退 ] </ nobr ></ a >
None.gif
</ pg:skip >
None.gif
< pg:prev >
None.gif  
< a href = " <%= pageUrl %>&pageNo=<%= pageNumber %> " >< nobr > [ # <%=  pageNumber  %>  前一页 ] </ nobr ></ a >
None.gif
</ pg:prev >
None.gif
< pg:pages >
None.gif   
< a href = " <%= pageUrl %>&pageNo=<%= pageNumber %> " ><%=  pageNumber  %></ a >  
None.gif
</ pg:pages >
None.gif
< pg:next >
None.gif  
< a href = " <%= pageUrl %>&pageNo=<%= pageNumber %> " >< nobr > [ 下一页 # <%=  pageNumber  %>  ] </ nobr ></ a >
None.gif
</ pg:next >
None.gif
< pg:skip pages = " <%= 5 %> " >
None.gif  
< a href = " <%= pageUrl %>&pageNo=<%= pageNumber %> " >< nobr > [ 跳进 # <%=  pageNumber  %>  ] </ nobr ></ a >
None.gif
</ pg:skip >
None.gif
< pg:last >
None.gif  
< a href = " <%= pageUrl %>&pageNo=<%= pageNumber %> " >< nobr > [ 尾页 # <%=  pageNumber  %>  ] </ nobr ></ a >
None.gif
</ pg:last >
None.gif


没错,你看到的这些标签都是导航标签。很容易明白,用法基本上一致,从标签的名字上就能看出是什么作用。告诉你我动了手脚的地方就是我在每一个PageUrl后面都加了&pageNo=<%= pageNumber %>。让我们的URL带上页码的参数,这样程序可以拿到页码去查找所需要的数据。

结果很理想。在SpringSide领了个分页标签的任务,原来还想着自已实现一套标签的。还好被白衣喝住了。。卡卡。摸清楚了整套标签的使用方法后,很容易就可以把一些重复的东西再稍作封装,变成有“特色”的东西。幸亏没有重复发明轮子(脸红啊,还发明呢~~~)。

       天色已早。这几天再继续研究和“拿来”。有经验再一起交流。。


参考资料:
http://jsptags.com/tags/navigation/pager/index.jsp Pager-taglibs官网
http://www.springside.org.cn/ SpringSide 春天的旁边(需要我们的参与)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值