struts+hibernate+spring

preview
需积分: 0 0 下载量 169 浏览量 更新于2012-03-20 收藏 49KB DOC 举报
### Struts2 + Hibernate + Spring 整合开发与分页方案详解 #### 一、概述 在企业级应用开发中,Struts2、Hibernate 和 Spring(通常简称为 SSH 框架)是三个非常重要的技术栈。它们各自解决不同的问题,并且通过良好的集成可以构建出高效、稳定的应用系统。本文将详细介绍如何在 Struts2 + Hibernate + Spring 的整合框架中实现分页功能。 #### 二、SSH框架简介 - **Struts2**:负责MVC模式中的控制器部分,提供丰富的标签库和拦截器机制,简化Web层开发。 - **Hibernate**:是一个强大的ORM(对象关系映射)框架,用于简化数据库操作,实现对象和关系型数据库之间的映射。 - **Spring**:作为依赖注入和面向切面编程的容器,管理应用程序的生命周期,同时也是连接其他两个框架的桥梁。 #### 三、分页方案设计 分页显示是Web开发中常见的需求之一,尤其在数据量较大时尤为重要。为了实现高效的分页处理,我们需要在SSH框架中进行合理的设计。 ##### 1. DAO层设计 在DAO层,我们定义了`MemberDao`接口,该接口包含了两个主要的方法: - `queryForPage`: 负责根据给定的HQL查询语句、起始位置和长度执行分页查询。 - `getAllRowCount`: 查询满足条件的所有记录总数。 ```java public interface MemberDao { // 分页查询 public List queryForPage(final String hql, final int offset, final int length); // 查询所有记录数 public int getAllRowCount(String hql); } ``` ##### 2. DAO实现层 在`MemberDaoImpl`类中实现了上述接口,利用Spring提供的`HibernateDaoSupport`类来实现Hibernate的操作。 ```java public class MemberDaoImpl extends HibernateDaoSupport implements MemberDao { // 分页查询 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); return query.list(); } }); return list; } // 查询所有记录数 public int getAllRowCount(String hql) { return getHibernateTemplate().find(hql).size(); } } ``` 这里利用了Spring的`HibernateCallback`接口,可以在不破坏封装的情况下执行Hibernate操作。 ##### 3. 分页信息类设计 为了更好地管理和展示分页信息,我们创建了一个`PageBean`类,该类包含了一些基本的分页属性,如总记录数、当前页码、每页记录数等。 ```java 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; // 是否有下一页 // 省略getter和setter方法 } ``` 通过`PageBean`类,我们可以方便地获取分页的相关信息,并将其传递给前端进行展示。 #### 四、分页逻辑实现 在业务逻辑层和服务层中,我们可以使用DAO层提供的方法来获取分页数据,并填充到`PageBean`对象中。例如,在服务层中可以实现以下逻辑: ```java public class MemberService { private MemberDao memberDao; public void setMemberDao(MemberDao memberDao) { this.memberDao = memberDao; } public PageBean getPageData(String hql, int currentPage, int pageSize) { int offset = (currentPage - 1) * pageSize; List data = memberDao.queryForPage(hql, offset, pageSize); int allRow = memberDao.getAllRowCount(hql); int totalPage = (allRow % pageSize == 0) ? allRow / pageSize : allRow / pageSize + 1; PageBean pageBean = new PageBean(); pageBean.setList(data); pageBean.setAllRow(allRow); pageBean.setTotalPage(totalPage); pageBean.setCurrentPage(currentPage); pageBean.setPageSize(pageSize); pageBean.setIsFirstPage(currentPage == 1); pageBean.setIsLastPage(currentPage == totalPage); pageBean.setHasPreviousPage(currentPage > 1); pageBean.setHasNextPage(currentPage < totalPage); return pageBean; } } ``` 这样,我们就可以通过`MemberService`类提供的方法获取到分页后的数据,并且能够计算出相关的分页信息。 #### 五、前端展示 在前端展示层面,我们可以通过Struts2的标签库或者自定义的JSP标签来展示分页数据和导航栏。例如,可以使用`<s:iterator>`标签来遍历`PageBean`中的数据列表,并且使用JavaScript或者HTML标签来构建分页导航。 #### 六、总结 通过上述设计和实现,我们可以看到在Struts2 + Hibernate + Spring框架中实现分页功能是相对简便且高效的。这种设计方式不仅提高了代码的可维护性和扩展性,还保证了系统的性能和稳定性。在实际开发中,可以根据具体的需求对分页功能进行更进一步的优化和定制。