• 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程序添加一些灿烂的点缀。

     

  • 相关阅读:
    vue自动路由-单页面项目(非build时构建)
    建立多页面vue.js项目
    C#调用C++(QT5.5.1项目)的C++/CLI(CLR项目)项目技术笔记
    自建Socket转发,使用远程桌面(mstsc)连接家中电脑
    用Vue.js搭建一个小说阅读网站
    在CentOS中部署.Net Core2.1网站
    高价值干货:这可能是你见过最全的网络爬虫总结
    【DevCloud·敏捷智库】如何利用用户故事了解需求
    项目管理:如何显性管理并提升Story分解能力
    【API进阶之路】老板给我涨薪30%!如何通过SDK接口搞定千万级流量直播
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3402644.html
Copyright © 2020-2023  润新知