Webwork+hibernate+spring分頁實現
Webwork+Spring+Hibernate中的分頁方法
在實際的開發中,學習了其他人的分頁方案,經過修改形成了一個可以直接使用的分頁方案,現說明如下。 該分頁可以實現定製每頁顯示的記錄數、上下翻頁和跳到一個指定的頁面的功能。
一、定義了一個Page類和PageHelper類。
Page.java
public class Page {
//-----------------數據庫相關參數-----------------
//默認每頁顯示記錄數?
private int perPage = 10;
//頁碼
private int page = 1;
//記錄總數
private int total = 0;
//開始記錄數(新的遊標起始位置)
private int startRs=0;
//翻頁的url(路徑),不帶參數,參數由其它屬性指定
private String url = "";
//------------------頁面相關參數------------------
//首頁
private String firstPage = "";
//上一頁
private String prePage = "";
//下一頁
private String nextPage = "";
//最後一頁
private String lastPage = "";
//每頁顯示記錄數
private String numPage = "";
//跳轉到第幾頁
private String jumpPage = "";
//總頁數
private int totalPage = 1;
//
private String hql = "";
public Page() {
}
//省略getXXX()和setXXX()
PageHelper.java
public class PageHelper {
private boolean isHaveParam = false;//是否有參數?
public PageHelper() {
//
}
/**
* 用於計算用戶自定義每頁顯示記錄數
*
* @return
*/
public int doCustomPerPage(int customPerPage) {
int perPage = customPerPage;
String cPerPage = String.valueOf(perPage);
if (!"".equals(cPerPage)) {
ActionContext.getContext().getSession().put(Constant.COUNT_PERPAGE,cPerPage);
}
String cUserPerPage =
(String) ActionContext.getContext().getSession().get(Constant.COUNT_PERPAGE);
if (null != cUserPerPage) {
perPage = Integer.parseInt(cUserPerPage);
}
return perPage;
}
public Page getNextPageObject(Page pageObject) {
int page = 1;
int total = 0;
int perPage = 20;
// 取分頁器參數
//頁碼
page = pageObject.getPage();
//總記錄數
total = pageObject.getTotal();
//每頁顯示的記錄數
perPage = pageObject.getPerPage();
//需要分頁的action名稱
String url = pageObject.getUrl();
boolean display1 = false;//有首頁?
boolean display2 = false;//有上一頁?
boolean display3 = false;//有下一頁?
boolean display4 = false;//有最後一頁?
//總頁數
int totalPage = (total + perPage - 1) / perPage;
if (page > totalPage || page < 0) {
page = 1;
}
// 首頁
StringBuffer firstPageBuffer = new StringBuffer();
if (totalPage > 1) {
if(isHaveParam){
firstPageBuffer.append(url + "&pageNo=1");
}else{
firstPageBuffer.append(url + "?pageNo=1");
}
display1 = true;
}
// 上一頁?
StringBuffer prePageBuffer = new StringBuffer();
if (page > 1) {
if(isHaveParam){
prePageBuffer.append(url + "&pageNo=" + (page - 1));
}else{
prePageBuffer.append(url + "?pageNo=" + (page - 1));
}
display2 = true;
}
// 下一頁?
StringBuffer nextPageBuffer = new StringBuffer();
if (page < totalPage) {
if(isHaveParam){
nextPageBuffer.append(url + "&pageNo=" + (page + 1));
}else{
nextPageBuffer.append(url + "?pageNo=" + (page + 1));
}
display3 = true;
}
// 最後一頁?
StringBuffer lastPageBuffer = new StringBuffer();
if (totalPage > 1) {
if(isHaveParam){
lastPageBuffer.append(url + "&pageNo=" + totalPage);
}else{
lastPageBuffer.append(url + "?pageNo=" + totalPage);
}
display4 = true;
}
// 每頁顯示記錄數?
StringBuffer numPageBuffer = new StringBuffer();
numPageBuffer.append("<select name=/"perPage/" ");
numPageBuffer.append(" οnchange=/"");
numPageBuffer.append(" if(this.options[this.selectedIndex]");
numPageBuffer.append(".value!=''){");
if(isHaveParam){
numPageBuffer.append(" location='" + url + "&");
}else{
numPageBuffer.append(" location='" + url + "?");
}
numPageBuffer.append("pageNo=1");
numPageBuffer.append("&perPageCount='+this.options[this.selectedIndex]");
numPageBuffer.append(".value;}/">");
for (int i = 1; i <= 4; i++) {
numPageBuffer.append("<option value=/"" + (i * 10) + "/"");
if ((i * 10) == perPage) {
numPageBuffer.append(" selected>" + (i * 10) + "</option>");
} else {
numPageBuffer.append(">" + (i * 10) + "</option>");
}
}
numPageBuffer.append("</select>");
pageObject.setNumPage(numPageBuffer.toString());
// 跳轉到第幾頁
StringBuffer jumpPageBuffer = new StringBuffer();
jumpPageBuffer.append("<select name=/"pages/"");
jumpPageBuffer.append(" οnchange=/"");
jumpPageBuffer.append(" if(this.options[this.selectedIndex]");
if(isHaveParam){
jumpPageBuffer.append(".value!=''){location='" + url + "&");
}else{
jumpPageBuffer.append(".value!=''){location='" + url + "?");
}
jumpPageBuffer.append("pageNo='+this.options[this.selectedIndex]");
jumpPageBuffer.append(".value;}/">");
for (int i = 1; i <= totalPage; i++) {
jumpPageBuffer.append("<option value=/"" + i + "/"");
if (i == page) {
jumpPageBuffer.append("selected");
}
jumpPageBuffer.append(">" + i + "</option>");
}
jumpPageBuffer.append("</select>");
pageObject.setJumpPage(jumpPageBuffer.toString());
pageObject.setTotal(total);
pageObject.setPage(page);
pageObject.setTotalPage(totalPage);
if (display1) {
pageObject.setFirstPage("<A HREF=/""+firstPageBuffer.toString()+"/">首 頁</A>");
}else{
pageObject.setFirstPage("首 頁");
}
if (display2) {
pageObject.setPrePage("<A HREF=/""+prePageBuffer.toString()+"/">上一頁</A>");
}else{
pageObject.setPrePage("上一頁");
}
if (display3) {
pageObject.setNextPage("<A HREF=/""+nextPageBuffer.toString()+"/">下一頁</A>");
}else{
pageObject.setNextPage("下一頁");
}
if (display4) {
pageObject.setLastPage("<A HREF=/""+lastPageBuffer.toString()+"/">尾 頁</A>");
}else{
pageObject.setLastPage("尾 頁");
}
pageObject.setNumPage(numPageBuffer.toString());
pageObject.setJumpPage(jumpPageBuffer.toString());
return pageObject;
}
/**
* @return Returns the isHaveParam.
*/
public boolean isHaveParam() {
return isHaveParam;
}
/**
* @param isHaveParam The isHaveParam to set.
*/
public void setHaveParam(boolean isHaveParam) {
this.isHaveParam = isHaveParam;
}
}
Page類主要是存儲分頁時每頁的相關信息,PageHelper類主要是根據用戶通過URL送來的參數設置Page對象的相關屬性,然後再用這些屬性設置頁面中的分頁。
二、頁面中的代碼
<!--
<table width="20%" align="center"><tr><td height="5"></td></tr></table>
<table width="75%" align=center cellpadding="0" cellspacing="0" bgcolor="#F4F4F4" style="border: 1 solid #CCCCCC">
<thead>
<tr>
<td height="30"> 共 <font color=blue><ww:property value="page.total"/></font> 條記錄
<ww:property value="page.firstPage"/>
<ww:property value="page.prePage"/>
<ww:property value="page.nextPage"/>
<ww:property value="page.lastPage"/>
頁次:<ww:property value="page.page"/>/<ww:property value="page.totalPage"/>
每頁顯示 <ww:property value="page.numPage"/> 條
跳轉到第 <ww:property value="page.jumpPage"/> 頁</td>
</tr>
</thead>
</table>
-->
主要是把page對象的屬性通過Webwork中定義的標籤顯示在頁面中。
三、Action中的調用代碼
public String execute() throws Exception{
if (logger.isDebugEnabled()) {
logger.debug("teamId="+teamId+"--載入日誌成功!");
}
user = (User)ActionContext.getContext().getSession().get(Constant.LOGIN_USER_KEY);
//如果是用戶,設定組織編號。如果是領導,則通過參數給組織編號賦值。
if( (null == teamId) || ("".equals(teamId))){
this.setTeamId(user.getOrgan().getId());
}
int perPage = 10;
String totalHql =
"select count(*) from Log as log where log.user.organ.id='"+teamId+"'";
PageHelper pageHelper = new PageHelper();
if(perPageCount != -1){
perPage = pageHelper.doCustomPerPage(perPageCount);
}
Page pageObj = new Page();
pageObj.setPerPage(perPage);
pageObj.setPage(pageNo);
pageObj.setHql(" from Log log order by log.id desc where log.user.organ.id='"+teamId+"'");
pageObj.setTotal(this.logDao.getTotal(totalHql));
if(user.isLeader()){
this.setTeams(logDao.listTeams());
pageHelper.setHaveParam(true);
pageObj.setUrl("listlogs"+Constant.FILE_SUFFIX+"?teamId="+teamId);
}else{
pageObj.setUrl("listlogs"+Constant.FILE_SUFFIX);
}
pageObj.setStartRs((pageNo-1) * perPage);
page = pageHelper.getNextPageObject(pageObj);
//列出組織
this.setLogs(this.logDao.getList(page));
//根據組織ID獲得名稱
this.setTeamName(logDao.getNameById(teamId));
if (logger.isDebugEnabled()) {
logger.debug("載入session用戶成功!");
}
return SUCCESS;
}