您的位置:首页 > 编程语言 > Java开发

使用hibernate和struts2实现分页功能

2015-01-20 18:41 507 查看
想着每天能学个新东西,今天准备了这个hibernate+struts2实现页面的分页功能,在这里,首先要感谢
http://www.blogjava.net/rongxh7/archive/2008/11/29/243456.html
位博友发表的博文,通过对他代码的阅读,从而自己实现了网页分页功能,以下是源代码,如大家有需要,可以回复我,我会放出源代码供大家下载!
1.DAO层接口的设计,定义一个PersonDAO接口,里面声明了两个方法:
public interface PersonDAO
{    public List<Person> queryByPage(String hql, int offset, int pageSize);
public int getAllRowCount(String hql);
}
2.DAO层接口的实现类PersonDAOImpl类,将其两个方法实现出来:
public class PersonDAOImpl implements PersonDAO
{
/**
* 通过hql语句得到数据库中记录总数
*/
@Override
public int getAllRowCount(String hql)
{
Session session = HibernateUtil.openSession();
Transaction tx = null;
int allRows = 0;
try
{
tx = session.beginTransaction();

Query query = session.createQuery(hql);

allRows = query.list().size();

tx.commit();

}
catch (Exception e)
{
if(tx != null)
{
tx.rollback();
}

e.printStackTrace();
}
finally
{
HibernateUtil.closeSession(session);
}

return allRows;
}
/**
* 使用hibernate提供的分页功能,得到分页显示的数据
*/
@SuppressWarnings("unchecked")
@Override
public List<Person> queryByPage(String hql, int offset, int pageSize)
{
Session session = HibernateUtil.openSession();
Transaction tx = null;
List<Person> list = null;

try
{
tx = session.beginTransaction();

Query query = session.createQuery(hql).setFirstResult(offset).setMaxResults(pageSize);

list = query.list();

tx.commit();

}
catch (Exception e)
{
if(tx != null)
{
tx.rollback();
}

e.printStackTrace();
}
finally
{
HibernateUtil.closeSession(session);
}

return list;
}
}
3.定义了一个PageBean(每一页所需要的内容都存放在这个PageBean里面),里面用来存放网页每一页显示的内容:
public class PageBean
{
private List<Person> list; //通过hql从数据库分页查询出来的list集合

private int allRows; //总记录数

private int totalPage; //总页数

private int currentPage; //当前页

public List<Person> getList()
{
return list;
}

public void setList(List<Person> list)
{
this.list = list;
}

public int getAllRows()
{
return allRows;
}

public void setAllRows(int allRows)
{
this.allRows = allRows;
}

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;
}

/**
* 得到总页数
* @param pageSize 每页记录数
* @param allRows  总记录数
* @return 总页数
*/
public int getTotalPages(int pageSize, int allRows)
{
int totalPage = (allRows % pageSize == 0)? (allRows / pageSize): (allRows / pageSize) + 1;

return totalPage;
}

/**
* 得到当前开始记录号
* @param pageSize 每页记录数
* @param currentPage 当前页
* @return
*/
public int getCurrentPageOffset(int pageSize, int currentPage)
{
int offset = pageSize * (currentPage - 1);

return offset;
}

/**
* 得到当前页, 如果为0 则开始第一页,否则为当前页
* @param page
* @return
*/
public int getCurPage(int page)
{
int currentPage = (page == 0)? 1: page;

return currentPage;
}

}
4.Service层接口设计,定义一个PersonService接口,里面声明了一个方法,返回一个PageBean:
public interface PersonService
{    public PageBean getPageBean(int pageSize, int page);
}
5.Service层接口实现类PersonServiceImpl类,实现唯一的方法:
public class PersonServiceImpl implements PersonService
{
private PersonDAO personDAO = new PersonDAOImpl();

/**
* pageSize为每页显示的记录数
* page为当前显示的网页
*/
@Override
public PageBean getPageBean(int pageSize, int page)
{
PageBean pageBean = new PageBean();

String hql = "from Person";

int allRows = personDAO.getAllRowCount(hql);

int totalPage = pageBean.getTotalPages(pageSize, allRows);

int currentPage = pageBean.getCurPage(page);

int offset = pageBean.getCurrentPageOffset(pageSize, currentPage);

List<Person> list = personDAO.queryByPage(hql, offset, pageSize);

pageBean.setList(list);
pageBean.setAllRows(allRows);
pageBean.setCurrentPage(currentPage);
pageBean.setTotalPage(totalPage);

return pageBean;
}
}
6.Action层设计,定义一个PersonAction:
public class PersonAction extends ActionSupport
{
private PersonService personService = new PersonServiceImpl();

private int page;

public int getPage()
{
return page;
}

public void setPage(int page)
{
this.page = page;
}

@Override
public String execute() throws Exception
{
//表示每页显示5条记录,page表示当前网页
PageBean pageBean = personService.getPageBean(5, page);

HttpServletRequest request = ServletActionContext.getRequest();

request.setAttribute("pageBean", pageBean);

return SUCCESS;
}
}
7.辅助类设计,HibernateUtil:
public class HibernateUtil
{
private static SessionFactory sessionFactory;

static
{
sessionFactory = new Configuration().configure().buildSessionFactory();
}

public static Session openSession()
{
Session session = sessionFactory.openSession();

return session;
}

public static void closeSession(Session session)
{
if(session != null)
{
session.close();
}
}

}
8.最后也就是分页页面显示pagePerson.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'pagePerson.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">

<script type="text/javascript">

function validate()
{
var page = document.getElementsByName("page")[0].value;

if(page > <s:property value="#request.pageBean.totalPage"/>)
{
alert("你输入的页数大于最大页数,页面将跳转到首页!");

window.document.location.href = "personAction";

return false;
}

return true;
}

</script>

</head>

<body>

<h1><font color="blue">分页查询</font></h1><hr>

<table border="1" align="center" bordercolor="yellow" width="50%">

<tr>
<th>序号</th>
<th>姓名</th>
<th>年龄</th>
</tr>

<s:iterator value="#request.pageBean.list" id="person">

<tr>
<th><s:property value="#person.id"/></th>
<th><s:property value="#person.name"/></th>
<th><s:property value="#person.age"/></th>
</tr>

</s:iterator>

</table>

<center>

<font size="5">共<font color="red"><s:property value="#request.pageBean.totalPage"/></font>页 </font>  
<font size="5">共<font color="red"><s:property value="#request.pageBean.allRows"/></font>条记录</font><br><br>

<s:if test="#request.pageBean.currentPage == 1">
首页   上一页
</s:if>

<s:else>
<a href="personAction.action">首页</a>
   
<a href="personAction.action?page=<s:property value="#request.pageBean.currentPage - 1"/>">上一页</a>
</s:else>

<s:if test="#request.pageBean.currentPage != #request.pageBean.totalPage">
<a href="personAction.action?page=<s:property value="#request.pageBean.currentPage + 1"/>">下一页</a>
   
<a href="personAction.action?page=<s:property value="#request.pageBean.totalPage"/>">尾页</a>
</s:if>

<s:else>
下一页   尾页
</s:else>

</center><br>

<center>

<form action="personAction" onsubmit="return validate();">
<font size="4">跳转至</font>
<input type="text" size="2" name="page">页
<input type="submit" value="跳转">
</form>

</center>

</body>
</html>
至此,hibernate+struts2实现网页分页功能代码部分就完毕了,像hibernate与struts的配置文件就不列出来了,那些都不是重点!
页面效果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息