SSH基础上分页功能的实现

3 篇文章 0 订阅
3 篇文章 0 订阅

参考网址1http://www.blogjava.net/BlogJava522935502/

参考网址2http://blog.csdn.net/qq522935502/

资料部分借鉴:http://www.blogjava.net/rongxh7/

上节课,我们完成了一个SSH整合的CRUD操作案例,并且完善了其国际化以及校验等内容,这节课,我们继续加以完善,我们知道,当我们查询数据库的内容过多的时候,显示在页面上的内容就比较冗长,所以分页的实现就显的十分有必要了。分页功能的实现是必不可少的,掌握一到两种分页技术在在实际开发前是有必要的,前两天浏览博客的时候看到了一个程序员的博文写的一个分页功能的实现非常好,在这里,分享给大家。

在讲解分页功能实现之前,大家必须对分页有一定的了解,知道分页的几个要素:总记录数,每页显示数,共几页,当前页等。

在上个例子的基础上我们开始完善我们的程序。

1.首先我们先新建立一个接口MemberDao.java,把所需要用到的方法列出来:

package cn.zbvc.dao;
import java.util.List;
import cn.zbvc.bean.User;
public interface MemberDao {
/**
 * 分页查询
 * @param hql  查询条件
 * @param offset  开始记录
 * @param length  一次查询几条记录
 * @return 查询的记录集合
 */
public List<User> queryForPage(final String hql,final int offset,final int length);
/**
 * 查询所有的记录数
 * @param hql 查询条件
 * @return 总记录数
 */
public int getAllRowCount(String hql);
}


2.然后我们创建其实现类:MemberDaoImpl.java

package cn.zbvc.dao.impl;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import cn.zbvc.bean.User;
import cn.zbvc.dao.MemberDao;
public class MemberDaoImpl extends HibernateDaoSupport implements MemberDao {
/**
 * 查询所有的记录数
 * @param hql 查询条件
 * @return 总记录数
 */
public int getAllRowCount(String hql) {
return this.getHibernateTemplate().find(hql).size();
}
/**
 * 分页查询
 * @param hql  查询条件
 * @param offset  开始记录
 * @param length  一次查询几条记录
 * @return 查询的记录集合
 */
@SuppressWarnings("unchecked")
public List<User> queryForPage(final String hql, final int offset, final int length) {
Session session = this.getSession();
Query q = session.createQuery(hql);
q.setFirstResult(offset);
q.setMaxResults(length);
List<User> list = q.list();
System.out.println(list.size());
session.close();
return list;
}


大家可以看到,我们一共定义了两个方法,第一个方式是获取数据库表的总记录数,第二个方法是获取我们想要获取的某一页的数据集合,传递的三个参数分别是:查询条件、开始的记录、结束的记录。

细心的读者会发现,这个类继承了HibernateDaoSupport类,HibernateDaoSupportSpring提供的对Hibernate支持的类,在其参数内,我们能像原生的Hibernate一样调用query.setFirstResult(offset)query.setMaxResults(length)来实现分页查询功能。

3.然后我们需要建立一个获取分页信息的pageBean.java:

package cn.zbvc.util;
import java.util.List;
import cn.zbvc.bean.User;
public class PageBean {
private List<User> 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;  //是否有下一页
Set and get方法...
PageBean中的具体方法:
/**
 * 初始化分页信息
 */
public void init(){
this.isFirstPage = isFirstPage;
this.isLastPage = isLastPage;
this.hasPreviousPage = hasPreviousPage;
this.hasNextPage = hasNextPage;
}
/**
 * 计算总页数  静态方法
 * @param pageSize  每页的记录数
 * @param allRow  总记录数
 * @return 总页数
 */
public static int countTatalPage(final int pageSize,final int allRow){
int toalPage = allRow % pageSize == 0 ? allRow/pageSize : allRow/pageSize + 1;
return toalPage;
}
/**
 * 计算当前页开始的记录
 * @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.业务逻辑层的实现:我们现在就只操作User,现在我们在UserService中定义一个方法:

/**
 * 分页查询  
 * @param pageSize  每页显示多少记录
 * @param currentPage 当前页
 * @return 封装了分页信息的bean
 */
public PageBean queryForPage(int pageSize,int page);
5.使用UserServiceImpl实现这个具体方法:
/**
 * 分页查询  
 * @param pageSize  每页显示多少记录
 * @param currentPage 当前页
 * @return 封装了分页信息的bean
 */
public PageBean queryForPage(int pageSize, int page) {
final String hql = "from User user order by user.id"; //查询语句
int allRow = memberDao.getAllRowCount(hql);  //总记录数
int totalPage = PageBean.countTatalPage(pageSize, allRow); //总页数
final int offset = PageBean.countOffset(pageSize, page); //当前页开始记录
final int length = pageSize; // 每页记录数
final int currentPage = PageBean.countCurrentPage(page); // 当前页
List 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.然后我们为了不影响上一个例子,我们新创建一个ListUserAction2.java:

package cn.zbvc.action.user;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
import cn.zbvc.bean.User;
import cn.zbvc.service.UserService;
import cn.zbvc.util.PageBean;
public class ListUserAction2 extends ActionSupport {
private UserService service;//通过Spring创建业务层对象  使用set方法依赖注入
private PageBean pageBean; //封装了分页信息和数据内容的pageBean
private List<User> listUser;//用于储存pageBean当中被封装的User信息
private int page = 1; //表示从网页中返回的当前页的值  默认为1 表示默认显示第一页内容
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public List<User> getListUser() {
return listUser;
}
public void setListUser(List<User> listUser) {
this.listUser = listUser;
}
public PageBean getPageBean() {
return pageBean;
}
public void setPageBean(PageBean pageBean) {
this.pageBean = pageBean;
}
public void setService(UserService service) {
this.service = service;
}
public String execute()throws Exception{
this.pageBean = service.queryForPage(5, page);//获取封装了分页信息和数据的pageBean
this.listUser = this.pageBean.getList(); //获取数据
return SUCCESS;
}
}


7.配置applicationContext.xmlstruts.xml的相关信息,这里省略了。

8.在listUser2.jsp页面中添加分页内容:

<s:iterator value="pageBean">
    	<tr>
    	 <td colspan="6" align="center" bgcolor="#5BA8DE">
    	 共<s:property value="allRow"/>条记录    
    	 共<s:property value="totalPage"/>页    
    	 当前第<s:property value="currentPage"/>页<br>
    
    	 <s:if test="%{currentPage == 1}">
    	   第一页  上一页
    	 </s:if>
    	 <!-- currentPage为当前页 -->
    	 <s:else>
    	   <a href="listUser2.action?page=1">第一页</a>
    	   <a href="listUser2.action?page=<s:property value="%{currentPage-1}"/>">上一页</a>
    	 </s:else>
    
    	 <s:if test="%{currentPage != totalPage}">
    	 <a href="listUser2.action?page=<s:property value="%{currentPage+1}"/>">下一页</a>
    	 <a href="listUser2.action?page=<s:property value="totalPage"/>">最后一页</a>
       	 </s:if>
    
    	 <s:else>
    	 下一页  最后一页
    	 </s:else>
    	 </td>
    	</tr>
</s:iterator>


9.查看效果:

10.思考总结

关于分页功能实现,应该是有有很多种解决方法,我介绍的这种解决方案是为了给大家一个

范例,让大家明白分页功能实现的原理,其中,大部分的内容借鉴了之前提到的网址。接下来的时间,我会继续学习关于分页功能的其它实现方式,然后分享给大家,另外,还会继续的整理SSH的整合。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值