pager-taglib分页处理的使用

pager-taglib是java中一个用于分页的小的框架。下面简单介绍一下它的具体使用。

一、环境的搭建:

       将pager-taglib-2.0.war包拷贝到Tomcat的webapps下。启动Tomcat后会将其解压成pager-taglib-2.0文件夹。

       从解压文件中的lib目录下拷贝pager-taglib.jar包到项目的lib下。

       在JSP页面中使用taglib指令引入pager-taglib标签库。

二、重要参数的说明:

     Offset:传过来的值是偏移量,是选择的页面的页数。比如你的记录/页pageSize=3,那么传过来的offset应该如下处理:offset/3+1   这样得到的就是要生成的页数!

       pg:pager设置分页的总体参数

       url:分页的链接根地址,pager标签会在这个链接的基础上附加分页参数,但不允许像给页面跳转的url那样,在后面直接添加参数,而参数的传递时需要使用pg:param来指定。

       items:总记录数,pager标签正是根据这个值来计算分页参数,很重要。

       maxPageItems:每页显示的行数,默认为10

       maxIndexPages:在循环输出页码的时候,最大输出多少个页码,默认是10      

pg:first 第一页的标签    

pg:pre 上一页标签

pg:next 下一页标签 

pg:last 最后一页标签

pg:pages 循环输出页码信息

      对于上面的标签都有类似的export变量:

       pageUrl - 分页链接URL地址(最重要的export参数)

       pageNumber- 页码

       firstItem –对应页第一行的索引值

       lastItem -对应页最后一行的索引值     

 

三、项目中使用pager-taglib:

1、引入对应的标签库:

<%@taglibprefix="pg" uri="http://jsptags.com/tags/navigation/pager"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

 2、使用标签布置页面:



       

       

              首页

       

       

              前页

       

       

              

                     

                     ${pageNumber }

                     

                     

                            ${pageNumber }

                     

              

       

       

              后页

       

       

              尾页

       

 

需要注意的是

       很多时候,在不同的页面中跳转的时候,需要传递一个id,在保持这个数据的时候,不能直接跟在url后面,需要使用来传递。

为了给当前页添加一些特殊的效果,使用currentPageNumber给pageNumber指定了一个别名,这是为了test="${currentPageNumber eq pageNumber }判断的需要。

Items表示:返回来的总记录数,由此,该框架采用的是假分页。

url:指明了请求的入口地址,是与struts的配置文件struts-config.xml中的配置相关联。

     

3、设置offset和pagesize变量的值:

    比较好的做法是在系统变量类中,将其设置到ThreadLocal变量中。这里将其封装到了SystemContext类中:

public class SystemContext {

       privatestatic ThreadLocal offset = new ThreadLocal();

       privatestatic ThreadLocal pagesize = new ThreadLocal();
     

       publicstatic int getOffset(){

              Integeros = (Integer)offset.get();

              if(os== null){

                     return0;
              }
              returnos;
       }
      

       publicstatic void setOffset(int offsetvalue){

              offset.set(offsetvalue);

       }
      

       publicstatic void removeOffset(){
              offset.remove();
       }
     

       publicstatic int getPagesize(){

              Integerps = (Integer)pagesize.get();

              if(ps== null){

                     returnInteger.MAX_VALUE;

              }

              returnps;

       }
      

       publicstatic void setPagesize(int pagesizevalue){

              pagesize.set(pagesizevalue);
       }
     

       publicstatic void removePagesize(){

              pagesize.remove();
       }
      

}
 

4、定义分页过滤器PagerFilter:

    该过滤器调用SystemContext类的方法,给offset和pagesize变量赋值。

publicclass PagerFilter implements Filter {


    @Override

    publicvoid destroy() {

    } 

    @Override

    publicvoid doFilter(ServletRequest request, ServletResponseresponse,

           FilterChain chain) throws IOException, ServletException{
     

       HttpServletRequest httpRequest = (HttpServletRequest)request;

       SystemContext.setOffset(getOffset(httpRequest));

       SystemContext.setPagesize(getPagesize(httpRequest));
     

       try{

           chain.doFilter(request, response);

       }finally{

           //清空ThreadLocal中的值

           SystemContext.removeOffset();

           SystemContext.removePagesize();

       }      

    }
   

    protectedint getOffset(HttpServletRequest request){

       int offset = 0;

       try {

           offset = Integer.parseInt(request.getParameter("pager.offset"));

       } catch (NumberFormatException ignore) {

       }

       return offset;

    }
   

    protectedint getPagesize(HttpServletRequest request){

       return 10;

    } 

    @Override

    publicvoid init(FilterConfig arg0) throws ServletException {

    } 

}

offset = Integer.parseInt(request.getParameter("pager.offset"));中的参数是固定的。


5、将过滤器配置到web.xml文件中,使之生效:



    pagerFilter

    com.bjsxt.oa.web.PagerFilter

 

 

    pagerFilter

    /*

 
 

6、定义封装不同实体类数据的分页类PagerModel:

    该类使用List封装了返回的不同实体类型。这里如果使用泛型,可以在编程的时候检查类型及早给出提示,不使用也是可以的,根据个人的编程习惯吧。

publicclass PagerModel{
 

    /**

     * 总记录数

     */

    privateinttotal;

   

    /**

     * 当前页结果集

     */

    private List datas;
 

    public List getDatas() {

       returndatas;

    }
 

    publicvoid setDatas(List datas) {

       this.datas = datas;

    }
 

    publicint getTotal() {

       returntotal;

    } 

    publicvoid setTotal(int total) {

       this.total = total;

    }

}
 

7、抽象分页服务类AbstractManager:

    在业务逻辑的实现类中,只是传入的查询语句和参数不同,所以,可以对这个变化的部分抽象。

publicclass AbstractManager extends HibernateDaoSupport { 


    /**

     * 私有的给查询语句赋值的方法

     * @param query

     * @param hql

     * @param params

     */

    publicvoid setParams(Query query,String hql,Object[] params){    

       if(params!=null && params.length>0){

           for(int i =0;i 0){

           for(int i=0; i 0){

           for(int i=0; i

当然这个类中还可以定义其他的服务方法,相当于.net中常用的sqlHelp类。

 

8、在业务逻辑实现类中查询分页数据:

 @Override

    public PagerModelfindOrgs(int parentId) {

      

       //如果parentId=0,则查找顶级机构列表

       if(parentId == 0){

           return searchPaginated("from Organization owhere o.parent is null");

       }

       return searchPaginated("from Organization o where o.parent.id = ?", parentId);

    }
   

我们可以看到经过上面的封装,分页查询变得如此简洁。

 

总结:

       上文中首先介绍了分页框架pager-taglib的环境搭建,然后介绍了一些重点参数的意义。

如然后结合一个项目中与之相关的部分进行了完整的代码展示。

       诸如此类的小的框架很多很多,有了ssh基础后,对这类框架的学习应该会看官方文档,并从一些简单的demo开始,学习使用起来应该是比较快的,这些框架就像是夜空中的星星给java程序添加一些灿烂的点缀。

 

你可能感兴趣的:(Java)