利用Struts2和Hibernate实现页面分页显示的功能

本文介绍如何使用Struts2与Hibernate实现分页查询功能,包括自定义PageInfo类进行分页信息管理,通过BookAction处理分页请求,并在数据库层利用Hibernate Criteria API实现分页查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

————-刚刚接触Struts2和Hibernate框架,将学习到的一点知识和大家分享,欢迎指正————–
技术要点:①使用Struts2中Action的注入方式实现数据的传递;②使用Hibernate的分页查询方法,Criteria——setFirstResult(设置分页查询的起始值)、setMaxResults(设置一页查询的记录数)。
第一步:建立分页的实例类,示例名称为PageInfo(包含总记录数、总页数、当前页面、下一页、上一页、每页显示的记录数、每页显示的记录的集合等属性)。

public class PageInfo {
    private int totalRecords;// 总记录数
    private int pageCount;// 总页数
    private int pageNo;// 当前页面
    private int nextPage;// 下一页
    private int prePage;// 上一页
    private int pageSize;// 每页显示的记录数
    private List<Mybook> mybooks = null;// 每页显示的短消息的集合

    public int getTotalRecords() {
        return totalRecords;
    }

    public void setTotalRecords(int totalRecords) {
        this.totalRecords = totalRecords;
    }

    // 返回总页数
    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public int getPageNo() {
        return pageNo;
    }

    public void setPageNo(int pageNo) {
        this.pageNo = pageNo;
    }

    // 得到下一页
    public int getNextPage() {
        if (pageNo >= getPageCount()) {
            nextPage = getPageCount();
        } else {
            nextPage = pageNo + 1;
        }
        return nextPage;
    }

    public void setNextPage(int nextPage) {
        this.nextPage = nextPage;
    }

    // 得到上一页
    public int getPrePage() {
        if (pageNo <= 1) {
            prePage = 1;
        } else {
            prePage = pageNo - 1;
        }
        return prePage;
    }

    public void setPrePage(int prePage) {
        this.prePage = prePage;
    }

    // 返回总页数
    public int getPageCount() {
        pageCount = totalRecords / pageSize;
        if (totalRecords % pageSize != 0) {
            pageCount += 1;
        }
        return pageCount;
    }

    public void setPageCount(int pageCount) {
        this.pageCount = pageCount;
    }

    public List<Mybook> getMybooks() {
        return mybooks;
    }

    public void setMybooks(List<Mybook> mybooks) {
        this.mybooks = mybooks;
    }

}

第二步:构建Action,示例名称为BookAction(包含显示的对象、返回给页面的集合、分页实体类对象等属性)。

public class BookAction extends ActionSupport {
    //连接业务层的服务对象
    private ICommonService bookService;
    // 返回给页面的集合
    private List<Mybook> products;
    //分页实体类
    private PageInfo pageinfo;
    // 返回给页面的信息(跳转、包含的页面)
    private String target;

    public List<Mybook> getProducts() {
        return products;
    }

    public void setProducts(List<Mybook> products) {
        this.products = products;
    }

    public String getTarget() {
        return target;
    }

    public void setTarget(String target) {
        this.target = target;
    }

    public PageInfo getPageinfo() {
        return pageinfo;
    }

    public void setPageinfo(PageInfo pageinfo) {
        this.pageinfo = pageinfo;
    }

    // 分页显示
    public String show() throws Exception {
        bookService = ServiceFactory.getInstance("com.want.service.impl.BookServiceImpl");
        // 查找当前所有图书数量
        int count =bookService.count();
        //设置总记录数
        pageinfo.setTotalRecords(count);
        //设置单页记录数
        pageinfo.setPageSize(8);
        //根据起始值和页面记录数,查找当前页到的结果
        products = bookService.getByPages((pageinfo.getPageNo() - 1) * pageinfo.getPageSize(), pageinfo.getPageSize());
        target = "showBooks.jsp";
        return SUCCESS;
    }
}

第三步:数据库层查询条件并返回结果。

public List<Mybook> findByPages(int startNo, int pageSize) {
        // 获取session和transaction
        Session session = HibernateSessionFactory.getSession();
        Transaction trans = session.beginTransaction();
        List<Mybook> mybooks = null;
        try {
            Criteria criteria = session.createCriteria(Mybook.class);
            // 设置分页查询的起始值和一页显示的数量
            criteria.setFirstResult(startNo);
            criteria.setMaxResults(pageSize);
            //按照书的id降序排列
            criteria.addOrder(Order.desc("bookid"));
            //获取查询到的所有图书
            mybooks = criteria.list();
            trans.commit();
        } catch (Exception e) {
            e.printStackTrace();
            trans.rollback();
        }
        return mybooks;
    }

第五步:页面代码,首页、上一页、下一页、末页。每次点击其中一个超链接,就会从Action中获取一次最新的页面数据(当前页总是在变化)。

<div class="pageDiv">
    <a href="bookAction_show.do?pageinfo.pageNo=1">首页</a> 
    <span >${pageinfo.pageNo}&/${pageinfo.pageCount }</span> 
    <a href="bookAction_show.do?pageinfo.pageNo=${pageinfo.prePage}">上一页</a>
    <a href="bookAction_show.do?pageinfo.pageNo=${pageinfo.nextPage}">下一页</a>
    <a href="bookAction_show.do?pageinfo.pageNo=${pageinfo.pageCount}">末页</a>
</div>

小结:①Hibernate中已经封装好查询分页查询的方法,本文中用到的数据库是Oracle11g,分页查询是根据表空间中隐藏的rownum来实现分页查询功能。
②每次点击完首页、下一页、上一页、末页,都需要从Action中拿到当前页码(或者上一页、下一页页码),以实现上一页、下一页的功能。(也可以用Servlet来实现)
Hibernate在控制台中显示的SQL语句如下:

Hibernate: select * from ( select this_.BOOKID as BOOKID1_0_0_, this_.BOOKNAME as BOOKNAME2_0_0_, this_.PRICE as PRICE3_0_0_, this_.PUBLISHER as PUBLISHE4_0_0_, this_.BOOKTYPEID as BOOKTYPE5_0_0_, this_.BOOKIMAGE as BOOKIMAG6_0_0_ from WANGTAO.MYBOOK this_ order by this_.BOOKID desc ) where rownum <= ?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值