————-刚刚接触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 <= ?