根据需要可以先做一个信息列表的页面,例如:list_Goods.jsp
接下来开始我们的分页之路:
1、把上一个复制,然后修改为listpage_Goods.jsp,这样做是为了区分。
2、在实体类的包下新建一个实体类,记住不需要写映射文件。取名为PageBean.java 源码
package com.monkey.blog.model;
import java.util.List;
public class PageBean {
private int allRow; //总记录数
private int currentPage; //当前页
private boolean firstPage;//首页
private boolean hasNextPage;//后一页
private boolean hasPreviousPage;//前一页
private boolean lastPage;//尾页
private List<Object> list; //要返回的某一页的记录列表
private int offset; //当前页开始记录
private int pageSize; //每页记录数
private int totalPage; //总页数
public int getAllRow() {
return allRow;
}
public int getCurrentPage() {
return currentPage;
}
public List<Object> getList() {
return list;
}
public int getOffset() {
return offset;
}
public int getPageSize() {
return pageSize;
}
public int getTotalPage() {
return totalPage;
}
public boolean isFirstPage() {
return firstPage;
}
public boolean isHasNextPage() {
return hasNextPage;
}
public boolean isHasPreviousPage() {
return hasPreviousPage;
}
public boolean isLastPage() {
return lastPage;
}
public void setAllRow(int allRow) {
this.allRow = allRow;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public void setFirstPage(boolean firstPage) {
this.firstPage = firstPage;
}
public void setHasNextPage(boolean hasNextPage) {
this.hasNextPage = hasNextPage;
}
public void setHasPreviousPage(boolean hasPreviousPage) {
this.hasPreviousPage = hasPreviousPage;
}
public void setLastPage(boolean lastPage) {
this.lastPage = lastPage;
}
public void setList(List list) {
this.list = list;
}
public void setOffset(int offset) {
this.offset = offset;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
/**
* 计算当前页,若为0或者请求的URL中没有"?page=",则用1代替
* @param page 传入的参数(可能为空,即0,则返回1)
* @return 当前页
*/
public static int countCurrentPage(int page){
final int curPage = (page==0?1:page);
return curPage;
}
/**
* 计算当前页开始记录
* @param pageSize 每页记录数
* @param currentPage 当前第几页
* @return 当前页开始记录号
*/
public static int countOffset(final int pageSize,final int currentPage){
final int offset = pageSize*(currentPage-1);
return offset;
}
/**
* 计算总页数
* @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);
System.out.println("totalpage = " + totalPage);
return totalPage;
}
}
如果需要的话,可以复制粘贴
3、在action中定义一个int类型对象:int pagenum = 0;,记住别忘了添加get和set方法。
4、通过action层和service层,最终到达dao层。Dao层的代码有点多,慢慢看:
GoodsDAO.java:
/**
* 分页查询
*
* @return
*/
public PageBean listpage(final int pagenum) {
final String hql = "from Goods order by gid desc";
int num = 0;//定义整个数据库中的信息记录数
int allpage = 0;//定义总页数
final PageBean pageBean = new PageBean();
num = (hibernateTemplate.find(hql)).size();//先计算出整个数据记录信息
pageBean.setAllRow(num);//把记录数保存到pagebean中的allrow(总记录数)里面
pageBean.setPageSize(8);//设置每页显示几条信息记录
allpage = PageBean.countTotalPage(pageBean.getPageSize(), pageBean.getAllRow());//根据每页显示几条和总条数计算出,要用多少页来显示
pageBean.setTotalPage(allpage);
if(allpage<pagenum)//如果用户根据地址栏强制输入第几页,那么如果大于总页数,就要把总页数赋值给当前页,否则把传递过来的页数赋值给当前页数
{
pageBean.setCurrentPage(allpage);
}
else
{
pageBean.setCurrentPage(PageBean.countCurrentPage(pagenum));
}
pageBean.setOffset(PageBean.countOffset(pageBean.getPageSize(),pageBean.getCurrentPage()));//根据每页显示的信息条数和当前页数,计算当前页开始记录号
if(pageBean.getTotalPage()>0)
{
//首页判断
//前一页判断
//满足条件:当当前页为第一页的时候首页和前一页不可用,否则可以使用
if(pageBean.getCurrentPage() == 1)
{
pageBean.setFirstPage(false);
pageBean.setHasPreviousPage(false);
}
else {
pageBean.setFirstPage(true);
pageBean.setHasPreviousPage(true);
}
//后一页判断
//尾页判断
if(pageBean.getTotalPage() == pageBean.getCurrentPage())
{
pageBean.setHasNextPage(false);
pageBean.setLastPage(false);
}
else {
pageBean.setHasNextPage(true);
pageBean.setLastPage(true);
}
}
//通过回调函数把Goods根据条件查询的集合放到PageBean中的List里面
pageBean.setList
(
hibernateTemplate.executeFind//回调函数
(
new HibernateCallback<Object>()
{
public Object doInHibernate(Session session)throws HibernateException, SQLException //捕捉异常处理:hibernate异常或者SQL异常
{
Query query = session.createQuery(hql);
query.setFirstResult(pageBean.getOffset());
query.setMaxResults(pageBean.getPageSize());
List<Object> list = query.list();
return list;
}
}
)
);
return pageBean;
}
最终返回的对象是PageBean对象
如果需要的话,可以复制粘贴
5、基本上到这都结束了,不过有时候大家对前台jsp可能不好写,因为在dao层里面的代码,根据需要在pagebean中定义了四个布尔类型的数据类型。就是为了做前天显示的效果图
Jsp前台代码:
<s:if test="#session.pageBean.list == null">
<tr>
<td colspan="9">
你要查询的商品信息集合为空,请
<a href="goods/addUI_Goods.action">添加</a>
</td>
</tr>
</s:if>
<s:else>
<s:iterator value="#session.pageBean.list" var="goodslist">
<tr>
<td style="border-bottom: #CCC dashed 2px;" height="30">
<a href="goods/detail_Goods?goods.gid=${goodslist.gid}">${goodslist.gname
}</a>
</td>
<td style="border-bottom: #CCC dashed 2px;">
${goodslist.gisbn }
</td>
<td style="border-bottom: #CCC dashed 2px;">
${goodslist.gprice }
<em style="color: #F00"><strong>¥</strong> </em>
</td>
<td style="border-bottom: #CCC dashed 2px;">
</td>
<td colspan="2" style="border-bottom: #CCC dashed 2px;">
${goodslist.goodstypes.tname }
</td>
<td width="74" style="border-bottom: #CCC dashed 2px;">
<a href="goods/editor_Goods?goods.gid=${goodslist.gid}"><img
src="<%=basePath%>images/picture/edit.gif" width="17"
height="17" border="0">编辑</a>
</td>
<td width="90" style="border-bottom: #CCC dashed 2px;">
<a href="goods/detail_Goods?goods.gid=${goodslist.gid}"><img
src="<%=basePath%>images/picture/y.gif" width="13" height="13"
border="0">详细信息</a>
</td>
<td width="84" style="border-bottom: #CCC dashed 2px;">
<a href="goods/delete_Goods?goods.gid=${goodslist.gid}"
onClick="window.confirm('你确定删除吗');"><img
src="<%=basePath%>images/picture/delete.gif" width="13"
height="13" border="0">删除</a>
</td>
</tr>
</s:iterator>
<tr>
<td colspan="9"
style="border-bottom: #CCC solid 2px; text-align: right">
<s:if test="#session.pageBean.firstPage">
<a href="goods/listpage_Goods?pagenum=0">首页</a>
</s:if>
<s:else><span style="color:#CCC">首页</span></s:else>
<s:if test="#session.pageBean.hasPreviousPage">
<a href="goods/listpage_Goods?pagenum=<s:property value='#session.pageBean.currentPage-1' />">前一页</a>
</s:if>
<s:else><span style="color:#CCC">前一页</span></s:else>
<s:if test="#session.pageBean.hasNextPage">
<a href="goods/listpage_Goods?pagenum=<s:property value='#session.pageBean.currentPage+1' />">后一页</a>
</s:if>
<s:else><span style="color:#CCC">后一页</span></s:else>
<s:if test="#session.pageBean.lastPage">
<a href="goods/listpage_Goods?pagenum=<s:property value='#session.pageBean.totalPage' />">尾页</a>
</s:if>
<s:else><span style="color:#CCC">尾页</span></s:else>
共有<s:property value="#session.pageBean.totalPage" />页/每页显示<s:property value="#session.pageBean.pageSize"/>条/当前页数<s:property value="#session.pageBean.currentPage"/>页
</td>
</tr>
</s:else>
效果图:


如果单击后一页,那么首页 前一页 后一页 尾页就可以使用了

单击到最后一的时候那么后一页和尾页就失去了功能 然后单击前一页就和上面一样了啊
。