Dao层代码: 1、数据层接口代码
package cn.cdi.util.page;import java.util.List;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);}
2、实现接口的代码
package cn.cdi.util.page;import java.sql.SQLException;import java.util.List;import org.hibernate.HibernateException;import org.hibernate.Query;import org.hibernate.Session;import org.springframework.orm.hibernate3.HibernateCallback;import org.springframework.orm.hibernate3.support.HibernateDaoSupport;public class MemberDaoImpl extends HibernateDaoSupport implements MemberDao { /** * 分页查询 * @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(); }}
业务逻辑层代码
1、业务逻辑层接口代码
package cn.cdi.util.page;public interface MemberService { /** * 分页查询 * @param pageSize 每页显示几条 * @param currentPage 当前第几页 * @return 封闭了分页信息(包括记录集list)的Bean */ public PageBean queryForPage(int pageSize,int currentPage,String ModelBean);}
2、业务逻辑层实现接口代码
package cn.cdi.util.page;import java.util.List;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,String hql){ //final String hql = "from "+ModelBean; //查询语句 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 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;}}
bean层代码
package cn.cdi.util.page;import java.util.ArrayList;import java.util.List;import cn.cdi.importData.entity.ImportTask;public class PageBean {@SuppressWarnings("rawtypes")private List list = new ArrayList(); //要返回的某一页的记录列表 private int allRow; //总记录数 private int totalPage; //总页数 private int currentPage; //当前页 private int pageSize; //每页记录数 private boolean isFirstPage; //是否为第一页 private boolean isLastPage; //是否为最后一页 private boolean hasPreviousPage; //是否有前一页 private boolean hasNextPage; //是否有下一页 @SuppressWarnings("rawtypes") public List getList() { return list; } @SuppressWarnings("rawtypes") 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==0?1: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; }}
分页代码的使用 1、业务逻辑层获取封装数据代码实例(注这里需要利用spring的Ioc 将memberService注入到你业务逻辑层里面去) /** * 获取日志信息 * @param displayedCount //从第几条开始取 * @param pageDisplayCount //每页显示数 * @return 每页的日志信息 */ public PageBean getLogInfos(int displayedCount,int pageDisplayCount) { String hql = ""; hql = "from LogInfo"; return this.packImportTaskList(memberService.queryForPage(pageDisplayCount, displayedCount, hql)); } /** * 封装导入任务列表 * * @param pageBean * @return */ @SuppressWarnings("rawtypes") public PageBean packImportTaskList(PageBean pageBean) { List list = pageBean.getList(); List> newlist = new ArrayList >(); if (list != null) for (int i = 0; i < list.size(); i++) { LogInfo it = (LogInfo) list.get(i); HashMap map = new HashMap (); String getTime = it.getUpdateDataTime(); getTime=getTime.substring(0, 4)+"-"+getTime.substring(4, 6)+"-"+getTime.substring(6, 8)+" "+getTime.substring(8, 10)+":"+getTime.substring(10, 12)+":"+ getTime.substring(12, 14); map.put("updateDataTime",getTime);//更新数据日期 map.put("errorFilePath", it.getErrorFilePath());//错误数据文件的存放路径 map.put("operatorNum", it.getOperatorNum());//操作员账号 map.put("pckageFileSize", it.getPckageFileSize());//文件包大小(MB) map.put("updateFileName", it.getUpdateFileName());//更新的文件名 map.put("updateQuantity", it.getUpdateQuantity());//更新数量(书目数据数量,馆藏数据量) map.put("updateState", it.getUpdateState());//更新状态:成功,失败 newlist.add(map); } pageBean.setList(newlist); return pageBean; } 2、在Action中的使用
//第几页 private int page = 1; //包含分页信息的bean private PageBean pageBean; /** * 日志分页显示(每页10条) * @return */ public String showLogInfo() { this.pageBean = importDataBusiness.getLogInfos(page, 10); return "showLogInfo"; }
页面代码
<#include "../meta.ftl">查看覆盖日志 <#include "../head.ftl"><#include "../foot.ftl">