今天做项目是用到了分页,所以来记录以下,以便加深印象。
首先创造几个个类或者接口dao(接口),daoImpl,service(接口),serviceIImpl,action,pageBean(用于存放分页信息)
先写pageBean类里面的东西。
首先得明白分页相关的值主要有:1.当前页(前端传过来)2.每页设置的记录数(自己设置)3.总的记录数(从数据库中查出)
4.总页数(通过总记录数和每页记录数求出,作用是在前端页面显示出共几页)5.还有最重要的一个是每页的具体信息,这里存储与list集合中。
所以这里的pageBean类的属性是
private int allRowCounts; //这是设置总记录数(在Dao中查的)
private int pageSize; //每页记录数
private int curPage; //当前页
private int sumPages; //总页数
public List<DaiYeInfo> pageList; //每页的商品具体信息(这也是在Dao层查找的,在Dao层查到的就不用在在其他地方找)
pageBean的方法是
1.计算当前页(主要就是对前端传过来的页数进行安全性的限制)
//这是计算当前页
public static int curPage(int page,int sumPages) {
if(page==0) {
return 1;
}else if(page>sumPages) {
return sumPages;//当前页不能超过总页数,也不能小于第一页
}
return page; //当前页一定是从1开始的因为你还要计算他的每一页的具体信息
}
//这是计算总页数
public static int sumPages(int allRowCounts,int pageSize) {
if((allRowCounts%pageSize)==0) {
return allRowCounts/pageSize;
}else {
return allRowCounts/pageSize+1;
}
}
//获得起始点,为获取每页的分页内容做准备
public static int curoffset(int pageSize,int curPage) {
return pageSize*(curPage-1);
}
(还有属性的get、set方法)
//以上是pageBean类的内容,这个类的实例是要被传送到Jsp页面上的,用这个实例就可以获取分页的所有信息。
接下来是dao的实现类(这里接口方法就不写了)
/**
* 第一个方法:根据三个条件查询每页的具体信息
* hql 查询条件(是全部查询还是跳着查询之类的)
* off记录起始点
* len查询数量
* */
List<DaiYeInfo> list=(List<DaiYeInfo>) this.getHibernateTemplate().execute(
//使用Hibernate的回调接口来实现获取session,然后以hibernate的方式来插寻数据,更灵活。
new HibernateCallback() {
@Override
public List doInHibernate(Session s) throws HibernateException {
Query query=s.createQuery(hql);
query.setFirstResult(off);
query.setMaxResults(len);
List<DaiYeInfo> daiYeInfos=query.list();
return daiYeInfos;
}
}
);
return list;
}
// 上面方法是利用Hibernate的回调函数(下一篇博文会详细讲解),来获取每页的具体信息。
@Override
public int findAllRowCounts(String hql) {
List<DaiYeInfo> list=(List<DaiYeInfo>) this.getHibernateTemplate().find(hql);
return list.size();
}
//此方法是获取总的记录数,注意dao层里面只写可以从数据库中直接获取到的数据,而间接获取到的就要放在service中进行处理。
到这里dao层就结束了,接下来就是service层将数据处理并封装到pageBean中。
@Override
public PageBean queryForPage(int page) {
int pageSize=10;
String hql="from DaiYeInfo";
int allRowCounts=pageDao.findAllRowCounts(hql);
int sumPages=PageBean.sumPages(allRowCounts, pageSize);
int curPage=PageBean.curPage(page,sumPages);
int curoffset=PageBean.curoffset(pageSize, curPage);
List<DaiYeInfo> pageList=pageDao.findForPage(hql, curoffset, pageSize);
PageBean pageBean = new PageBean();
pageBean.setAllRowCounts(allRowCounts);
pageBean.setCurPage(curPage);
pageBean.setPageList(pageList);
pageBean.setPageSize(pageSize);
pageBean.setSumPages(sumPages);
return pageBean;
}
//这是service层的具体实现, 自己定义每页查询数(int pageSize=10;), 和查询条件(String hql="from DaiYeInfo";)以及将数据封装到pageBean实例中。
public String selectDaiYeByPage() {
PageBean pageBean=pageService.queryForPage(page);
HttpServletRequest request=ServletActionContext.getRequest();
HttpSession session=request.getSession();
session.setAttribute("pageBean", pageBean);
return SUCCESS;
}
此为action中方法,将pageBean实例传到前端页面中,完成分页。
<tr>
<td></td>
<td colspan="3">
<a href="/manager/selectDaiYeByPage?page=1">首页</a> |
<a href="/manager/selectDaiYeByPage?page=${sessionScope.pageBean.curPage-1 }">上一页</a> |
<a>共${sessionScope.pageBean.sumPages }页</a> |
<a href="/manager/selectDaiYeByPage?page=${sessionScope.pageBean.curPage }">第${sessionScope.pageBean.curPage }页</a> |
<a href="/manager/selectDaiYeByPage?page=${sessionScope.pageBean.sumPages+1 }">下一页</a> |
<a href="/manager/selectDaiYeByPage?page=${sessionScope.pageBean.sumPages }">尾页</a>
</td>
<td colspan="2"></td>
</tr>
此为分页的前端代码。
以上就是ssh分页的过程,其实就是pageBean类里面的几个属性的赋值,其中(每页记录数)是自己根据需求定义的,(当前页数)是前端传过来的,(总记录数)是数据库查出来的,(总页数)是自己根据总记录数和每页记录数在service简单计算出来的,(初始记录点)也是简单计算出来的,根据这几个值和值相对应的出处,分别写方法(确定在那个层里面),就行了。
注:如果有不清楚的可以参考此博文:https://www.jianshu.com/p/9f439e1e3330(本文就是参考此博文的)
因为是新手,晚上加班总结的有点匆忙,有什么不对或者可以改进的地方请大神指教。