SSH框架中 分页显示数据Demo

分页的几个要素:总记录数,每页显示数,共几页,当前页等。  
  
1.首先我们先新建立一个接口MemberDao.java,把所需要用到的方法列出来:  
  
[java] view plaincopyprint?  
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  
  
[java] view plaincopyprint?  
package cn.zbvc.dao.impl;    
import java.util.List;    
import org.hibernate.Query;    
import org.hibernate.Session;    
import cn.zbvc.bean.User;    
import cn.zbvc.dao.MemberDao;    
public class MemberDaoImpl extends BaseHibernateDAO implements MemberDao {    
/**   
 * 查询所有的记录数   
 * @param hql 查询条件   
 * @return 总记录数   
 */    
public int getAllRowCount(String hql) {    

Query query = getSession().createQuery(hql);

return query.list().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();    
session.close();    
return list;    
}    
  
  
大家可以看到,我们一共定义了两个方法,第一个方式是获取数据库表的总记录数,第二个方法是获取我们想要获取的某一页的数据集合,传递的三个参数分别是:查询条件、开始的记录、结束的记录。  
  
3.然后我们需要建立一个获取分页信息的pageBean.java:  
  
[java] view plaincopyprint?  
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.业务逻辑层的实现:在UserService中定义一个方法:  
  
[java] view plaincopyprint?  
/**   
 * 分页查询     
 * @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"; //查询语句    User为实例化user表得到的实体  不用写select语句
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:  

  
[java] view plaincopyprint?  
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 = cardSer.queryForPage(5, page);// 获取封装了分页信息和数据的pageBean
this.listCard = this.pageBean.getList(); // 获取数据
ActionContext context = ActionContext.getContext();
context.put("cards", this.listCard);
return SUCCESS;    
}    
}    
  
  
7.配置applicationContext.xml和struts.xml的相关信息,这里省略了。  
  
8.在listUser2.jsp页面中添加分页内容:  
  

[html] view plaincopyprint?  

<div style='text-align:center'>

<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>    
</div>
  
9.查看效果:  
  
  
10.思考总结  
  

关于分页功能实现,应该是有有很多种解决方法,这种解决方案只是其中的一种

参考 博客:http://blog.csdn.net/guangmingfupin/article/details/8474151

    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值