SSH架构分页源代码

来源:互联网 发布:ubuntu 16.04 分区 编辑:程序博客网 时间:2024/06/03 17:41

根据需要可以先做一个信息列表的页面,例如: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>

效果图:

 

SSH架构分页源代码(Struts2+Spring+Hibernate) - 白清的网易Blog - 白清的网易Blog

 

如果是首页显示 那么首页和前一页就回失去功能

 

SSH架构分页源代码(Struts2+Spring+Hibernate) - 白清的网易Blog - 白清的网易Blog

 

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

 

SSH架构分页源代码(Struts2+Spring+Hibernate) - 白清的网易Blog - 白清的网易Blog

 

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