`
369540808
  • 浏览: 194309 次
文章分类
社区版块
存档分类
最新评论

使用工具开发 (一) Pager-taglib分页

 
阅读更多
  1. 介绍
    1. 分页是是使数据清晰展示出来的重要技术,生活中的信息也到处是分页呈现给大家的,我们平时看的书分了很多也,并且按着一定的顺序进行排序往往是简单、通俗的内容或者重要的排在前面,计算机中得分页也类似是将从数据库中查出来的数据一页一页的显示在浏览器或者桌面上,达到高的用户体验度。
    2. 最初的分页需要自己手动编写代码,到现在已经有专业的分页实现我们只需要借鉴来使用即可,今天介绍一个常用的分页工具pager-taglib,使用的时候需要引入这个jar文件。
  2. Pager-taglib使用
    1. pager主要提供了很多用于分页的标签,每个标签都有不同的作用,先来看一下简单例子:
    2. <pg:pager url="org.do"  items="${pm.total }" export="currentPageNumber=pageNumber">
      	<pg:param name="parentId"/>
      	<pg:first>
      		<a href="${pageUrl}">首页</a>
      	</pg:first>
      	<pg:prev>
      		<a href="${pageUrl }">前页</a>
      	</pg:prev>
      	<pg:pages>
      		<c:choose>
      			<c:when test="${currentPageNumber eq pageNumber }">
      			<font color="red">${pageNumber }</font>
      			</c:when>
      			<c:otherwise>
      				<a href="${pageUrl }">${pageNumber }</a>
      			</c:otherwise>
      		</c:choose>
      	</pg:pages>
      	<pg:next>
      		<a href="${pageUrl }">后页</a>
      	</pg:next>
      	<pg:last>
      		<a href="${pageUrl }">尾页</a>
      	</pg:last>
      </pg:pager>


    3. 上面代码是分页简单实现,通过查查资料很容易理解,注意一点是url属性这个属性一定要设置成首页的跟访问地址,如果没有设置这个属性,那么鼠标单击“首页”时显示的是该页JSP文件所在的路径,不会去访问action不能够提交请求,可能会找不到路径。
  3. 抽象分页模块
    1. 在一个数据库中会涉及到很多种信息,例如学生信息、班级信息、年级信息,这些信息都需要分页显示为了提高代码的复用性就需要提取出来一个公共的分页模块来分页,该模块需要返回pager-taglib需要的参数信息或者页面分页所需要的参数信息,用pager-taglib分页只需要知道总记录数以及记录结果集两个参数。下面是一个抽象的分页。
    2. package com.bjsxt.oa.manager.impl;
      
      import java.util.List;
      import org.hibernate.Query;
      import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
      import com.bjsxt.oa.PageModel;
      import com.bjsxt.oa.SystemContext;
      import com.bjsxt.oa.manager.SystemException;
      /**
       * 抽象的公共分页类
       * @author lilongsheng
       *
       */
      public class AbstractManager extends HibernateDaoSupport {
      	/**
      	 * 带hql查询语句的查询方法
      	 * @param hql
      	 * @return
      	 */
      	public PageModel searchPaginated(String hql){
      		return searchPaginated(hql,null,SystemContext.getOffset(),SystemContext.getPagesize());
      	}
      	/**
      	 * 带hql查询语句和一个参数的方法
      	 * @param hql
      	 * @param param
      	 * @return
      	 */
      	public PageModel searchPaginated(String hql,Object param){
      		return searchPaginated(hql,new Object[]{param},SystemContext.getOffset(),SystemContext.getPagesize());
      	}
      	/**
      	 * 带hql查询语句和若干参数的方法
      	 * @param hql
      	 * @param params
      	 * @return
      	 */
      	public PageModel searchPaginated(String hql,Object[] params){
      		return searchPaginated(hql,params,SystemContext.getOffset(),SystemContext.getPagesize());
      	}
      	/**
      	 * 不带参数的查询语句
      	 * @param hql
      	 * @param offset
      	 * @param pagesize
      	 * @return
      	 */
      	public PageModel searchPaginated(String hql,int offset,int pagesize){
      		return searchPaginated(hql,null, offset, pagesize);
      	}
      	/**
      	 * 
      	 * 带一个参数的分页查询
      	 */
      	public PageModel 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 PageModel 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]);
      			}
      		}
      		List datas=query.setFirstResult(offset)
      						.setMaxResults(pagesize)
      						.list();
      		PageModel pm=new PageModel();
      		pm.setTotal(total);
      		pm.setDatas(datas);
      		
      		return pm;
      		
      	}
      	
      	/**
      	 * 根据HQL语句,获得查找总记录数的HQL语句
      	 * 如:
      	 * select ... from Orgnization o where o.parent is null
      	 * 经过转换,可以得到:
      	 * select count(*) from Orgnization o where o.parent is null
      	 * @param hql
      	 * @return
      	 */
      	private String getCountQuery(String hql){
      		
      		int index=hql.indexOf("from");
      		
      		if (index!=-1) {
      			return "select count(*) "+ hql.substring(index);
      		}
      		
      		throw new SystemException("无效的HQL查询语句!");
      	
      	}
      }
      


    3. 该类中有很多重名的方法名,好处是提高了该类和接口的复用性,接口中有时不会提供这么参数的方法,因此使用的时候就会有限制在类里面多了接口就容易实现接口中方法。
    4. 参数怎么传递?下图为参数传输的两种方式

    5. SystemContext
    6. package com.bjsxt.oa;
      
      
      public class SystemContext {
      
      	private static ThreadLocal offset=new ThreadLocal();
      	
      	private static ThreadLocal pagesize=new ThreadLocal();
      
      	public static int getOffset(){
      		
      		Integer os=(Integer)offset.get();
      		if (os==null) {
      			return 0;
      		}
      		return os;
      		
      	}
      	
      	public static void setOffset(int offsetvalue){
      		
      		offset.set(offsetvalue);
      		
      	}
      	
      	public static void removeOffset(){
      		offset.remove();
      	}
      	
      	public static int getPagesize(){
      		Integer ps = (Integer)pagesize.get();
      		if(ps == null){
      			return Integer.MAX_VALUE;
      		}
      		return ps;
      	}
      	
      	public static void setPagesize(int pagesizevalue){
      		pagesize.set(pagesizevalue);
      	}
      	
      	public static void removePagesize(){
      		pagesize.remove();
      	}
      	
      }
      


  4. 在写代码或者设计类图时候,多建立一些抽象模块可以增加设计的灵活性,类之间关系不要太过松散,分页的工具还有很多大家可以自行尝试。
分享到:
评论

相关推荐

    使用pager-taglib分页完整例子

    使用pager-taglib分页,含有多种分页样式,jar包都有,只要导入就可以运行,内附有说明,java 语言的

    pager-taglib 分页扩展实例

    pager-taglib 是个很好的jsp分页标签,使用它结合jstl可以实现灵活的分页导航功能。在实际的开发中post方式的提交比较常见,本人做了一个比较通用的基于post方式的一个应用。主要实现一下功能: 1.添加输入跳转、每...

    pager-taglib分页标签

    jsp 分页标签。 用于列表自动分页功能

    pager-taglib分页jar包

    用于在jsp中进行分页的 pager-taglib包

    pager-taglib分页组建

    pager-taglib分页组建 pager-taglib分页组建 pager-taglib分页组建 pager-taglib分页组建

    Pager-taglib页面分页示例

    这是关于paper-taglib分页框架的小小项目,导入myeclipse中部署到服务器可直接运行,包含了两种分页风格:普通样式和谷歌样式,可以在servlet中通过注释切换。

    pager-taglib源码

    这是pager-taglib的官方源码,但在采用官方的pager-taglib分页传输中文参数会出现乱码,所以我采用maven新建一个pager-taglib项目对pager-taglib的源码进行小小的改动,是他支持中文传输,更重要的是把源代码提供给...

    pager-taglib 分页框架+附带例子

    该资源系本人工作之余的一个小小案例,希望对大家有所帮助

    displaytag,pager-taglib 分页包

    displaytag,pager-taglib 分页包 和源文件

    pager-taglib-2.0

    pager-taglib-2.0,pager-taglib-2.0,pager-taglib-2.0,java分页标签。

    pager-taglib-2.0及使用方法

    pager-taglib-2.0及使用方法,一个很好用的页面分页工具.

    jsp pager-taglib分页资料

    jsp pager-taglib分页资料jsp pager taglib 分页 ppt,很好的分页模版

    pager-taglib分页要点

    pager-taglib分页要点,第三方分页工具 的要点!

    pager-taglib.jar

    利用pager-taglib进行查询分页时需要添加该jar包:pager-taglib.jar

    pager-taglib分页方法

    很详细的Pager-taglib标签库分页的使用。

    pager-taglib 分页扩展实例(旧)

    pager-taglib 是个很好的jsp分页标签,使用它结合jstl可以实现灵活的分页导航功能。在实际的开发中post方式的提交比较常见,本人做了一个比较通用的基于post方式的一个应用。主要实现一下功能: 1.添加输入跳转、每...

    pager-taglib中文乱码解决后的JAR包

    用pager-taglib进行分页时,如果出现中文参数,由于pager-taglib默认是用ISO8859-1编码后进行参数传递,故会出现乱码现象。本人下载源码后,将编码的语句注释掉,即不进行编码,解决了中文乱码问题。改写后的代码已...

    pager-taglib.jar包下载

    pager-taglib.jar包下载.很方便的分页框架。这是jar包,希望能帮到大家

    pager-taglib使用指南 .txt

    pager-taglib使用指南 .txt 很详细,里面还有例子。

Global site tag (gtag.js) - Google Analytics