- 浏览: 106968 次
- 性别:
- 来自: 南充
最新评论
-
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 994不要因为别人的一句话 ... -
LOG4J的配置..实现了输出到控制台、文件、回滚文件、发送日志邮件
2011-01-25 10:28 1432Log4J配置文件实现了输出到控制台、文件、回滚文件、发送 ... -
IE6中用了float:left之后导致margin-left双倍边距的BUG解决方法
2011-01-18 14:32 2820先看css代码:div { float:left; ... -
Hibernate三大类查询总结
2010-07-24 21:15 13990Hibernate目前总共分为三大类查询:cretiria, ... -
JAVA认证考试历年经典面试题目整理
2010-07-23 20:55 8781. java中的异常处理机制的简单和应用。 当Java程序 ... -
JAVA SSH框架
2010-07-23 20:53 2178JAVA SSH框架 JAVA SSH框架在Struts + ... -
Spring Security 安全框架
2010-06-02 13:19 964http://www.family168.com/oa/spr ... -
Eclipse快捷键
2010-05-27 09:52 830Eclipse 快捷键(1) Ctrl+1 快 ... -
Hibernate查询Query By Criterial
2010-05-25 19:35 1832提供的检索方式:(1) ... -
DispatchAction, LookupDispatchAction, MappingDispatchAction深入分析
2010-04-29 18:29 987首先我们来看一下它们三者之间的关系 java.lang.Obj ... -
FCKeditor在struts2中无法上传文件的解决办法
2010-03-31 20:44 1194最近有个项目使用struts2进行开发,同时使用了FCKEdi ... -
java备份和恢复mysql数据库
2010-02-27 12:00 1041package cwnu.cs.ncjzwms.utils; ... -
tomcat设置虚拟域名
2010-01-04 17:17 2193在$tomcat/webapps/下建了个myjsp目录作为我 ... -
mysql数据库同步
2009-12-24 17:16 12671、简要介绍:mysql从3.23.15版本以后提供数据库复制 ... -
http://fykyx521.javaeye.com/blog/517138
2009-11-17 10:20 788http://fykyx521.iteye.com/blog/ ... -
163编辑器
2009-10-31 20:50 1835163Editor编辑器的源代码 ... -
Flex 修改浏览器页面标题
2009-10-12 20:38 3006修改浏览器页面标题2009-01-16 16:23浏览器页面的 ... -
PHP连接数据库
2009-10-02 15:47 963<!DOCTYPE html PUBLIC " ... -
用Flex+Spring+Hibernate写一个登录
2009-09-25 11:26 21661下载支持文件flex-spring.zip 新建FlexL ... -
FLEX和Spring、Hibernate的集成 - Flex+Spring
2009-09-25 11:22 1233remoting-config.xml:<destina ...
相关推荐
这个例子中,"ssh分页例子_1"可能是一个包含源代码的文件,包含了上述各个部分的实现,如Action类、Service接口和实现、DAO接口和实现以及对应的JSP页面。通过对这些文件的分析和学习,你可以更好地理解SSH框架如何...
在这个"SSH分页_完整例子"中,我们将深入探讨如何在SSH框架下实现数据的分页显示。 分页是Web应用程序中常见的功能,它能帮助用户更有效地浏览和处理大量数据。SSH框架通过整合Spring的事务管理和Hibernate的ORM...
在这个"SSH+ExtJs分页小例子"中,我们将探讨如何将这两种技术结合实现数据分页显示。 首先,我们来看NewsDAO.java文件。这个文件包含了两个关键方法:`findPageAll`和`totalRecord`。`findPageAll`方法实现了分页...
在这个场景中,"ssh2实现查询分页"是指利用SSH2框架来实现数据的分页查询功能。分页是大型Web应用中常见的需求,它能有效地管理大量数据,提高用户体验,避免一次性加载所有数据导致的性能问题。 首先,我们从...
下面我们将以一个具体的例子来讲解SSH2中的分页实现过程。 ##### 1. DAO层接口设计 DAO层是直接与数据库打交道的一层,这里我们需要定义两个核心的方法:`queryForPage` 和 `getAllRowCount`。 ```java public ...
在这个名为"ssh.zip_SSH 数据分页_ssh分页实现"的压缩包中,我们可以看到一个关键的实践案例——如何在SSH框架下实现数据分页功能。数据分页在Web应用中极为重要,因为它能够帮助用户更有效地浏览大量信息,提高用户...
在这个SSH分页例子中,我们将探讨如何在SSH框架下实现数据的分页展示,包括普通分页和AJAX分页。 首先,让我们了解分页的基本概念。在Web应用中,当数据量较大时,一次性加载所有数据可能导致页面加载速度变慢,...
通过分析这个例子,你可以更深入地理解SSH分页的实现过程。 总之,SSH框架的分页功能是通过Struts2的控制,Spring的服务,以及Hibernate的数据访问共同协作完成的。理解并熟练掌握这一功能,能帮助开发者在实际项目...
在SSH2整合中,可以利用Struts2的拦截器或自定义标签库来实现分页。例如,开发一个分页拦截器,或者在JSP页面中使用Struts2的DisplayTag或JSTL标签进行分页展示。 **jsp2.0 tag的使用** 指的是使用JSP 2.0版本的...
### SSH2分页算法的实现 #### 一、概述 在`struts2+hibernate+spring`(简称SSH2)项目开发中,分页功能是常见的需求之一。通过合理的分页处理不仅可以提高用户体验,还能有效降低服务器的压力。本文将详细介绍...
本资源主要为基于SSH2的分页查询技术,通过自己的测试,需要修改一些信息,使用HTML的onsubmit事件,.txt文档内从前台到后台的代码都有,是一个例子。
在这个例子中,我们将探讨如何在SSH框架下实现分页查询功能,这对于处理大量数据的应用来说是非常重要的。 首先,让我们从Struts2开始。Struts2是MVC框架,负责处理HTTP请求并控制应用程序的流程。为了实现分页,...
综上所述,这个项目旨在展示SSH框架下如何实现数据库分页功能,涉及到的主要技术有Spring的依赖管理和事务控制、Struts2的请求处理和视图展示、Hibernate的对象关系映射以及Oracle数据库的查询操作。开发者可以通过...
在这个"SSH的增删改查小例子+分页功能"中,我们将探讨如何在SSH框架下实现基本的数据操作以及分页功能。 1. **Struts2**:Struts2是MVC(Model-View-Controller)设计模式的实现,负责处理HTTP请求并控制应用的流程...
在这个“ssh分页例子”中,我们将深入探讨SSH分页的工作原理以及如何在实际操作中使用它。 首先,SSH分页通常通过内置的分页器来实现,如`more`和`less`命令。当命令的输出过多,无法一次性完全显示在终端窗口时,...
直接导入后 对DAO在spring注入sessionFactory,然后在Action中可以进行简单的调用,测试测试例子都在代码main函数写好了,希望对大家有帮助
这个压缩包文件提供了一个SSH框架模板以及使用Hibernate实现的分页功能的例子代码。 **Struts2** 是一个MVC(Model-View-Controller)框架,负责处理HTTP请求,维护应用程序的业务逻辑和视图之间的分离。它通过...
为了实现SSH分页和局部刷新的自定义,你可以编写shell脚本或者alias,例如,在`.bashrc`或`.zshrc`文件中添加以下alias: ```bash alias sshview='ssh -T user@hostname "some_command" | less -FR' ``` 然后每次...
在这个“ssh增删改查+分页”的主题中,我们将深入探讨如何使用SSH2来实现数据库操作的基本功能,并结合分页技术进行数据展示。 首先,让我们关注SSH2中的"增"操作,即添加数据到数据库。这通常涉及编写一个Servlet...
SSH用户登录注册分页增删改查,结合了SSH框架做的一个例子源码。