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

pager-taglib分页处理的使用的更多相关文章

  1. asp.net mvc 简易通用自定义Pager实现分页

    asp.net mvc 自定义Pager实现分页 Intro 一个WEB应用程序中经常会用到数据分页,本文将实现一个简单通用的分页组件,包含一个 PagerModel (用来保存页码信息),一个 Ht ...

  2. 使用pager进行分页

    pager jar网址:http://java2s.com/Code/Jar/t/Downloadtaglibspagejar.htm package com.binary.entity; impor ...

  3. 分页技术框架(Pager-taglib)学习二(SSH数据库分页)

    一.Pager-taglib数据库分页前提    Pager-taglib分页标签也可以实现数据库分页,与页面分页不同的是需要给后台传两个参数,一个是pageNo(当前页数)或pageOffset(偏 ...

  4. Spring3+ibatis (SQL Server)+pager-taglib.tld查询分页的实现

    pager-taglib分页開始~ 查了好多关于分页的技术,终于选定下面方法实现~ 1.首先下载jar包:pager-taglib.jar,pager-taglib.jar放在WEB-INF/lib文 ...

  5. jQuery +ajax +json+实现分页

    正文 首先我们创建一般处理程序,来读取数据库中内容,得到返回值. 创建文件,GetData.ashx. 我这里是用的存储过程,存储过程会再下面粘出来,至于数据只是实例,你们可根据需求自行读取数据 代码 ...

  6. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(8)-MVC与EasyUI DataGrid 分页

    系列目录 前言 为了符合后面更新后的重构系统,文章于2016-11-1日重写 EasyUI Datagrid在加载的时候会提交一些分页的信息到后台,我们需要根据这些信息来进行数据分页再次返回到前台 实 ...

  7. 基于Jquery+Ajax+Json+高效分页

    摘要 分页我相信大家存储过程分页已经很熟悉了,ajax更是耳熟能详了,更别说我们的json,等等. 如果说您没用过这些东东的话,我相信看完这篇博文会对您有帮助的,,如果有任何问题不懂或者有bug没问题 ...

  8. Hibernate分页查询小结

    通常使用的Hibernate通常是三种:hql查询,QBC查询和QBE查询: 1.QBE(Qurey By Example)检索方式 QBE 是最简单的,但是功能也是最弱的,QBE的功能不是特别强大, ...

  9. 使用MvcPager实现Ajax分页

    接触ASP.NET MVC的时间不长,这段时间做东西的时候要用到分页,但是普通的分页用户体验不是很好,所以想实现无刷新的分页. 在网上找了好多例子,但是感觉都封装的不好,不小心发现了Webdiyer. ...

随机推荐

  1. C/C++中const关键字

    http://blog.csdn.net/xdrt81y/article/details/24333335 今天在做一个趋势笔试题的时候,才让我有了系统把const关键字好好总结一下的冲动,因为这个关 ...

  2. Android开发 AIDL使用自定义对象作参数或返回值

    http://www.pocketdigi.com/20121129/952.html 默认,AIDL支持对象作参数,但需要该对象实现Parcelable接口,且aidl文件应该是该类在同一包下,需要 ...

  3. cloudera项目源代码

    以下项目都需要安装git,Linux的git还是比较容易安装的,windows的git安装参考项目区域:软件版本控制-在Windows中使用Git视频介绍 git相关软件安装参考win7安装 git软 ...

  4. lemon OA 我长时间经历的第一个开源项目

    对于原作者来说, 他长时间运营了一个项目,lemon OA .目前,八百多star.在运营这个项目的过程中,我想说,他成了activiti 目前国内比较牛逼的几个人.还有 spring securit ...

  5. spring boot 之@JsonView 简单介绍

    @JsonView是jackson json中的一个注解,spring webmvc也支持这个注解. 这个注解的作用就是控制输入输出后的json. 假设我们有一个用户类,其中包含用户名和密码,一般情况 ...

  6. Android:客户端和服务器之间传输数据加密

    Android客户端与服务器进行数据传输时,一般会涉及到两类数据的加密情况,一类是只有创建者才能知道的数据,比如密码:另一类是其他比较重要的,但是可以逆向解密的数据. 第一类:密码类的数据,为了让用户 ...

  7. Android5.0 ListView特效的简单实现

    Android5.0中对于动画可所谓是情有独钟,在设计规范中大量展现了listview的动画,其实也就是一个目的:将items动画显示出来.这个看起来很炫的效果,其实实现也蛮简单的,我下面就来用动画简 ...

  8. [Web 前端] MobX

    1. 介绍 1.1. 原理 React的render是 状态 转化为树状结构的渲染组件的方法 而MobX提供了一种存储,更新 状态 的方法 React 和 MobX都在优化着软件开发中相同的问题. R ...

  9. SKU与SPU

    首先,搞清楚商品与单品的区别.例如,iphone是一个单品,但是在淘宝上当很多商家同时出售这个产品的时候,iphone就是一个商品了. 商品:淘宝叫item,京东叫product,商品特指与商家有关的 ...

  10. SpringBoot yml 配置 多配置文件,开发环境,生产环境配置文件分开

    原文地址:https://www.cnblogs.com/baoyi/p/SpringBoot_YML.html 1. 在 spring boot 中,有两种配置文件,一种是application.p ...