- 浏览: 104813 次
- 性别:
- 来自: 南充
最新评论
-
zhangzi:
你这是hibernate hql分页
hibernate SQL 分页查询 -
edwardjj1234:
listMyArticle.action这个文件能否说明一下? ...
ssh2分页例子 -
edwardjj1234:
前台页面显示不用c;foreach吗?是在哪里控制页面输出数量 ...
ssh2分页例子 -
yangqjiayou:
大哥,代码传给我一份呗,加上数据库文件哈,谢谢啦3466598 ...
ssh2分页例子 -
wangshunfan:
楼主,在MemberDaoImpl类中
return getH ...
ssh2分页例子
分页显示一直是web开发中一大烦琐的难题,传统的网页设计只在一个JSP或者ASP页面中书写所有关于数据库操作的代码,那样做分页可能简单一点,但当把网站分层开发后,分页就比较困难了,下面是我做Spring+Hibernate+Struts2项目时设计的分页代码,与大家分享交流。
1、DAO层接口的设计,在MemberDao接口中定义了如下两个方法:
- public interface MemberDao{
- //省略了其他的代码
- /** *//**
- * 分页查询
- * @param hql 查询的条件
- * @param offset 开始记录
- * @param length 一次查询几条记录
- * @return
- */
- public List queryForPage(final String hql,final int offset,final int length);
- /** *//**
- * 查询所有记录数
- * @param hql 查询的条件
- * @return 总记录数
- */
- public int getAllRowCount(String hql);
- }
public interface MemberDao{ //省略了其他的代码 /** *//** * 分页查询 * @param hql 查询的条件 * @param offset 开始记录 * @param length 一次查询几条记录 * @return */ public List queryForPage(final String hql,final int offset,final int length); /** *//** * 查询所有记录数 * @param hql 查询的条件 * @return 总记录数 */ public int getAllRowCount(String hql); }
- 2、DAO层实现类MemberDaoImpl对上面两个方法的实现如下:
- public class MemberDaoImpl extends HibernateDaoSupport implements MemberDao {
- //省略了其他的代码
- /** *//**
- * 分页查询
- * @param hql 查询的条件
- * @param offset 开始记录
- * @param length 一次查询几条记录
- * @return
- */
- public List queryForPage(final String hql,final int offset,final int length){
- List list = getHibernateTemplate().executeFind(new HibernateCallback(){
- public Object doInHibernate(Session session) throws HibernateException,SQLException{
- Query query = session.createQuery(hql);
- query.setFirstResult(offset);
- query.setMaxResults(length);
- List list = query.list();
- return list;
- }
- });
- return list;
- }
- /** *//**
- * 查询所有记录数
- * @return 总记录数
- */
- public int getAllRowCount(String hql){
- return getHibernateTemplate().find(hql).size();
- }
- }
2、DAO层实现类MemberDaoImpl对上面两个方法的实现如下: public class MemberDaoImpl extends HibernateDaoSupport implements MemberDao { //省略了其他的代码 /** *//** * 分页查询 * @param hql 查询的条件 * @param offset 开始记录 * @param length 一次查询几条记录 * @return */ public List queryForPage(final String hql,final int offset,final int length){ List list = getHibernateTemplate().executeFind(new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException,SQLException{ Query query = session.createQuery(hql); query.setFirstResult(offset); query.setMaxResults(length); List list = query.list(); return list; } }); return list; } /** *//** * 查询所有记录数 * @return 总记录数 */ public int getAllRowCount(String hql){ return getHibernateTemplate().find(hql).size(); } }
细心的读者会发现,这个类继承了HibernateDaoSupport类,HibernateDaoSupport是Spring提供的对Hibernate支持的类,getHibernateTemplate().executeFind(new HibernateCallback(){....})方法中的参数,我们使用了接口回调,在其参数内,我们能像原生的Hibernate一样调用query.setFirstResult(offset)和query.setMaxResults(length)来实现分页查询功能。
3、下面我们来新建一个保存分页信息的类PageBean,具体代码如下:
- public class PageBean {
- private List list; //要返回的某一页的记录列表
- private int allRow; //总记录数
- private int totalPage; //总页数
- private int currentPage; //当前页
- private int pageSize; //每页记录数
- private boolean isFirstPage; //是否为第一页
- private boolean isLastPage; //是否为最后一页
- private boolean hasPreviousPage; //是否有前一页
- private boolean hasNextPage; //是否有下一页
- public List getList() {
- return list;
- }
- public void setList(List list) {
- this.list = list;
- }
- public int getAllRow() {
- return allRow;
- }
- public void setAllRow(int allRow) {
- this.allRow = allRow;
- }
- public int getTotalPage() {
- return totalPage;
- }
- public void setTotalPage(int totalPage) {
- this.totalPage = totalPage;
- }
- public int getCurrentPage() {
- return currentPage;
- }
- public void setCurrentPage(int currentPage) {
- this.currentPage = currentPage;
- }
- public int getPageSize() {
- return pageSize;
- }
- public void setPageSize(int pageSize) {
- this.pageSize = pageSize;
- }
- /** *//**
- * 初始化分页信息
- */
- public void init(){
- this.isFirstPage = isFirstPage();
- this.isLastPage = isLastPage();
- this.hasPreviousPage = isHasPreviousPage();
- this.hasNextPage = isHasNextPage();
- }
- /** *//**
- * 以下判断页的信息,只需getter方法(is方法)即可
- * @return
- */
- public boolean isFirstPage() {
- return currentPage == 1; // 如是当前页是第1页
- }
- public boolean isLastPage() {
- return currentPage == totalPage; //如果当前页是最后一页
- }
- public boolean isHasPreviousPage() {
- return currentPage != 1; //只要当前页不是第1页
- }
- public boolean isHasNextPage() {
- return currentPage != totalPage; //只要当前页不是最后1页
- }
- /** *//**
- * 计算总页数,静态方法,供外部直接通过类名调用
- * @param pageSize 每页记录数
- * @param allRow 总记录数
- * @return 总页数
- */
- public static int countTotalPage(final int pageSize,final int allRow){
- int totalPage = allRow % pageSize == 0 ? allRow/pageSize : allRow/pageSize+1;
- return totalPage;
- }
- /** *//**
- * 计算当前页开始记录
- * @param pageSize 每页记录数
- * @param currentPage 当前第几页
- * @return 当前页开始记录号
- */
- public static int countOffset(final int pageSize,final int currentPage){
- final int offset = pageSize*(currentPage-1);
- return offset;
- }
- /** *//**
- * 计算当前页,若为0或者请求的URL中没有"?page=",则用1代替
- * @param page 传入的参数(可能为空,即0,则返回1)
- * @return 当前页
- */
- public static int countCurrentPage(int page){
- final int curPage = (page==0?1:page);
- return curPage;
- }
- }
public class PageBean { private List list; //要返回的某一页的记录列表 private int allRow; //总记录数 private int totalPage; //总页数 private int currentPage; //当前页 private int pageSize; //每页记录数 private boolean isFirstPage; //是否为第一页 private boolean isLastPage; //是否为最后一页 private boolean hasPreviousPage; //是否有前一页 private boolean hasNextPage; //是否有下一页 public List getList() { return list; } public void setList(List list) { this.list = list; } public int getAllRow() { return allRow; } public void setAllRow(int allRow) { this.allRow = allRow; } public int getTotalPage() { return totalPage; } public void setTotalPage(int totalPage) { this.totalPage = totalPage; } public int getCurrentPage() { return currentPage; } public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } /** *//** * 初始化分页信息 */ public void init(){ this.isFirstPage = isFirstPage(); this.isLastPage = isLastPage(); this.hasPreviousPage = isHasPreviousPage(); this.hasNextPage = isHasNextPage(); } /** *//** * 以下判断页的信息,只需getter方法(is方法)即可 * @return */ public boolean isFirstPage() { return currentPage == 1; // 如是当前页是第1页 } public boolean isLastPage() { return currentPage == totalPage; //如果当前页是最后一页 } public boolean isHasPreviousPage() { return currentPage != 1; //只要当前页不是第1页 } public boolean isHasNextPage() { return currentPage != totalPage; //只要当前页不是最后1页 } /** *//** * 计算总页数,静态方法,供外部直接通过类名调用 * @param pageSize 每页记录数 * @param allRow 总记录数 * @return 总页数 */ public static int countTotalPage(final int pageSize,final int allRow){ int totalPage = allRow % pageSize == 0 ? allRow/pageSize : allRow/pageSize+1; return totalPage; } /** *//** * 计算当前页开始记录 * @param pageSize 每页记录数 * @param currentPage 当前第几页 * @return 当前页开始记录号 */ public static int countOffset(final int pageSize,final int currentPage){ final int offset = pageSize*(currentPage-1); return offset; } /** *//** * 计算当前页,若为0或者请求的URL中没有"?page=",则用1代替 * @param page 传入的参数(可能为空,即0,则返回1) * @return 当前页 */ public static int countCurrentPage(int page){ final int curPage = (page==0?1:page); return curPage; } }
4、Service层接口的设计:
- public interface MemberService {
- //省略其他的代码
- /** *//**
- * 分页查询
- * @param currentPage 当前第几页
- * @param pageSize 每页大小
- * @return 封闭了分页信息(包括记录集list)的Bean
- */
- public PageBean queryForPage(int pageSize,int currentPage);
- }
public interface MemberService { //省略其他的代码 /** *//** * 分页查询 * @param currentPage 当前第几页 * @param pageSize 每页大小 * @return 封闭了分页信息(包括记录集list)的Bean */ public PageBean queryForPage(int pageSize,int currentPage); }
5、Service层实现类的部分内码如下:
- public class MemberServiceImpl implements MemberService {
- //通过applicationContext.xml配置文件注入MemberDao的值
- private MemberDao memberDao;
- public void setMemberDao(MemberDao memberDao) {
- this.memberDao = memberDao;
- }
- /** *//**
- * 分页查询
- * @param currentPage 当前第几页
- * @param pageSize 每页大小
- * @return 封闭了分页信息(包括记录集list)的Bean
- */
- public PageBean queryForPage(int pageSize,int page){
- final String hql = "from Member"; //查询语句
- int allRow = memberDao.getAllRowCount(hql); //总记录数
- int totalPage = PageBean.countTotalPage(pageSize, allRow); //总页数
- final int offset = PageBean.countOffset(pageSize, page); //当前页开始记录
- final int length = pageSize; //每页记录数
- final int currentPage = PageBean.countCurrentPage(page);
- List<Member> list = memberDao.queryForPage(hql,offset, length); //"一页"的记录
- //把分页信息保存到Bean中
- PageBean pageBean = new PageBean();
- pageBean.setPageSize(pageSize);
- pageBean.setCurrentPage(currentPage);
- pageBean.setAllRow(allRow);
- pageBean.setTotalPage(totalPage);
- pageBean.setList(list);
- pageBean.init();
- return pageBean;
- }
public class MemberServiceImpl implements MemberService { //通过applicationContext.xml配置文件注入MemberDao的值 private MemberDao memberDao; public void setMemberDao(MemberDao memberDao) { this.memberDao = memberDao; } /** *//** * 分页查询 * @param currentPage 当前第几页 * @param pageSize 每页大小 * @return 封闭了分页信息(包括记录集list)的Bean */ public PageBean queryForPage(int pageSize,int page){ final String hql = "from Member"; //查询语句 int allRow = memberDao.getAllRowCount(hql); //总记录数 int totalPage = PageBean.countTotalPage(pageSize, allRow); //总页数 final int offset = PageBean.countOffset(pageSize, page); //当前页开始记录 final int length = pageSize; //每页记录数 final int currentPage = PageBean.countCurrentPage(page); List<Member> list = memberDao.queryForPage(hql,offset, length); //"一页"的记录 //把分页信息保存到Bean中 PageBean pageBean = new PageBean(); pageBean.setPageSize(pageSize); pageBean.setCurrentPage(currentPage); pageBean.setAllRow(allRow); pageBean.setTotalPage(totalPage); pageBean.setList(list); pageBean.init(); return pageBean; }
6、在Struts2中调用queryForPageMemberService层的queryForPage()方法即可return一个包含分页信息、符合条件的结果集list, 代码如下:
- public class ListMember extends ActionSupport{
- //通过applicationContext.xml配置文件注入memberService的值
- private MemberService memberService;
- public void setMemberService(MemberService memberService) {
- this.memberService = memberService;
- }
- private int page; //第几页
- private PageBean pageBean; //包含分布信息的bean
- public int getPage() {
- return page;
- }
- public void setPage(int page) { //若URL中无此参数,会默认为第1页
- this.page = page;
- }
- public PageBean getPageBean() {
- return pageBean;
- }
- public void setPageBean(PageBean pageBean) {
- this.pageBean = pageBean;
- }
- @Override
- public String execute() throws Exception {
- //分页的pageBean,参数pageSize表示每页显示记录数,page为当前页
- this.pageBean = memberService.queryForPage(2, page);
- return SUCCESS;
- }
- }
public class ListMember extends ActionSupport{ //通过applicationContext.xml配置文件注入memberService的值 private MemberService memberService; public void setMemberService(MemberService memberService) { this.memberService = memberService; } private int page; //第几页 private PageBean pageBean; //包含分布信息的bean public int getPage() { return page; } public void setPage(int page) { //若URL中无此参数,会默认为第1页 this.page = page; } public PageBean getPageBean() { return pageBean; } public void setPageBean(PageBean pageBean) { this.pageBean = pageBean; } @Override public String execute() throws Exception { //分页的pageBean,参数pageSize表示每页显示记录数,page为当前页 this.pageBean = memberService.queryForPage(2, page); return SUCCESS; } }
7、最后在listMember.jsp页面中,用到了Struts2标签:
- <s:iterator value="pageBean.list">
- <s:property value="title"/>
- <a href="getArticle.action?id=<s:property value="id"/>">modify</a>
- <a href="deleteArticle.action?id=<s:property value="id"/>" onclick="return askDel()"/>delete</a><br/>
- </s:iterator>
- 共<s:property value="pageBean.allRow"/> 条记录
- 共<s:property value="pageBean.totalPage"/> 页
- 当前第<s:property value="pageBean.currentPage"/>页<br/>
- <s:if test="%{pageBean.currentPage == 1}">
- 第一页 上一页
- </s:if>
- <s:else>
- <a href="listMyArticle.action?page=1">第一页</a>
- <a href="listMyArticle.action?page=<s:property value="%{pageBean.currentPage-1}"/>">上一页</a>
- </s:else>
- <s:if test="%{pageBean.currentPage != pageBean.totalPage}">
- <a href="listMyArticle.action?page=<s:property value="%{pageBean.currentPage+1}"/>">下一页</a>
- <a href="listMyArticle.action?page=<s:property value="pageBean.totalPage"/>">最后一页</a>
- </s:if>
- <s:else>
- 下一页 最后一页
- </s:else>
<s:iterator value="pageBean.list"> <s:property value="title"/> <a href="getArticle.action?id=<s:property value="id"/>">modify</a> <a href="deleteArticle.action?id=<s:property value="id"/>" onclick="return askDel()"/>delete</a><br/> </s:iterator> 共<s:property value="pageBean.allRow"/> 条记录 共<s:property value="pageBean.totalPage"/> 页 当前第<s:property value="pageBean.currentPage"/>页<br/> <s:if test="%{pageBean.currentPage == 1}"> 第一页 上一页 </s:if> <s:else> <a href="listMyArticle.action?page=1">第一页</a> <a href="listMyArticle.action?page=<s:property value="%{pageBean.currentPage-1}"/>">上一页</a> </s:else> <s:if test="%{pageBean.currentPage != pageBean.totalPage}"> <a href="listMyArticle.action?page=<s:property value="%{pageBean.currentPage+1}"/>">下一页</a> <a href="listMyArticle.action?page=<s:property value="pageBean.totalPage"/>">最后一页</a> </s:if> <s:else> 下一页 最后一页 </s:else>
到这里,Hibernate+Spring+Struts2整合开发中的分页问题就已经解决了,在我上述过程中,省略了许多Hibernate,Spring,Struts2的配置,那不是本文的重点,大家可以参考有关的书与资料,由于篇幅有限,在此就不一一列举。在以后的文章中,我也会详细地跟大家讲述SSH整合开发。
评论
return getHibernateTemplate().find(hql).size(); 方法,如果数据量一大,就会出现溢出报错的后果。
final String hql = "from Member"; 会把整一个数据库都查出来。小数量查询就没有问题的。谢谢啦。
上一页 1 2 3 4 5 下一页 中间的“1 2 3 4 5”你写哪了?能把那一块写一下吗?
联系:liuyang-1989xy@163.com
发表评论
-
江哥读:创业者必看(马云语录)
2011-05-22 11:16 915不要因为别人的一句话 ... -
LOG4J的配置..实现了输出到控制台、文件、回滚文件、发送日志邮件
2011-01-25 10:28 1406Log4J配置文件实现了输出到控制台、文件、回滚文件、发送 ... -
IE6中用了float:left之后导致margin-left双倍边距的BUG解决方法
2011-01-18 14:32 2781先看css代码:div { float:left; ... -
Hibernate三大类查询总结
2010-07-24 21:15 13926Hibernate目前总共分为三大类查询:cretiria, ... -
JAVA认证考试历年经典面试题目整理
2010-07-23 20:55 8561. java中的异常处理机制的简单和应用。 当Java程序 ... -
JAVA SSH框架
2010-07-23 20:53 2124JAVA SSH框架 JAVA SSH框架在Struts + ... -
Spring Security 安全框架
2010-06-02 13:19 883http://www.family168.com/oa/spr ... -
Eclipse快捷键
2010-05-27 09:52 785Eclipse 快捷键(1) Ctrl+1 快 ... -
Hibernate查询Query By Criterial
2010-05-25 19:35 1751提供的检索方式:(1) ... -
DispatchAction, LookupDispatchAction, MappingDispatchAction深入分析
2010-04-29 18:29 948首先我们来看一下它们三者之间的关系 java.lang.Obj ... -
FCKeditor在struts2中无法上传文件的解决办法
2010-03-31 20:44 1150最近有个项目使用struts2进行开发,同时使用了FCKEdi ... -
java备份和恢复mysql数据库
2010-02-27 12:00 1019package cwnu.cs.ncjzwms.utils; ... -
tomcat设置虚拟域名
2010-01-04 17:17 2160在$tomcat/webapps/下建了个myjsp目录作为我 ... -
mysql数据库同步
2009-12-24 17:16 12401、简要介绍:mysql从3.23.15版本以后提供数据库复制 ... -
http://fykyx521.javaeye.com/blog/517138
2009-11-17 10:20 732http://fykyx521.iteye.com/blog/ ... -
163编辑器
2009-10-31 20:50 1769163Editor编辑器的源代码 ... -
Flex 修改浏览器页面标题
2009-10-12 20:38 2966修改浏览器页面标题2009-01-16 16:23浏览器页面的 ... -
PHP连接数据库
2009-10-02 15:47 917<!DOCTYPE html PUBLIC " ... -
用Flex+Spring+Hibernate写一个登录
2009-09-25 11:26 20851下载支持文件flex-spring.zip 新建FlexL ... -
FLEX和Spring、Hibernate的集成 - Flex+Spring
2009-09-25 11:22 1194remoting-config.xml:<destina ...
相关推荐
SSH分页_完整例子 SSH分页_完整例子 SSH分页_完整例子
ssh分页例子ssh分页例子ssh分页例子ssh分页例子
SSH+ExtJs分页小例子
这是我的一个分页的小例子.以便不记得的时候使用
本资源主要为基于SSH2的分页查询技术,通过自己的测试,需要修改一些信息,使用HTML的onsubmit事件,.txt文档内从前台到后台的代码都有,是一个例子。
SSH 分页的例子源代码 全~~ 代码很全面了适合新手借鉴。但不支持完全的抄袭自己写还是最快的学习办法。
ssh框架模板例子代码,hibernate实现简单的分页技术。
直接导入后 对DAO在spring注入sessionFactory,然后在Action中可以进行简单的调用,测试测试例子都在代码main函数写好了,希望对大家有帮助
自己学习过程中参照网上资料写的一个SSH增删改查的小例子,还有分页功能。
Struts2+Spring2+hibernate3整合例子,包含mysql数据脚本,分页显示和jsp2.0 tag的使用
SSH用户登录注册分页增删改查,结合了SSH框架做的一个例子源码。
里面包含了普通分页和ajax分页,有源码例子,很容易看懂参考的例子
NULL 博文链接:https://aa00aa00.iteye.com/blog/734733
SSH三大主流框架的一个分例子,很不借。
ssh分页经典例子。只需在Action中设置每页显示行数,就可以了,很方便的,样式也很美观,类似于百度的分页。
这是一个关于SSH框架集合的分页技术,很不错
一个小例子,很适合初学者学习SSH2,对struts2.0+spring+Hibernate整合的一个用户管理的增删改查及分页的例子。 其中只要修改src.com.user.cfg配置文件下applicationContext-common.xml这个里面的oralce驱动,...
该压缩包有2个完整SSH1+SSH2例子可以供初学者参考,友情提示导入SSH1例子时在lib包中删除asm-2.2.3.jar, SSH2例子导入运行时删除xerces-2.6.2.jar和asm-2.2.3.jar,我试过了2个例子增删改查都没有问题,配置文件我都...
这是个我目前好的最好的分页,功能强大,使用简单,(实现了排序、过滤、查找)是一个真真的分页例子。
ssh1.ra和ssh2.rar两部分才组成SSH2,因为两部分一起超过10M不能上传,所以就分开的 博文链接:https://xuguiyi1000.iteye.com/blog/843128