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程序添加一些灿烂的点缀。
pager-taglib分页处理的使用的更多相关文章
- asp.net mvc 简易通用自定义Pager实现分页
asp.net mvc 自定义Pager实现分页 Intro 一个WEB应用程序中经常会用到数据分页,本文将实现一个简单通用的分页组件,包含一个 PagerModel (用来保存页码信息),一个 Ht ...
- 使用pager进行分页
pager jar网址:http://java2s.com/Code/Jar/t/Downloadtaglibspagejar.htm package com.binary.entity; impor ...
- 分页技术框架(Pager-taglib)学习二(SSH数据库分页)
一.Pager-taglib数据库分页前提 Pager-taglib分页标签也可以实现数据库分页,与页面分页不同的是需要给后台传两个参数,一个是pageNo(当前页数)或pageOffset(偏 ...
- Spring3+ibatis (SQL Server)+pager-taglib.tld查询分页的实现
pager-taglib分页開始~ 查了好多关于分页的技术,终于选定下面方法实现~ 1.首先下载jar包:pager-taglib.jar,pager-taglib.jar放在WEB-INF/lib文 ...
- jQuery +ajax +json+实现分页
正文 首先我们创建一般处理程序,来读取数据库中内容,得到返回值. 创建文件,GetData.ashx. 我这里是用的存储过程,存储过程会再下面粘出来,至于数据只是实例,你们可根据需求自行读取数据 代码 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(8)-MVC与EasyUI DataGrid 分页
系列目录 前言 为了符合后面更新后的重构系统,文章于2016-11-1日重写 EasyUI Datagrid在加载的时候会提交一些分页的信息到后台,我们需要根据这些信息来进行数据分页再次返回到前台 实 ...
- 基于Jquery+Ajax+Json+高效分页
摘要 分页我相信大家存储过程分页已经很熟悉了,ajax更是耳熟能详了,更别说我们的json,等等. 如果说您没用过这些东东的话,我相信看完这篇博文会对您有帮助的,,如果有任何问题不懂或者有bug没问题 ...
- Hibernate分页查询小结
通常使用的Hibernate通常是三种:hql查询,QBC查询和QBE查询: 1.QBE(Qurey By Example)检索方式 QBE 是最简单的,但是功能也是最弱的,QBE的功能不是特别强大, ...
- 使用MvcPager实现Ajax分页
接触ASP.NET MVC的时间不长,这段时间做东西的时候要用到分页,但是普通的分页用户体验不是很好,所以想实现无刷新的分页. 在网上找了好多例子,但是感觉都封装的不好,不小心发现了Webdiyer. ...
随机推荐
- cocos2d-x getVisibleOrigin
getVisibleSize:表示获得视口(可视区域)的大小,如果DesignResolutionSize跟屏幕尺寸一样大,则getVisibleSize等于getWinSize.getVisible ...
- WordPress主题开发:get_term_by和get_term_link
学习目的: 某一个分类的名称.别名.和id都可以到后台自己去找,但这样找比较麻烦还容易看错,wordpress提供了下面两个函数get_term_by和get_term_link,只要提供别名.名称或 ...
- 使用PHP+Sphinx建立高效的站内搜索引擎
1. 为什么要使用Sphinx 假设你现在运营着一个论坛,论坛数据已经超过100W,很多用户都反映论坛搜索的速度非常慢,那么这时你就可以考虑使用Sphinx了(当然其他的全文检索程序或方 ...
- SharePoint JavaScript API in application pages
前言 最近,在SharePoint 应用程序页中写JavaScript API,进行一些数据交互.其实,很简单的事情却遇到了问题,记录一下,希望能对遇到类似问题的人以帮助. 引用JavaScript ...
- http抓包以及网速限定
由于我是MAC, 举荐一个Charles工具 限速选择在:可以打开Proxy –> Throttle Setting 设置. 附多篇介绍:http://www.36ria.com/6278 ht ...
- 关于android studio 出现Error:Execution failed for task ':app:preDebugAndroidTestBuild'. 的解决办法
Error:Execution failed for task ':app:preDebugAndroidTestBuild'. > Conflict with dependency 2018年 ...
- 实用ExtJS教程100例-008:使用iframe填充ExtJS Window组件
上面两节中我们分别演示了ExtJS Window的常用功能 和 如何最小化ExtJS Window组件,在这篇内容中我们来演示一下如何使用iframe填充window组件. 思路很简单,首先创建一个w ...
- 对拍练习:A+B
源程序: /* Problem: OJ: User: S.B.S. Time: Memory: Length: */ #include<iostream> #include<cstd ...
- 用SLF4j/Logback打印日志-2
本篇主要介绍logback的输出源配置,logback默认提供了很多输出源,但是用的最多的是这几种: OutputStreamAppender 日志输出到一个二进制流,可以通过 <encoder ...
- JavaScript:Functions
ylbtech-JavaScript:Functions 1.返回顶部 JavaScript 全局对象 全局属性和函数可用于所有内建的 JavaScript 对象. 顶层函数(全局函数) 函数 描述 ...