最近学习写了一个分页以及查询的功能。主要就是用了Hibernate的一些功能。直接说吧。。
首页写一个PageBean类
==================================================================================================
public class PageBean{
private List list; //要返回的某一页的记录列表
private int allRow; //总记录数
private int totalPage; //总页数
private int currentPage; //当前页
private int pageSize; //每页记录数
private String strpage; //链接增加的字符参数
private boolean isFirstPage; //是否为第一页
private boolean isLastPage; //是否为最后一页
private boolean hasPreviousPage; //是否有前一页
private boolean hasNextPage; //是否有下一页
public List getList() {
return list;
}
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 String getStrpage() {
return strpage;
}
public void setStrpage(String strpage) {
this.strpage = strpage;
}
public void init(){
this.isFirstPage = isFirstPage();
this.isLastPage = isLastPage();
this.hasPreviousPage = isHasPreviousPage();
this.hasNextPage = isHasNextPage();
}
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页
}
public static int countTotalPage(final int pageSize,final int allRow){
int totalPage = allRow % pageSize == 0 ? allRow/pageSize : allRow/pageSize+1;
return totalPage;
}
public static int countOffset(final int pageSize,final int currentPage){
final int offset = pageSize*(currentPage-1);
return offset;
}
public static int countCurrentPage(int page){
final int curPage = (page==0?1:page);
return curPage;
}
==================================================================================================
在写实现、操作数据库的Pagination类。
==================================================================================================
public class Pagination extends HibernateDaoSupport {
@SuppressWarnings("unchecked")
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;
}
public int getAllRowCount(String hql){
return getHibernateTemplate().find(hql).size();
}
@SuppressWarnings("unchecked")
public PageBean findAll(final String hql,int pageSize,int page)
{
int allRow = 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<User> list = 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;
}==================================================================================================
由于这个类需要操作数据库。需要在Spring的配置文件applicationContext.xml中添加
==================================================================================================
<bean id="pagination" class="com.test.common.page.Pagination"
scope="singleton">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
==================================================================================================
在具体实现某种需求的时候调用Pagination类中的方法。下面拿我写的一个用户类做例子
==================================================================================================
//查询所用用户 分页
public PageBean findAll(int pageSize,int page)
{
//return this.userDao.findAllUsers();
String hql = "from User"; //查询语句
return this.pagination.findAll(hql, pageSize, page);
}
//用户搜索 分页
public PageBean search(String field, String search, int pageSize, int page) {
String hql = "from User where "+field+" like '%"+search+"%'"; //查询语句
return this.pagination.findAll(hql, pageSize, page);
}
==================================================================================================
后台基本就这些了,前台分页部分我是这样写的。
==================================================================================================
<span class="pager_bar">
共<s:property value="pageBean.allRow"/> 条记录
共<s:property value="pageBean.totalPage"/> 页
当前第<s:property value="pageBean.currentPage"/>页
<s:if test="%{pageBean.currentPage == 1}">
第一页 上一页
</s:if>
<s:else>
<a href="listUser.action?page=1&field=${field}&search=${search}">第一页</a>
<a href="listUser.action?page=${pageBean.currentPage-1}&field=${field}&search=${search}">上一页</a>
</s:else>
<s:if test="%{pageBean.currentPage != pageBean.totalPage}">
<a href="listUser.action?page=${pageBean.currentPage+1}&field=${field}&search=${search}">下一页</a>
<a href="listUser.action?page=${pageBean.totalPage}&field=${field}&search=${search}">最后一页</a>
</s:if>
<s:else>
下一页 最后一页
</s:else></span>
==================================================================================================
需要指出的是由于加了查询所以在翻页的时候需要传field和search变量的值。