这几天一直在研究分页问题。看了别人的例子,自己总算是明白了,以前自己不知道去想怎么实现的,只想着去掉用,现在发现,只要用心,什么都能解决。一下是自己大概的总结,算是学习笔记吧,继续努力。
1.创建PageModel对象,即用来实现分页的javabean组件,代码如下:
import java.util.List;
public class PageModel {
private int total;//总记录数
private int pageSize;//每页记录数
private int currentPage;//当前页数
private List<?> datas;//结果集
private int totalPage;//总的页数
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getTotal(){
return total;
}
public void setTotal(int total){
this.total = total;
}
public List<?> getDatas(){
return datas;
}
public void setDatas(List<?> datas){
this.datas = datas;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
// 获取第一页
public int getFirstPage() {
return 1;
}
// 获取最后下一页
public int getLastPage() {
return (total + pageSize - 1) / pageSize;
}
// 获取下一页
public int getNextPage() {
return (currentPage >= getLastPage() ? getLastPage() : currentPage + 1);
}
// 获取上一页
public int getPreviousPage() {
return currentPage <= 1 ? currentPage : (currentPage - 1);
}
public String toString() {
return "PageModel:[currentPage:" + getCurrentPage() + ",pageSize"
+ getPageSize() + ",listSize" + getDatas().size() + "]";
}
//获取开始的页数,在用到foreach的时候用到1,2,3,4,5
public int getStart(){
if(getCurrentPage()<this.getTotalPage()) return 1;
return this.getCurrentPage()>this.getPageSize()?(this.getCurrentPage()-this.getPageSize()+1):1 ;
}
public int getEnd(){
//开始位置+设置的pageSize-1
return (this.getStart()+this.getPageSize()-1)>this.getTotalPage()? this.getTotalPage():(this.getStart()+this.getPageSize()-1);
}
}
2.对应的分页方法封装在PagerDao里面,代码如下:
import java.util.List;
import org.hibernate.Query;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
public class PagerDao extends HibernateDaoSupport {
public PageModel getDatas(String hql,int offset,int pageSize){
String countHql = getCountQuery(hql);//为下面方法的调用,获取sql语句
Query query_number = this.getSession().createQuery(countHql);
int total = ((Long)query_number.uniqueResult()).intValue();//总记录
Query query_datas = this.getSession().createQuery(hql);
List<?> datas=null;
if(offset==-1&&pageSize==-1){
datas = query_datas.list();
}else{
datas = query_datas.setFirstResult(offset).setMaxResults(pageSize).list();//生成list集合
}
int totalPage = total % pageSize == 0 ? total/ pageSize : total / pageSize + 1;
PageModel pm = new PageModel();
pm.setDatas(datas);
pm.setTotal(total); //添加总的页面数
pm.setTotalPage(totalPage);
return pm;
}
/**
* 根据HQL语句生成对应的查询语句
* @param hql
* @return
*/
private String getCountQuery(String hql){
System.out.println(hql);
int index = hql.indexOf("from");
if(index!=1){
String s = "select count(*)"+hql.substring(index);
return s;
}
throw new RuntimeException("无效的HQL查询语句!");
}
}
3.接下来时展现分页方法的实现,如下:
4.对应的action
public String show() throws Exception{
HttpServletRequest request = ServletActionContext.getRequest();
if (currentPage == 0) {
currentPage = 1;
} else {
currentPage = Integer.parseInt(request.getParameter("currentPage"));
}
int offset =(currentPage-1)*pageSize;
PageModel pageModel=this.bbsManager.showBBS(offset, pageSize);
pageModel.setPageSize(4);//这两个人的作用是:前台取出数据时的分页
pageModel.setCurrentPage(currentPage);
request.setAttribute("bbsPm",pageModel);
return "show_success";
}
5.前台展现页面实现
展现效果如下图: