亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Hibernate+Spring+Struts2整合開發中的一個分頁

系統 2192 0

Hibernate+Spring+Struts2整合開發中的一個分頁顯示方案

(2011-12-14 14:09:08)

分頁顯示一直是web開發中一大煩瑣的難題,傳統的網頁設計只在一個JSP或者ASP頁面中書寫所有關于數據庫操作的代碼,那樣做分頁可能簡單一點,但當把網站分層開發后,分頁就比較困難了,下面是我做Spring+Hibernate+Struts2項目時設計的分頁代碼,與大家分享交流。
1、DAO層接口的設計,在MemberDao接口中定義了如下兩個方法:

public interface MemberDao {

// 省略了其他的代碼


public List queryForPage( final String hql, final int offset, final int length);


public int getAllRowCount(String hql);

}

2、DAO層實現類MemberDaoImpl對上面兩個方法的實現如下:

public class MemberDaoImpl extends HibernateDaoSupport implements MemberDao {
// 省略了其他的代碼


public List queryForPage( final String hql, final int offset, final int length) {
List list
= getHibernateTemplate().executeFind( new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException,SQLException {
Query query
= session.createQuery(hql);
query.setFirstResult(offset);
query.setMaxResults(length);
List list
= query.list();
return list;
}

}
);
return list;
}




public int getAllRowCount(String hql) {
return getHibernateTemplate().find(hql).size();
}


}

細心的讀者會發現,這個類繼承了HibernateDaoSupport類,HibernateDaoSupport是Spring提供的對Hibernate支持的類,getHibernateTemplate().executeFind(new HibernateCallback(){....})方法中的參數,我們使用了接口回調,在其參數內,我們能像原生的Hibernate一樣調用query.setFirstResult(offset)和query.setMaxResults(length)來實現分頁查詢功能。

3、下面我們來新建一個保存分頁信息的類PageBean,具體代碼如下:

public class PageBean {

private List list; // 要返回的某一頁的記錄列表

private int allRow; // 總記錄數
private int totalPage; // 總頁數
private int currentPage; // 當前頁
private int pageSize; // 每頁記錄數

private boolean isFirstPage; // 是否為第一頁
private boolean isLastPage; // 是否為最后一頁
private boolean hasPreviousPage; // 是否有前一頁
private boolean hasNextPage; // 是否有下一頁


public List getList() {
return list;
}

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

public int getAllRow() {
return allRow;
}

public void setAllRow( int allRow) {
this .allRow = allRow;
}

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

public int getPageSize() {
return pageSize;
}

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



public void init() {
this .isFirstPage = isFirstPage();
this .isLastPage = isLastPage();
this .hasPreviousPage = isHasPreviousPage();
this .hasNextPage = isHasNextPage();
}




public boolean isFirstPage() {
return currentPage == 1 ; // 如是當前頁是第1頁
}

public boolean isLastPage() {
return currentPage == totalPage; // 如果當前頁是最后一頁
}

public boolean isHasPreviousPage() {
return currentPage != 1 ; // 只要當前頁不是第1頁
}

public boolean isHasNextPage() {
return currentPage != totalPage; // 只要當前頁不是最后1頁
}




public static int countTotalPage( final int pageSize, final int allRow) {
int totalPage = allRow % pageSize == 0 ? allRow / pageSize : allRow / pageSize + 1 ;
return totalPage;
}



public static int countOffset( final int pageSize, final int currentPage) {
final int offset = pageSize * (currentPage - 1 );
return offset;
}



public static int countCurrentPage( int page) {
final int curPage = (page == 0 ? 1 :page);
return curPage;
}

}


4、Service層接口的設計:

public interface MemberService {
// 省略其他的代碼


public PageBean queryForPage( int pageSize, int currentPage);

}


5、Service層實現類的部分內碼如下:

public class MemberServiceImpl implements MemberService {

// 通過applicationContext.xml配置文件注入MemberDao的值
private MemberDao memberDao;
public void setMemberDao(MemberDao memberDao) {
this .memberDao = memberDao;
}



public PageBean queryForPage( int pageSize, int page) {

final String hql = " from Member " ; // 查詢語句
int allRow = memberDao.getAllRowCount(hql); // 總記錄數
int totalPage = PageBean.countTotalPage(pageSize, allRow); // 總頁數
final int offset = PageBean.countOffset(pageSize, page); // 當前頁開始記錄
final int length = pageSize; // 每頁記錄數
final int currentPage = PageBean.countCurrentPage(page);
List
< Member > list = memberDao.queryForPage(hql,offset, length); // "一頁"的記錄

// 把分頁信息保存到Bean中
PageBean pageBean = new PageBean();
pageBean.setPageSize(pageSize);
pageBean.setCurrentPage(currentPage);
pageBean.setAllRow(allRow);
pageBean.setTotalPage(totalPage);
pageBean.setList(list);
pageBean.init();
return pageBean;
}


6、在Struts2中調用queryForPageMemberServic<wbr>e層的queryForPage()方法即可return一個包含分頁信息、符合條件的結果集list, 代碼如下:</wbr>

public class ListMember extends ActionSupport {
// 通過applicationContext.xml配置文件注入memberService的值
private MemberService memberService;
public void setMemberService(MemberService memberService) {
this .memberService = memberService;
}


private int page; // 第幾頁

private PageBean pageBean; // 包含分布信息的bean

public int getPage() {
return page;
}


public void setPage( int page) { // 若URL中無此參數,會默認為第1頁
this .page = page;
}


public PageBean getPageBean() {
return pageBean;
}


public void setPageBean(PageBean pageBean) {
this .pageBean = pageBean;
}


@Override
public String execute() throws Exception {
// 分頁的pageBean,參數pageSize表示每頁顯示記錄數,page為當前頁
this .pageBean = memberService.queryForPage( 2 , page);
return SUCCESS;
}

}


7、最后在listMember.jsp頁面中,用到了Struts2標簽:

< s:iterator value ="pageBean.list" >
< s:property value ="title" />
< a href ="getArticle.action?id=<s:property value=" id" /> ">modify </ a >
< a href ="deleteArticle.action?id=<s:property value=" id" /> " onclick="return askDel()"/>delete </ a >< br />
</ s:iterator >
< s:property value ="pageBean.allRow" /> 條記錄
< s:property value ="pageBean.totalPage" />
當前第
< s:property value ="pageBean.currentPage" /> < br />

< s:if test ="%{pageBean.currentPage == 1}" >
第一頁 上一頁
</ s:if >
< s:else >
< a href ="listMyArticle.action?page=1" > 第一頁 </ a >
< a href ="listMyArticle.action?page=<s:property value=" %{pageBean.currentPage-1}" /> ">上一頁 </ a >
</ s:else >
< s:if test ="%{pageBean.currentPage != pageBean.totalPage}" >
< a href ="listMyArticle.action?page=<s:property value=" %{pageBean.currentPage+1}" /> ">下一頁 </ a >
< a href ="listMyArticle.action?page=<s:property value=" pageBean.totalPage" /> ">最后一頁 </ a >
</ s:if >
< s:else >
下一頁 最后一頁
</ s:else >

到這里,Hibernate+Spring+Struts2整合開發中的分頁問題就已經解決了,在我上述過程中,省略了許多Hibernate,Spring,Struts2的配置,那不是本文的重點,大家可以參考有關的書與資料,由于篇幅有限,在此就不一一列舉。在以后的文章中,我也會詳細地跟大家講述SSH整合開發。


Hibernate+Spring+Struts2整合開發中的一個分頁顯示方案


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚州国产 | 欧美午夜大片 | 亚洲精品第一页中文字幕 | 亚洲视频免费在线播放 | 久久资源在线 | 久久成人18免费网站 | 欧美精品99 | 久久乐国产精品亚洲综合m3u8 | 九色精品视频在线观看 | 亚洲国产精品国产自在在线 | 手机在线看片不卡中文字幕 | a一级黄 | 日本午夜www高清视频 | 曰本性l交视频 | 四虎影视网 | 天天操天天干天天玩 | 91社区在线观看精品 | 国产精品www视频免费看 | 久久九九有精品国产23百花影院 | 日韩中文字幕在线观看视频 | 国产网红精品 | 奇米在线免费视频 | 欧美日韩亚洲国内综合网香蕉 | 久久久99视频 | 国产999视频 | 韩国办公室激情 | 黄页在线免费观看 | 激情影院在线观看 | 日韩在线观看网站 | 狠狠操天天操 | 草逼综合| 女人一级一级毛片 | 亚洲成人在线播放视频 | 国内久久久久久久久久 | 欧美高清亚洲欧美一区h | 国产福利专区精品视频 | 久久久久夜夜夜精品国产 | 久re这里只有精品最新地址 | 国产成人区 | 亚洲欧美日韩国产精品一区 | 97影院理伦在线观看 |