zoukankan      html  css  js  c++  java
  • 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、使用标签布置页面:

    <pg:pager url="org.do"items="${pm.total}"export="currentPageNumber=pageNumber">
    
           <pg:paramname="parentId"/>
    
           <pg:first>
    
                  <ahref="${pageUrl}">首页</a>
    
           </pg:first>
    
           <pg:prev>
    
                  <ahref="${pageUrl }">前页</a>
    
           </pg:prev>
    
           <pg:pages>
    
                  <c:choose>
    
                         <c:whentest="${currentPageNumber eq pageNumber }">
    
                         <fontcolor="red">${pageNumber }</font>
    
                         </c:when>
    
                         <c:otherwise>
    
                                <ahref="${pageUrl }">${pageNumber }</a>
    
                         </c:otherwise>
    
                  </c:choose>
    
           </pg:pages>
    
           <pg:next>
    
                  <ahref="${pageUrl }">后页</a>
    
           </pg:next>
    
           <pg:last>
    
                  <ahref="${pageUrl }">尾页</a>
    
           </pg:last>
    
    </pg:pager>

    需要注意的是

           很多时候,在不同的页面中跳转的时候,需要传递一个id,在保持这个数据的时候,不能直接跟在url后面,需要使用<pg:param name="parentId"/>来传递。

    为了给当前页添加一些特殊的效果,使用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文件中,使之生效:

    <filter>
    
        <filter-name>pagerFilter</filter-name>
    
        <filter-class>com.bjsxt.oa.web.PagerFilter</filter-class>
    
     </filter>
    
     <filter-mapping>
    
        <filter-name>pagerFilter</filter-name>
    
        <url-pattern>/*</url-pattern>
    
     </filter-mapping>

     

    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<params.length;i++){
    
                  query.setParameter(i, params[i]);
    
               }         
    
           }     
    
        } 
    
       
    
        //*****************************************分页公共方法开始*****************************************
      
    
        public PagerModel searchPaginated(String hql){
    
           return searchPaginated(hql,null,SystemContext.getOffset(),SystemContext.getPagesize());
        }
       
    
        public PagerModel searchPaginated(String hql,Object param){
    
           return searchPaginated(hql,new Object[]{param},SystemContext.getOffset(),SystemContext.getPagesize());
    
        }
       
    
        public PagerModel searchPaginated(String hql,Object[] params){
    
           return searchPaginated(hql,params,SystemContext.getOffset(),SystemContext.getPagesize());
    
        }
       
    
        public PagerModel searchPaginated(String hql,int offset,int pagesize){
    
           return searchPaginated(hql,null,offset,pagesize);
    
        }
         
    
        public PagerModel searchPaginated(String hql,Object obj,int offset,int pagesize){
    
           return searchPaginated(hql,new Object[]{obj},offset,pagesize);
    
        }
    
       
    
        /**
    
         * 根据HQL语句进行分页查询
    
         * @param hql HQL语句
    
         * @param params HQL语句带的多个参数值
    
         * @param offset 从第几条记录开始查询
    
         * @param pagesize 每页显示多少行
    
         * @return
    
         */
        public PagerModel searchPaginated(String hql,Object[] params,int offset,int pagesize){
          
    
           //获取记录总数
    
           String countHql = getCountQuery(hql);
    
           Query query = getSession().createQuery(countHql);
    
           if(params != null && params.length > 0){
    
               for(int i=0; i<params.length; i++){
    
                  query.setParameter(i, params[i]);
    
               }
    
           }
    
           int total = ((Long)query.uniqueResult()).intValue();
          
    
           //获取当前页的结果集
    
           query = getSession().createQuery(hql);
    
           if(params != null && params.length > 0){
    
               for(int i=0; i<params.length; i++){
    
                  query.setParameter(i, params[i]);
    
               }
    
           }
          
    
           query.setFirstResult(offset);
    
           query.setMaxResults(pagesize);
    
           List datas = query.list();
    
          
    
           PagerModel pm = new PagerModel();
    
           pm.setTotal(total);
    
           pm.setDatas(datas);
    
           return pm;
    
        }
       
    
        /**
    
         * 根据HQL语句,获得查找总记录数的HQL语句
    
         * 如:
    
         * select ... from Orgnizationo where o.parent is null
    
         * 经过转换,可以得到:
    
         * select count(*) from Orgnizationo where o.parent is null
    
         * @param hql
    
         * @return
    
         */
    
        private String getCountQuery(String hql){
    
           int index = hql.indexOf("from");
    
           if(index != -1){
    
               return"selectcount(*) " + hql.substring(index);
    
           }
    
          
    
           thrownew SystemException("无效的HQL查询语句!");
    
        }   
    
        //*****************************************分页公共方法结束*****************************************
           
    
    }

    当然这个类中还可以定义其他的服务方法,相当于.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程序添加一些灿烂的点缀。

     

  • 相关阅读:
    AcWing 157. 树形地铁系统 (hash判断树同构)打卡
    AcWing 156. 矩阵 (哈希二维转一维查询)打卡
    AcWing 144. 最长异或值路径 01字典树打卡
    AcWing 143. 最大异或对 01字典树打卡
    AcWing 142. 前缀统计 字典树打卡
    AcWing 139. 回文子串的最大长度 hash打卡
    AcWing 138. 兔子与兔子 hash打卡
    常用C库函数功能及用法
    编程实现C库函数
    C语言面试题5
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3402644.html
Copyright © 2011-2022 走看看