`
xuweijian2009
  • 浏览: 22916 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

pager-taglib分页逻辑的封装处理

阅读更多
为了避免在Action(呈现层)和Manager(业务逻辑层)之间传递大量的参数,
可以使用ThreadLocal模式来传递分页参数(包括:offset和pagesize)。
- 定义: 参考SystemContext.java
- 往ThreadLocal中赋值:参考PagerFilter.java
- 从ThreadLocal中获取分页参数:参考AbstractManager.java


package com.xwj.oa.pageSearch;
import java.util.List;

import org.hibernate.Query;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.xwj.oa.utils.SystemException;



public class AbstractManager extends HibernateDaoSupport {
	
	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,int offset,int pagesize){
		return  searchPaginated ( hql,null,offset,pagesize);
	}

	
/**
 * 
 * @param hql
 * @param params
 * @param offset
 * @param pagesize  
 * @return
 */
	public pagerModel searchPaginated (String hql,Object[] params,int offset,int pagesize){
		
		String countHql = this.getCountQuery(hql);
		Query query = this.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 = this.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.setDatas(datas);
		pm.setTotal(total);
		
		return pm;
		
		
	}
	
	private String getCountQuery(String hql){
		int index = hql.indexOf("from");
		if(index != -1){
			String countQuery = "select count(*) "+" "+hql.substring(index);
			return countQuery;
		}
		throw new SystemException("无效的HQL查询");
	}
}



package com.xwj.oa.pageSearch;

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.intValue();
	}
	
	public static void setOffset(int offsetValue){
			offset.set(new Integer(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.intValue();
	}
	
	public static void setPagesize(int pagesizeValue){
		pagesize.set(new Integer(pagesizeValue));
	}
	
	public static void removePagesize(){
		pagesize.remove();
	}

}



package com.xwj.oa.pageSearch;

import java.util.List;

public class pagerModel {
	/**
	 * 总记录数
	 */
	private int total;

	/**
	 * 当前的结果集
	 */
	private List datas;

	public int getTotal() {
		return total;
	}

	public void setTotal(int total) {
		this.total = total;
	}

	public List getDatas() {
		return datas;
	}

	public void setDatas(List datas) {
		this.datas = datas;
	}
}


package com.xwj.oa.pageSearch;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;



public class PagerFilter implements Filter {

	public void destroy() {

	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		
		HttpServletRequest httpRequest = (HttpServletRequest)request;
		SystemContext.setOffset(this.getOffset(httpRequest));
		SystemContext.setPagesize(this.getPagesize(httpRequest));
		
		try{
		chain.doFilter(request, response);
		}finally{
			SystemContext.removeOffset();
			SystemContext.removePagesize();
		}

	}
	
	private int getOffset(HttpServletRequest httpRequest){
		int offset = 0 ;
		try{
			offset=Integer.parseInt(httpRequest.getParameter("pager.offset"));
		}catch(NumberFormatException ignore){
			
		}
		return offset;
	}
	
	private int getPagesize(HttpServletRequest httpRequest){
		
		return 10;
	}

	public void init(FilterConfig arg0) throws ServletException {

	}

}


上面写了一个fileter,因此要在web-xml中作相应的配置
<!-- pagerFileter -->
	<filter>
		<filter-name>PagerFilter</filter-name>
		<filter-class>com.xwj.oa.pageSearch.PagerFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>PagerFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>



public class OrgManagerImpl extends AbstractManager implements OrgManager {
	public PagerModel findOrgs(int parentId) {
		
		//如果parentId=0,则查找顶级机构列表
		if(parentId == 0){
			return searchPaginated("from Orgnization o where o.parent is null");
		}
		return searchPaginated("from Orgnization o where o.parent.id = ?", parentId);
	} 
}



public class OrgAction extends DispatchAction {

	private OrgManager orgManager;
	
	/**
	 * 打开机构管理主界面
	 */
	@Override
	protected ActionForward unspecified(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		OrgActionForm oaf = (OrgActionForm)form;

		request.setAttribute("pm",
			orgManager.findOrgs(oaf.getParentId())
		);		
	}	
}




<pg:pager url="org.do" items="${pm.total }" maxPageItems="10" 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>
分享到:
评论

相关推荐

    使用pager-taglib分页完整例子

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

    pager-taglib 分页扩展实例

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

    pager-taglib分页jar包

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

    pager-taglib分页标签

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

    pager-taglib分页组建

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

    Pager-taglib页面分页示例

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

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

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

    pager-taglib源码

    这是pager-taglib的官方源码,但在采用官方的pager-taglib分页传输中文参数会出现乱码,所以我采用maven新建一个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分页标签。

    jsp pager-taglib分页资料

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

    pager-taglib分页要点

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

    pager-taglib-2.0及使用方法

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

    pager-taglib.jar

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

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

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

    pager-taglib分页方法

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

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

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

    pager-taglib.jar包下载

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

Global site tag (gtag.js) - Google Analytics