在项目中需加入pager-taglib.jar public class Pager { private int total; private List<Organization> list; public int getTotal() { return total; } public void setTotal(int total) { this.total = total; } public List<Organization> getList() { return list; } public void setList(List<Organization> list) { this.list = list; } } 使用ThreadLocal public class PageContext { //ThreadLocal 线程局部变量,就是为每一个使用该变量的线程提供一个局部的变量值的副本,每个线程都可以独立的改变该线程的变量副本, //而不会和其它线程的副本冲突,也就是在分页的页面中用户可以根据自己的设置任意改变每页的显示的记录数而不会影响到其他用户浏览数据显示 private static ThreadLocal<Integer> offset = new ThreadLocal<Integer>(); private static ThreadLocal<Integer> pagesize = new ThreadLocal<Integer>(); public static int getOffset() { Integer os = offset.get(); System.out.println("os:" + os); if(os == null) { return 0; } return os; //返回当前线程所对应的线程局部变量offset } public static void setOffset(int offsetValue) { offset.set(offsetValue); //设置当前线程局部变量offset的值 } public static void removeOffset() { offset.remove(); } public static int getPagesize() { Integer ps = pagesize.get(); System.out.println("ps:" + ps); if(ps == null) { return Integer.MAX_VALUE; //如果没有设置pagesize则显示一页 } return ps; } public static void setPagesize(int pagesizeValue) { pagesize.set(pagesizeValue); } public static void removePagesize() { /** * 将当前线程局部变量的值删除,目的是为了减少内存的占用, * */ offset.remove(); pagesize.remove(); } } 分页拦截器类pagefilter: public class PageFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) arg0; PageContext.setOffset(this.getOffset(request)); PageContext.setPagesize(this.getPagesize(request)); try { arg2.doFilter(arg0, arg1); } finally { //清空 PageContext.removeOffset(); PageContext.removePagesize(); } } protected int getOffset(HttpServletRequest request) { int offset = 0; String str = request.getParameter("pager.offset"); // 从request请求中获取当前页查询的首记录数 if (str != null) offset = Integer.valueOf(str).intValue(); else { offset = 0; } return offset; } protected int getPagesize(HttpServletRequest request) { return 5; //每页显示5行 } public void init(FilterConfig arg0) throws ServletException { } } /** * 抽象分页 * @author Administrator * */ public class AbstarctPagerManager extends HibernateDaoSupport{ public Pager searchPage(String hql) { return this.searchPage(hql, null, PageContext.getOffset(), PageContext .getPagesize()); } public Pager searchPage(String hql, Object param) { return this.searchPage(hql, new Object[] { param }, PageContext .getOffset(), PageContext.getPagesize()); } public Pager searchPage(String hql, Object[] params) { return this.searchPage(hql, params, PageContext.getOffset(), PageContext.getPagesize()); } //没有 public Pager searchPage(String hql,int offset,int pagesize){ return this.searchPage(hql,null, offset, pagesize); } //只有单个 public Pager searchPage(String hql,Object object,int offset,int pagesize){ return this.searchPage(hql,new Object[]{object}, offset, pagesize); } @SuppressWarnings("unchecked") public Pager searchPage(String hql,Object[] params,int offset,int pagesize){ //查询总记录数 String countHql=this.getCountHql(hql); Query query=this.getSession().createQuery(countHql); if(query!=null && 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(query!=null && 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<Organization> list=query.list(); Pager pm=new Pager(); pm.setList(list); pm.setTotal(total); return pm; } private String getCountHql(String hql){ int index=hql.indexOf("from"); if (index!=-1) { return "select count(*)"+hql.substring(index);//select count(*) from } throw new RuntimeException("语句出错"); } } /*接口的实现*/ public class OrgManagerImpl extends AbstarctPagerManager implements OrgManager { @SuppressWarnings("unchecked") /** * 分页 */ public Pager findOrgs(int parentId) { if (parentId==0) { return this.searchPaer("from Organization o where o.parent is null"); } return this.searchPaer("from Organization o where o.parent.id=?",parentId); } } /*action的实现*/ public class OrgAction extends ActionSupport { private int parentId; private OrgManager orgManager; public String execute(){ Pager pm=orgManager.findOrgs(parentId); ServletActionContext.getRequest().setAttribute("pm", pm); ServletActionContext.getRequest().setAttribute("parentId", parentId); return SUCCESS; } web.xml: 在监听器后面加入下段 <!-- 防止中文乱码 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class> org.springframework.web.filter.CharacterEncodingFilter </filter-class> <init-param> <param-name>encoding</param-name> <param-value>GBK</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>pageFilter</filter-name> <filter-class> com.page.PageFilter </filter-class> </filter> <filter-mapping> <filter-name>pageFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 接下来是jsp页面 这里用到了jstl的部分内容: <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="pg" uri="http://jsptags.com/tags/navigation/pager" %> <%@ taglib prefix="bean" uri="/struts-tags" %> <table width="778" border="0" cellPadding="0" cellSpacing="1" bgcolor="#6386d6"> <!-- 列表标题栏 --> <tr bgcolor="#EFF3F7" class="TableBody1"> <td width="5%" height="37" align="center"><b>序号</b></td> <td width="18%" height="37" align="center"><B>机构名称</B></td> <td width="18%" height="37" align="center"><b>机构编号</b></td> <td width="18%" height="37" align="center"><b>相关操作</b></td> </tr> <!-- 列表数据栏 --> <bean:if test="#request.pm.list!=null"> <bean:iterator value="#request.pm.list"> <tr bgcolor="#EFF3F7" class="TableBody1" οnmοuseοver="this.bgColor = '#DEE7FF';" οnmοuseοut="this.bgColor='#EFF3F7';"> <td align="center" vAlign="middle">${id }</td> <td align="center" vAlign="middle"><a href="org.action?parentId=${id }">${name }</a></td> <td align="center" vAlign="middle">${sn }</td> <td align="center" vAlign="middle"> <a href="#" οnclick="del('del.action?id=${id }');">删除</a></td> </tr> </bean:iterator> </bean:if> <!-- 在列表数据为空的时候,要显示的提示信息 --> <c:if test="${empty pm.list}"> <tr> <td colspan="7" align="center" bgcolor="#EFF3F7" class="TableBody1" οnmοuseοver="this.bgColor = '#DEE7FF';" οnmοuseοut="this.bgColor='#EFF3F7';"> 没有找到相应的记录 </td> </tr> </c:if> </table> <pg:pager url="org.action" items="${pm.total }" export="currentPageNumber=pageNumber" maxPageItems="5" isOffset="true"> <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> 至此分页代码写完了