首页 技术 正文
技术 2022年11月6日
0 收藏 471 点赞 1,017 浏览 6509 个字

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}" rel="external nofollow" >首页</a>       </pg:first>       <pg:prev>              <ahref="${pageUrl }" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >前页</a>       </pg:prev>       <pg:pages>              <c:choose>                     <c:whentest="${currentPageNumber eq pageNumber }">                     <fontcolor="red">${pageNumber }</font>                     </c:when>                     <c:otherwise>                            <ahref="${pageUrl }" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >${pageNumber }</a>                     </c:otherwise>              </c:choose>       </pg:pages>       <pg:next>              <ahref="${pageUrl }" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >后页</a>       </pg:next>       <pg:last>              <ahref="${pageUrl }" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >尾页</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程序添加一些灿烂的点缀。

下一篇: Tim’s iT Blog
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,083
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,558
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,407
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,180
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,817
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,900