随笔-86  评论-767  文章-3  trackbacks-3

以下内容是eamoi在dev2dev回答一网友问题的摘要.因为有共性,故摘要于此.

详细源帖请查阅:

http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=121&threadID=19428&tstart=0

这两天将两个包彻底研究并编码测试了一下,接下来将两个分页标签做一个简单的说明和比较.这里将前者(国内比较流行的pager.rar)称为 P1,后者(pager-taglib-2.0.war,下载地址:http://jsptags.com/tags/navigation/pager/index.jsp?tree1.plus=4
)称为P2.

两者的共同点:

[设计出发点] 通过标签库封装,将分页的手工计算转化为标签自动计算,提供统一
的分页导航条,简化分页设计,提高工作效率.
[标签设计] 提供以主标签和内嵌子标签为结构的分页标签库,通过标签参数设置,控制分页的显示效果.
[分页主体内容显示] 需要手工计算分页主体内容.
[是否适用Struts] 两者都是针对JSP开发的,在标签中会自动取得标签参数,然后自动控制显示效果.因此,不完全适用Struts,除非你在Action中手工取得标签参数,并且放到request中.

两者的不同点:

[P1]:
将分页导航条和主体内容放到form中,参数放到生成的中实现.提供唯一一个标签 page:navigator来统一表现分页导航条,提供任意页跳转功能.即使中途转出返回,比如链接到其它页面对某记录进行一下处理,直接返回重新访问或刷新该页面即可恢复转出前的状况(页号和每页记录数等),不用费心处理。简洁,只需三行代码,在需要分页的地方,头尾加上两行标记,中间适当位置插入导航条标记,如下:
 
    ....//这里是显示记录的地方
   
 

[P2]:
提供pg:pager为主标签,pg:param、pg:item、pg:index、pg:first、pg:prev、pg:page、pg:pages、pg:next、pg:last、pg :skip为内嵌子标签的分页控制方法,将参数放在pageContext或者request中,使用pg:param标签可以在URL后面增加参数,分页导航条分散到 pg:first等各个标签控制,提高灵活性.提供了包括Google等在内的多种导航条样式和选择功能,提供export variables功能. 不支持中途跳转功能.

[P1和P2如何在Struts中使用]:
正如前文所说,P1和P2是针对JSP开发的,所以页面提交target也是标签所在的JSP页面,标签的控制参数以及分页效果在页面中有标签自动读取和计算.
因此,将P1和P2应用到Action的关键是参数传递和分页主体内容的计算(原来在JSP中内嵌,手工计算).
如果在Action中,request是转发的,那么页面参数会自动保留(这个应该占多数).如果request不是转发的那么参数要先取得,再压入 request中.
现在关键是分页主体内容的计算.以P1为例:
                //定义分页参数--页码和每页显示数目
                int iPageNo = 1;
                if(request.getParameter("pageNo")!=null) iPageNo=Integer.parseInt((String)request.getParameter("pageNo"));
                int iPageSize = 10;
                if(request.getParameter("pageSize")!=null) iPageSize=Integer.parseInt((String)request.getParameter("pageSize"));
                String choice = "first";
                if(request.getParameter("choice")!=null) choice = request.getParameter("choice");
                HotInfoValue[] hotInfoValues = new HotInfoValue[0];
                try {
                    //这里取出所有数据,放到hotInfoValues数组里面
                }catch(Exception ex2) {
                }
                int resultNum = hotInfoValues.length;
                request.setAttribute("hotInfoNum",Integer.toString(resultNum));// item条目总数
                Collection result = null;
                if(resultNum!=0) {
                    int pages = (resultNum % iPageSize == 0) ? resultNum / iPageSize : resultNum / iPageSize + 1;
                    if (choice.equals("next")) iPageNo++;
                    if (choice.equals("prev")) iPageNo--;
                    if (choice.equals("first")) iPageNo = 1;
                    if (choice.equals("last")) iPageNo = pages;
                    result = new ArrayList();
                    for(int i=(iPageNo-1)*iPageSize;i                        if(i>=resultNum) break;
                        result.add(hotInfoValues );
                    }
                    if(result.toArray().length!=0) request.setAttribute("hotInfoValues",(HotInfoValue[])result.toArray(new HotInfoValue[0]));
                }
                return actionMapping.findForward("---");
上述代码的关键是取得当前页面等参数,手工计算本页主体内容数据,将取得的数据压入request中.在JSP中,通过logic:iterate标签实现循环迭代.

posted on 2005-01-24 08:35 eamoi 阅读(10157) 评论(3)  编辑  收藏 所属分类: JSP/Servlet

评论:
# re: 两个开源分页标签的使用比较 2006-03-26 20:12 | 冷月宫主
关于你上面讲的P1如果要用于Struts结构的话取参数那一段,我有点不明白,我看了一个pager类的原源码,他生成页面表单时生成了一个form,但他并没有为这个form的action指定值,这样的话用Struts去做的话,势必要修改那个类加上action值,但这样的话就破坏了它的通用性,如果不修改,那我怎么样在action中写你上面给出的那段代码?两难呀,我本来想将这个pager修改成可以用Struts去做的,但到这里都想不通了,唉水平有限呀,能不能说说你的想法?不胜感激!!


我的MSN:E_wsq@msn.com

QQ:15342436  回复  更多评论
  
# re: 两个开源分页标签的使用比较[未登录] 2008-10-09 23:23 | 啊啊
北京政治
  回复  更多评论
  
# re: 两个开源分页标签的使用比较 2009-06-24 16:41 | yaketony
你可以在提交表单的时候通过Javascript 动态改变其表单的action属性啊,指定成你实际想要跳转的映射路径!  回复  更多评论
  

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


网站导航: