锁定老帖子 主题:SSH pager-taglib分页的实现
精华帖 (0) :: 良好帖 (0) :: 新手帖 (4) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2008-12-16
最后修改:2009-04-02
况且本人文笔不是很好,误怪! 这个是我个人对分页的解决方案,其实就是在数据库底层做了分页查询 这套解决方案,是按照MVC的模式来做的,基于STRUTS框架。分为三个部分,表现层用的是JSP,其中用了JSTL和pager taglib做分页;控制层就是用的很传统的Action;底层就用的是Spring+Hibernate。下面分三个部分慢慢说: 说到分页: 1 首先新建一个PageModel类 package com.dengmin.oa.utils; import java.util.List; public class PageModel { /** * 总记录数 */ private int total; /** * 当前页的记录集 */ private List datas; public List getDatas() { return datas; } public void setDatas(List datas) { this.datas = datas; } public int getTotal() { return total; } public void setTotal(int total) { this.total = total; } } 2 底层是基于Spring+Hibernate来做的。在DAO这一层,为其增加两个方法,底层的分页查询用的是Hibernate提供的分页查询。 public interface UserDao { public void addUser(User user); /** * * @param offset 从第几条记录开始查询 * @param pagesize 每页显示多少条记录 * @return */ public PageModel findAllUser(int offset, int pagesize); } 3 UserDao的实现类 public class UserDaoImpl extends HibernateDaoSupport implements UserDao { public void addUser(User user) { this.getHibernateTemplate().save(user); } public PageModel findAllUser(int offset, int pagesize) { //得到总记录数 String queryCountHql = "select count(*) from User"; Query query = getSession().createQuery(queryCountHql); int total = ((Long)query.uniqueResult()).intValue(); List datas = getSession().createQuery("from User") .setFirstResult(offset) .setMaxResults(pagesize) .list(); //得到结果集 PageModel pm = new PageModel(); pm.setTotal(total); pm.setDatas(datas); return pm; } } ok!底层的实现工作就做好了 在控制层中UserAction从DispatchAction继承重写它的unspecified方法 通过spring注入UserDao 代码如下: public class UserAction extends DispatchAction { private UserDao userDao; @Override protected ActionForward unspecified(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { int offset = 0; try { offset = Integer.parseInt(request.getParameter("pager.offset")); } catch (Exception e) { } //这里我按照每页显示10条 PageModel pm = userDao.findAllUser(offset, 10); request.setAttribute("pm", pm); return mapping.findForward("success"); } public void setUserDao(UserDao userDao) { this.userDao = userDao; } } spring中的配置如下 <!-- 配置sessionFactory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation"> <value>classpath:hibernate.cfg.xml</value> </property> </bean> <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean> <!-- 配置事务的传播特性 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="*" propagation="REQUIRED" /> </tx:attributes> </tx:advice> <bean id="userDao" class="com.dengmin.pager.dao.UserDaoImpl"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <bean name="/userManager" class="com.dengmin.pager.actions.UserAction" scope="prototype"> <property name="userDao" ref="userDao" /> </bean> 最后是jsp页面做数据显示 这里采用了jstl和pager-taglib的标签库 首先将其引入: <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="pg" uri="http://jsptags.com/tags/navigation/pager" %> <body> <h1>User Manager</h1> <hr/> <table width="778" border="0" cellPadding="0" cellSpacing="1" bgcolor="#6386d6"> <tr bgcolor="#EFF3F7"> <TD align="center">ID</TD> <TD align="center">名称</TD> <TD align="center">密码</TD> <TD align="center">地址</TD> <TD align="center">创建时间</TD> <TD align="center">相关操作</TD> </tr> <c:if test="${!empty pm.datas}"> <c:forEach items="${pm.datas}" var="user"> <tr bgcolor="#EFF3F7"> <td align="center">${user.id }</td> <td align="center">${user.username }</td> <td align="center">${user.password}</td> <td align="center">${user.address}</td> <td align="center">${user.createTime }</td> <td align="center"> 修改 删除</td> </tr> </c:forEach> </c:if> <c:if test="${empty pm.datas}"> <tr> <td colspan="5" align="center" bgcolor="#EFF3F7"> 没有找到相应的记录 </td> </tr> </c:if> </table> <pg:pager url="userManager.do" items="${pm.total}" export="currentPageNumber=pageNumber"> <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> </body> 预览效果: 最后附上pager-taglib的使用方法 pg:pager【这个标签用来设置分页的总体参数】重要参数说明: url:分页的链接根地址,pager标签会在这个链接的基础上附加分页参数 items:总记录数,pager标签正是根据这个值来计算分页参数的 maxPageItems:每页显示的行数,默认为10 maxIndexPages:在循环输出页码的时候,最大输出多少个页码,默认是10 pg:first【第一页的标签】重要参数说明: export变量的意义: pageUrl - 分页链接URL地址(最重要的export参数) pageNumber - 页码 firstItem - 首页第一行的索引值 lastItem - 首页最后一行的索引值 pg:pre【上一页标签】重要参数说明: export变量的意义: pageUrl - 分页链接URL地址(最重要的export参数) pageNumber - 页码 firstItem - 前页第一行的索引值 lastItem - 前页最后一行的索引值 pg:next【下一页标签】重要参数说明: export变量的意义: pageUrl - 分页链接URL地址(最重要的export参数) pageNumber - 页码 firstItem - 下页第一行的索引值 lastItem - 下页最后一行的索引值 pg:last重要参数说明: export变量的意义: pageUrl - 分页链接URL地址(最重要的export参数) pageNumber - 页码 firstItem - 尾页第一行的索引值 lastItem - 尾页最后一行的索引值 pg:pages【这个标签用来循环输出页码信息】重要参数说明: export变量的意义: pageUrl - 分页链接URL地址(最重要的export参数) pageNumber - 页码 firstItem - pageNumber这个页码指定的那一页的第一行的索引值 lastItem - pageNumber这个页码指定的那一页的最后一行的索引值 源代码前两天已经上传过了需要的到这里下载http://minzaipiao.iteye.com/blog/293480 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-01-04
哇,正是我想要的,内容详细,通俗易懂。真是太谢谢兄弟了!
|
|
返回顶楼 | |
发表时间:2009-01-21
能理解,不过可以做成通用的分页吗?
|
|
返回顶楼 | |
发表时间:2009-06-06
谢谢楼主分享,代码下载过了,也运行过了,虽然代码不多,不过还是学到了不少的新东西,给楼主提个问题,我下载了该代码在运行实例时,出现了一点问题,如果将pagesize参数设置为10,则能够正常分页,但是如果将pagesize参数设置为其他的值(除了10以外的任何值)分页会有问题,不知道楼主是否做过测试?
该控件的<pg:pager>中有一个属性maxPageItems,默认值为10,楼主已经贴出来了,所以当你的pagesize参数的值不是10的时候,而该控件中的maxPageItems属性默认还是10,这时的分页显示就会出现问题,所以当改变每页显示条数的时候需要更改maxPageItems属性!~请楼主测试一下! |
|
返回顶楼 | |
发表时间:2009-06-07
这个好像只能设置为10
设置其他的要出问题 楼主是怎么解决的 |
|
返回顶楼 | |
发表时间:2009-06-09
楼主是不是把那个 自定义的.tld文件 做成jar包了
|
|
返回顶楼 | |
发表时间:2009-06-11
wussrc 写道 谢谢楼主分享,代码下载过了,也运行过了,虽然代码不多,不过还是学到了不少的新东西,给楼主提个问题,我下载了该代码在运行实例时,出现了一点问题,如果将pagesize参数设置为10,则能够正常分页,但是如果将pagesize参数设置为其他的值(除了10以外的任何值)分页会有问题,不知道楼主是否做过测试? 该控件的<pg:pager>中有一个属性maxPageItems,默认值为10,楼主已经贴出来了,所以当你的pagesize参数的值不是10的时候,而该控件中的maxPageItems属性默认还是10,这时的分页显示就会出现问题,所以当改变每页显示条数的时候需要更改maxPageItems属性!~请楼主测试一下! 是的 你设置了maxPageItems=10 但是在后台的UserAction里我指设置我每夜显示10条 //这里我按照每页显示10条 PageModel pm = userDao.findAllUser(offset, 10); |
|
返回顶楼 | |
发表时间:2009-11-19
楼主的代码,我已经成功运行了,写的不错,谢谢了.
|
|
返回顶楼 | |
发表时间:2009-11-19
这贴我收藏了,谢谢了!!
|
|
返回顶楼 | |
发表时间:2009-11-20
挺不错的,不过分页楼主的配置太复杂了,想象一下每个页面都弄那么大量的代码是没有必要的。
分页我也设计过,感觉要更简洁一些,看看这种方法思路是否有用:http://www.guzz.org/wiki/TagLib#%E7%BF%BB%E9%A1%B5%E6%9F%A5%E8%AF%A2 |
|
返回顶楼 | |