package ssh.core.orm;import java.util.ArrayList;import java.util.List;import org.apache.commons.lang.StringUtils;import com.google.common.collect.Lists;public class Page<T> {//-- 公開變數 --//public static final String ASC = "asc";public static final String DESC = "desc";//-- 分頁參數 --//protected int pageNo = 1;protected int pageSize = 1;protected String orderBy = null;protected String order = null;protected boolean autoCount = true; //-- 返回結果 --//protected List<T> result = Lists.newArrayList();protected long totalCount = -1; private List list = new ArrayList(0); //存放資料 private int barNumbers = 10; //幾個為一條,預設為10 private List listNumbers = new ArrayList(); //數字翻頁條 //-- 建構函式 --//public Page() {}public Page(int pageSize) {this.pageSize = pageSize;}//-- 訪問查詢參數函數 --///** * 獲得當前頁的頁號,序號從1開始,預設為1. */public int getPageNo() {return pageNo;}/** * 設定當前頁的頁號,序號從1開始,低於1時自動調整為1. */public void setPageNo(final int pageNo) {this.pageNo = pageNo;if (pageNo < 1) {this.pageNo = 1;}}public Page<T> pageNo(final int thePageNo) {setPageNo(thePageNo);return this;}/** * 獲得每頁的記錄數量,預設為1. */public int getPageSize() {return pageSize;}/** * 設定每頁的記錄數量,低於1時自動調整為1. */public void setPageSize(final int pageSize) {this.pageSize = pageSize;if (pageSize < 1) {this.pageSize = 1;}}public Page<T> pageSize(final int thePageSize) {setPageSize(thePageSize);return this;}/** * 根據pageNo和pageSize計算當前頁第一條記錄在總結果集中的位置,序號從1開始. */public int getFirst() {return ((pageNo - 1) * pageSize) + 1;}/** * 獲得排序欄位,無預設值.多個排序欄位時用','分隔. */public String getOrderBy() {return orderBy;}/** * 設定排序欄位,多個排序欄位時用','分隔. */public void setOrderBy(final String orderBy) {this.orderBy = orderBy;}public Page<T> orderBy(final String theOrderBy) {setOrderBy(theOrderBy);return this;}/** * 獲得排序方向. */public String getOrder() {return order;}/** * 設定排序方式向. * * @param order 可選值為desc或asc,多個排序欄位時用','分隔. */public void setOrder(final String order) {//檢查order字串的合法值String[] orders = StringUtils.split(StringUtils.lowerCase(order), ',');for (String orderStr : orders) {if (!StringUtils.equals(DESC, orderStr) && !StringUtils.equals(ASC, orderStr)) {throw new IllegalArgumentException("排序方向" + orderStr + "不是合法值");}}this.order = StringUtils.lowerCase(order);}public Page<T> order(final String theOrder) {setOrder(theOrder);return this;}/** * 是否已設定排序欄位,無預設值. */public boolean isOrderBySetted() {return (StringUtils.isNotBlank(orderBy) && StringUtils.isNotBlank(order));}/** * 查詢對象時是否自動另外執行count查詢擷取總記錄數, 預設為false. */public boolean isAutoCount() {return autoCount;}/** * 查詢對象時是否自動另外執行count查詢擷取總記錄數. */public void setAutoCount(final boolean autoCount) {this.autoCount = autoCount;}public Page<T> autoCount(final boolean theAutoCount) {setAutoCount(theAutoCount);return this;}//-- 訪問查詢結果函數 --///** * 取得頁內的記錄列表. */public List<T> getResult() {return result;}/** * 設定頁內的記錄列表. */public void setResult(final List<T> result) {this.result = result;}/** * 取得總記錄數, 預設值為-1. */public long getTotalCount() {return totalCount;}/** * 設定總記錄數. */public void setTotalCount(final long totalCount) {this.totalCount = totalCount;}/** * 根據pageSize與totalCount計算總頁數, 預設值為-1. */public long getTotalPages() {if (totalCount < 0) {return -1;}long count = totalCount / pageSize;if (totalCount % pageSize > 0) {count++;}return count;}/** * 是否還有下一頁. */public boolean isHasNext() {return (pageNo +1 <= getTotalPages());}/** * 取得下頁的頁號, 序號從1開始. * 當前頁為尾頁時仍返回尾頁序號. */public int getNextPage() {if (isHasNext()) {return pageNo + 1;} else {return pageNo;}}/** * 是否還有上一頁. */public boolean isHasPre() {return (pageNo - 1 >= 1);}/** * 取得上頁的頁號, 序號從1開始. * 當前頁為首頁時返回首頁序號. */public int getPrePage() {if (isHasPre()) {return pageNo - 1;} else {return 1;}} /** * 計算開始頁和結束頁 * * @param barNumbers 頁面中要顯示的頁面個數 * @param pageNo 當前頁 * @param totalPages 總頁面數 * @return PageIndex 記錄開始頁(startindex)和結束頁(endindex) */ public List getListNumbers( ) { List listn = new ArrayList(); int totalPages = Integer.valueOf(String.valueOf(this.getTotalPages()));int startpage = pageNo - (barNumbers % 2 == 0 ? barNumbers / 2 - 1: barNumbers / 2);int endpage = pageNo + barNumbers / 2;if (startpage < 1) {startpage = 1;if (totalPages >= barNumbers)endpage = barNumbers;elseendpage = totalPages;}if (endpage > totalPages) {endpage = totalPages;if ((endpage - barNumbers) > 0)startpage = endpage - barNumbers + 1;elsestartpage = 1;}for (int i = startpage; i <= endpage; i++) { listn.add(i); }return listn ;} public void setListNumbers(List listNumbers) {this.listNumbers = listNumbers;}public List getList() { return list; } public void setList(List list) { this.list = list; } public int getBarNumbers() { return barNumbers; } public void setBarNumbers(int barNumbers) { this.barNumbers = barNumbers; } }
頁面中使用
<div class="digg" > <a href="javascript:jumpPage(1)" style="padding-top:4px; margin-bottom:2px; margin:-3px;">首頁</a> <s:if test="page.hasPre"> <a href="javascript:jumpPage(${page.prePage})"><</a> </s:if> <s:iterator value = "page.listNumbers" var="stau" > <s:if test="#stau==page.pageNo"> <span class = "current"> <s:property /></span> </s:if> <s:else> <span> <a href="javascript:jumpPage(<s:property />)"><s:property /></a></span> </s:else></s:iterator><s:if test="page.hasNext"><a href="javascript:jumpPage(${page.nextPage})">></a></s:if><a href="javascript:jumpPage(${page.totalPages})" style="padding-top:4px; margin-bottom:2px;">末頁</a> </div>
css
DIV.digg { PADDING-RIGHT: 3px; PADDING-LEFT: 3px; PADDING-BOTTOM: 3px; MARGIN: 3px; PADDING-TOP: 3px; TEXT-ALIGN: center}DIV.digg A { BORDER-RIGHT: #aaaadd 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #aaaadd 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 2px; MARGIN: 2px; BORDER-LEFT: #aaaadd 1px solid; COLOR: #000099; PADDING-TOP: 2px; BORDER-BOTTOM: #aaaadd 1px solid; TEXT-DECORATION: none}DIV.digg A:hover { BORDER-RIGHT: #000099 1px solid; BORDER-TOP: #000099 1px solid; BORDER-LEFT: #000099 1px solid; COLOR: #000; BORDER-BOTTOM: #000099 1px solid}DIV.digg A:active { BORDER-RIGHT: #000099 1px solid; BORDER-TOP: #000099 1px solid; BORDER-LEFT: #000099 1px solid; COLOR: #000; BORDER-BOTTOM: #000099 1px solid}DIV.digg SPAN.current { BORDER-RIGHT: #000099 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #000099 1px solid; PADDING-LEFT: 5px; FONT-WEIGHT: bold; PADDING-BOTTOM: 2px; MARGIN: 2px; BORDER-LEFT: #000099 1px solid; COLOR: #fff; PADDING-TOP: 2px; BORDER-BOTTOM: #000099 1px solid; BACKGROUND-COLOR: #000099}DIV.digg SPAN.disabled { BORDER-RIGHT: #eee 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #eee 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 2px; MARGIN: 2px; BORDER-LEFT: #eee 1px solid; COLOR: #ddd; PADDING-TOP: 2px; BORDER-BOTTOM: #eee 1px solid; }
顯示效果