分页显示一直是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);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
}
2、DAO层实现类MemberDaoImpl对上面两个方法的实现如下:
public class MemberDaoImpl extends HibernateDaoSupport implements MemberDao {
//省略了其他的代码
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
/**
* 分页查询
* @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();
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
}
细心的读者会发现,这个类继承了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;
}
}
4、Service层接口的设计:
public interface MemberService {
//省略其他的代码
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
/**
* 分页查询
* @param currentPage 当前第几页
* @param pageSize 每页大小
* @return 封闭了分页信息(包括记录集list)的Bean
*/
public PageBean queryForPage(int pageSize,int currentPage);
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
}
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){
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
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;
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
public void setPage(int page) { //若URL中无此参数,会默认为第1页
this.page = page;
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
public PageBean getPageBean() {
return pageBean;
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
public void setPageBean(PageBean pageBean) {
this.pageBean = pageBean;
}
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
@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>
到这里,Hibernate+Spring+Struts2整合开发中的分页问题就已经解决了,在我上述过程中,省略了许多Hibernate,Spring,Struts2的配置,那不是本文的重点,大家可以参考有关的书与资料,由于篇幅有限,在此就不一一列举。在以后的文章中,我也会详细地跟大家讲述SSH整合开发。
分享到:
相关推荐
总的来说,SSH整合CRUD案例结合分页功能的实现是一个实用的学习资源,涵盖了Java Web开发中的基础和进阶内容,对于初学者和有一定经验的开发者都有很高的参考价值。通过实际操作和学习,你可以掌握如何在SSH框架下...
在IT行业中,SSH整合是指Spring、Struts和Hibernate三个开源框架的集成,它们共同构建了一个强大的企业级应用开发平台。Spring提供了依赖注入和面向切面编程,Struts处理MVC模式,而Hibernate则是ORM(对象关系映射...
在SSH整合中,Spring通常会管理Hibernate的SessionFactory,以及Struts2的Action实例,实现依赖注入。Spring的配置文件(如 applicationContext.xml)是关键,它定义了bean的定义和依赖关系。 **3. Hibernate**:...
SSH(Struts2 + Spring + Hibernate)是一种经典的Java Web开发框架,它整合了Struts的MVC模式、Spring的依赖注入以及Hibernate的对象关系映射,为开发者提供了强大的开发工具。在SSH框架中实现分页功能是一项常见的...
Spring2.0版本在SSH整合中起到了胶水的作用,它可以管理和协调其他组件,如Struts2的Action实例、Hibernate的数据访问对象(DAO)。此外,Spring还提供了数据源管理、事务控制和JDBC抽象,简化了数据库操作。 ...
本篇文章将详细介绍如何在SSH整合开发中实现一个分页显示方案。 首先,我们需要在DAO层设计分页查询的相关接口。在`MemberDao`接口中,定义了两个关键方法:`queryForPage`用于执行分页查询,`getAllRowCount`用于...
【JAVAEE SSH分页】 在Java企业级开发中,SSH(Struts2、Spring、Hibernate)框架组合是常见的选择,它提供了...在实际开发中,可以根据项目需求选择适合的分页策略,并利用SSH框架提供的强大支持,简化分页的实现。
SSH,全称是Struts、Hibernate和Spring,是中国乃至全球许多Java Web开发中的经典技术栈。这三种技术分别负责Web层、持久层和应用层的管理,构建出强大的企业级应用解决方案。 Struts是Apache软件基金会的一个开源...
SSH分页技术是Java Web开发中一种常见的数据处理方法,主要应用于大数据量的展示场景,如用户在浏览商品列表或论坛帖子时,通过分页来避免一次性加载所有数据导致的性能问题和用户体验下降。SSH指的是Spring、Struts...
SSH整合模板(带CRUD)是一套基于Java的Web开发框架整合方案,主要涉及Spring、Struts2和Hibernate这三个核心组件。这套模板旨在提供一种高效、便捷的方式进行数据操作,包括创建(Create)、读取(Retrieve)、更新...
SSH2框架整合是Java开发中常见的一种技术组合,主要由Spring、Struts2和Hibernate三个开源框架构成。这个教程主题“SSH2框架整合 增删改查以及分页 适合初学者”旨在帮助初学者理解和掌握如何在实际项目中应用SSH2...
将EXT与SSH整合,可以构建出前后端分离的Web应用,前端EXTJS负责展示和用户交互,后端SSH处理业务逻辑和数据存储。整合的关键在于JSON数据交换格式,EXTJS通过Ajax请求向后端发送JSON数据,后端处理后返回JSON结果,...
### SSH整合笔记 #### 一、三大框架整合 在企业级应用开发中,Spring、Struts2 和 Hibernate 组合起来被广泛称为 SSH 框架。这些框架各自解决了不同的问题,但组合在一起可以提供一个非常强大的解决方案。下面将...
SSH快速开发框架是指整合了Struts、Spring和Hibernate三个开源框架的一种应用架构方案。它主要用于简化Java Web应用程序的开发流程,提高开发效率。 - **Struts 1.2**:负责处理前端请求并返回视图,提供MVC模式的...
SSH整合的网站商品后台管理系统是一种基于Java Web技术的解决方案,用于实现电商网站商品数据的管理。SSH是指Spring、Struts和Hibernate三个框架的首字母缩写,它们分别负责应用的控制层、表现层和持久层。 1. **...
SSH是Java Web开发中的一个流行框架组合,由Spring、Struts2和Hibernate三个开源项目组成。这个框架集合提供了全面的企业级应用解决方案,包括模型-视图-控制器(MVC)架构、持久层管理和业务逻辑处理。 Spring是...
总结来说,SSH整合是Java Web开发中常用的一种技术方案,它通过合理分配各框架的职责,提高了开发效率和代码的可维护性。对于开发者而言,理解这三个框架的基本原理和相互间的关系是至关重要的,这将有助于在实际...
Struts、Hibernate和Spring是Java开发中非常流行的三大框架,它们各自在Web应用程序的不同层面上发挥作用,而将它们整合在一起可以构建出强大的企业级应用。Struts负责控制流程,Hibernate处理数据持久化,Spring则...
综上所述,SSH框架整改+通用查询+通用分页_v1.6的项目可能包含了一系列针对这三个核心框架的优化,旨在提升开发效率,降低维护成本,同时提供了一套通用的查询和分页解决方案,以适应各种业务场景。对于Java Web...
3. **自定义Tag标签**:在SSH整合中,开发人员经常需要根据项目需求创建自定义Tag标签。这些标签可以封装复杂逻辑,使得JSP页面更加简洁。例如,创建一个显示用户信息的标签,可以将用户信息的查询和渲染封装在标签...