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. ​0​天​掌​握​i​O​S​开​发​之​D​a​y​2​ ​-​ ​内​存​管​理 (给学生讲解的课件,总结的不错)

    from:   10​天​掌​握​i​O​S​开​发​之​D​a​y​2​ ​-​ ​内​存​管​理

  2. Getting OS version with NDK in C c++获得版本号

    http://stackoverflow.com/questions/19355783/getting-os-version-with-ndk-in-c #include <cutils/pro ...

  3. Android基础笔记(九)- 广播

    广播的概念 广播的生命周期 案例-监听短信到来并解析短信内容 案例-拦截外拨电话并设置区号 案例-SD卡状态监听 介绍一些经常使用的广播 发送自己定义广播 有序广播和无序广播 启程!! ! 广播的概念 ...

  4. jQuery Ajax 上传文件改进

    如果用户取消上传后 背景 提示自动消失了.... 修正Bug.... 同时也更新了不同上传类型的提示字体大小... 2017-05-26 增加了鼠标释放提示 先看之前的效果: 再看现在的效果: 升级 ...

  5. [Android Security] 静态分析Android程序——smali文件解析

    cp : https://blog.csdn.net/hp910315/article/details/51823236 cp : http://www.jb51.net/softjc/119036. ...

  6. 概率校准与Brier分数

    1.再提逻辑回归 前面已经讲过了逻辑回归,这里不再细讲,只是简单的说一个函数,主要是方便大家更好的理解概率校准. 在逻辑回归中,用的最多的就是sigmod函数,这个函数的作用就是把无限大或者无限小的数 ...

  7. hyper-V下虚拟机连接外网,怎么才能将Hyper-V 的虚拟机接入互联网?

    现在情况是这样的: windows hyper-V主机IP: 192.168.20.3 hyper-v虚拟网卡IP:192.168.20.13 虚拟机1IP:192.168.20.21 同一局域网主机 ...

  8. Understanding Linux CPU stats

    Your Linux server is running slow, so you follow standard procedure and run top. You see the CPU met ...

  9. go语言之进阶篇空接口

    1.空接口 示例: package main import "fmt" func xxx(arg ...interface{}) { } func main() { //空接口万能 ...

  10. 如何使用.net访问Access数据库 (转)

    前言:今天整理程序,看到之前写的一个Demo,也不知道是从哪里参考的了,写到这里,留作备用吧. 使用.net访问Access数据库:1.BL层:新增一个DataAccess类. Code].Defau ...