像一颗晨土

常用链接

统计

blogs

life

最新评论

pager-taglib 体验

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

package  net.jf.ajax.business;

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上去)。

<% @ page language = " java "   import = " java.util.* "  pageEncoding = " UTF-8 " %>
<% @ 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、<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的页面。再看看详细的情况。

三、分页显示页面

<% @ page session = " false "  contentType = " text/html;charset=utf-8 " %>
<% @ 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 春天的旁边(需要我们的参与)

posted on 2006-06-27 02:22 艾尘 阅读(6128) 评论(7)  编辑  收藏 所属分类: pick up

评论

# re: pager-taglib 体验 2006-09-18 13:15 赌东道事实

< a href = " <%= pageUrl %>&pageNo=<%= pageNumber %> " ><%= pageNumber %></ a >

如果我用的是控制器(比如说控制器请求地址是:test.shtml),pageUrl 应该怎么写???  回复  更多评论   

# re: pager-taglib 体验 2006-09-23 18:21 fsd

@赌东道事实
fd  回复  更多评论   

# re: pager-taglib 体验[未登录] 2007-01-18 21:47 Luke

看了你的介绍觉得很好,但是运行你的代码,没运行出来,如果方便的话希望能写一个完整的例子(代码)出来,如果可以的话希望能发到我的邮箱ln1058@163.com
谢了!  回复  更多评论   

# re: pager-taglib 体验 2007-02-10 21:24 事实

真的很垃圾,在jsp页面中怎么能用<%%>着玩意儿  回复  更多评论   

# re: pager-taglib 体验 2007-02-10 21:28 事实

我希望jsp只作为view,不要有一切逻辑;笔者能给出ExtremeTable(数据呈现)+Pager-taglib(分页呈现)的解决方案吗?  回复  更多评论   

# re: pager-taglib 体验 2007-02-10 21:30 事实

分页数据在dao层进行,将得到的数据给ExtremeTable(数据呈现)+Pager-taglib(分页呈现)呈现  回复  更多评论   

# re: pager-taglib 体验 2008-10-31 15:43 machey

pager.offset这个参数能否变换,考虑一下如何变换  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问