package com.org.utils.taglib;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class PageTag extends SimpleTagSupport {
// 提交URL的一個約定的格式: pageSerlvet?pageIndex={0}
private static final String TEG = "{0}";
private String parms;
// 當前頁數
private int pageIndex;
// 一頁顯示的數量
private int pageSize;
// 記錄總條數
private int recordCount;
// 提交的URL
private String submitUrl;
// 定義總共的頁數
private int pageCount;
//每頁顯示的實際數量
private int pageRealSize;
public int getPageRealSize() {
return pageRealSize;
}
public void setPageRealSize(int pageRealSize) {
this.pageRealSize = pageRealSize;
}
/**
* Pre前一頁
* Next下一頁
* «向←左left
* »向→右right
*
*/
public void doTag() throws JspException, IOException {
StringBuilder pageWrapStr = new StringBuilder();
StringBuffer pageNumberStr = new StringBuffer();
if(parms==null || parms.isEmpty() || parms.trim().length()==0){
}else{
submitUrl+="&"+this.getParms();
}
// 先判斷記錄總條數
if (recordCount > 0) {
// 計算出總共的頁數
pageCount = (recordCount % pageSize == 0) ? (recordCount / pageSize)
: (recordCount / pageSize) + 1;
// 判斷總頁數與當前頁數的關係
pageIndex = (pageIndex >= pageCount) ? pageCount : pageIndex;
//計算該頁實際顯示記錄數
if(pageIndex<pageCount){
pageRealSize=pageSize;
}else{
pageRealSize=recordCount-pageSize*(pageIndex-1);
}
pageWrapStr.append(" <div class='page-number-strip' style='height:62px;'> ");//page-number-strip
// 確定上一頁與下頁是否加鏈接
String tempUrl1 = submitUrl.replace(TEG, String.valueOf(1));
pageNumberStr.append("<ul class='pagination'>");//添加boostrap分頁樣式
pageNumberStr.append("<li><a href='" + tempUrl1 + "'>«</a> </li>");
if (pageIndex == 1) { // 當前頁數爲第一頁時
pageNumberStr.append("<li><span>Pre</span> </li>"); // 頭
// 中間
calculatePage(pageNumberStr);
// 尾
if (pageCount == 1) {
pageNumberStr.append("<li><span>Next</span> </li>");
} else {
String tempUrl = submitUrl.replace(TEG,String.valueOf(pageIndex + 1));
pageNumberStr.append("<li><a href='" + tempUrl + "'>Next</a> </li>");
}
} else if (pageIndex == pageCount) { // 當前頁數爲最後一頁時
String tempUrl = submitUrl.replace(TEG, String.valueOf(pageIndex - 1));
pageNumberStr.append("<li><a href='" + tempUrl + "'>Pre</a> </li>");
// 中間
calculatePage(pageNumberStr);
// 最後一頁
pageNumberStr.append("<li><span>Next</span>");
} else { // 當前頁數爲中間時
String tempUrl = submitUrl.replace(TEG, String.valueOf(pageIndex - 1));
pageNumberStr.append("<li><a href='" + tempUrl + "'>Pre</a> </li>");
// 中間
calculatePage(pageNumberStr);
// 尾
tempUrl = submitUrl.replace(TEG, String.valueOf(pageIndex + 1));
pageNumberStr.append("<li><a href='" + tempUrl + "'>Next</a> </li>");
}
String tempUrl2 = submitUrl.replace(TEG, String.valueOf(pageCount));
pageNumberStr.append("<li><a href='" + tempUrl2 + "'>»</a> </li>");
pageNumberStr.append("<li> 跳到<input type='text' id='page_number_id' size='1' value='"+pageIndex+"' sytle='margin-top:5px;'/>頁 </li>");
pageNumberStr.append("<li><a>" + pageRealSize + "/" + recordCount + "items of p" + pageCount + " </a></li>");
pageNumberStr.append("<li><input type='button' value='確定' class='btn-page-confirm' style='color:#fff' οnclick='doJumpPage();'/></li>");
pageNumberStr.append("</ul>");
// 加上跳轉信息\顯示信息
pageWrapStr.append(pageNumberStr.toString());
pageWrapStr.append(" </div> ");
// 第二行拼接分頁提示信息/ 計算出顯錄的開始記錄條數與結束的記錄條數
int startNum = (pageIndex - 1) * pageSize + 1;
int endNum = (pageIndex == pageCount) ? recordCount : pageIndex * pageSize;
// 最後拼接JavaScript代碼
pageWrapStr.append("<script type=\"text/javascript\">");
pageWrapStr.append("var doJumpPage = function(){");
pageWrapStr.append("var pageCount = " + pageCount + ";");
pageWrapStr.append("var url = '" + submitUrl + "';");
pageWrapStr.append("var regu='^[0-9]+$'; var re=new RegExp(regu);");
pageWrapStr.append("var num = document.getElementById('page_number_id').value;");
pageWrapStr.append("if(num.search(re)==-1){alert('請輸入整數!'); return false}");
pageWrapStr.append("if (isNaN(num) || num < 1 || num > pageCount){alert('請輸入1-"+ pageCount + "範圍內的頁碼!');return false;}");
pageWrapStr.append("var tempUrl = url.replace('" + TEG + "', num);");
pageWrapStr.append("window.location.href = tempUrl;");
pageWrapStr.append("}</script>");
//num != Integer.parseInt(num) ||
}
// 如果記錄條數小於等於0,直接輸出
else {
pageWrapStr.append("<table align='center' style='font-size:14px;'><tr><td>");
pageWrapStr.append("總共<span style='color:red;'>0</span>條記錄,當前顯示0-0條記錄。");
pageWrapStr.append("</td></tr></table>");
}
// 輸出
this.getJspContext().getOut().println(pageWrapStr.toString());
}
/**
* 計算中間部分 [1]...[2][3]...[100]
*
* @param buder
*/
private void calculatePage(StringBuffer buder) {
// 總頁數小於等於10
if (pageCount <= 10) {
for (int i = 1; i <= pageCount; i++) {
// 判斷哪一個是當前頁
if (i == pageIndex) {
buder.append("<li><span style='color:red;' >" + i + "</span> </li>");
} else {
String tempUrl = submitUrl.replace(TEG, String.valueOf(i));
buder.append("<li><a href='" + tempUrl + "'>" + i + "</a> </li>");
}
}
} else { // 三種情況: 靠近第一頁\靠近最後一頁\中間
if (pageIndex <= 8) { // 靠近第一頁
for (int i = 1; i < 10; i++) {
// 判斷哪一個是當前頁
if (i == pageIndex) {
buder.append("<li><span style='color:red;' >" + i + "</span> </li>");
} else {
String tempUrl = submitUrl.replace(TEG, String.valueOf(i));
buder.append("<li><a href='" + tempUrl + "'>" + i + "</a> </li>");
}
}
// 後面部分加上更多
String tempUrl = submitUrl.replace(TEG, String.valueOf(pageCount));
buder.append("<li><a href='javascript:void(0);'>...</a></li>").append("<li><a href='" + tempUrl + "'>" + pageCount + "</a> </li>");
} else if (pageIndex > pageCount - 8) { // 靠近最後一頁
// 前面部分加上更多[1]...
String tempUrl = submitUrl.replace(TEG, String.valueOf(1));
buder.append("<li><a href='" + tempUrl + "'>1</a> </li>").append("<li><a href='javascript:void(0);'>...</a></li>");
for (int i = pageCount - 8; i <= pageCount; i++) {
if (i == pageIndex) {
buder.append("<li><span style='color:red;' >" + i + "</span> </li>");
} else {
tempUrl = submitUrl.replace(TEG, String.valueOf(i));
buder.append("<li><a href='" + tempUrl + "'>" + i + "</a> </li>");
}
}
} else { // 中間
// 前面部分加上更多[1]...
String tempUrl = submitUrl.replace(TEG, String.valueOf(1));
buder.append("<li><a href='" + tempUrl + "'>1</a> </li>").append("<li><a href='javascript:void(0);'>...</a></li>");
for (int i = pageIndex - 4; i <= pageIndex + 4; i++) {
if (i == pageIndex) {
buder.append("<li><span style='color:red;' >" + i + "</span> </li>");
} else {
tempUrl = submitUrl.replace(TEG, String.valueOf(i));
buder.append("<li><a href='" + tempUrl + "'>" + i + "</a> </li>");
}
}
// 後面部分加上更多
tempUrl = submitUrl.replace(TEG, String.valueOf(pageCount));
buder.append("<li><a href='javascript:void(0);'>...</a></li>").append("<li><a href='" + tempUrl + "'>" + pageCount + "</a></li>");
}
}
}
/** setter and getter method */
public int getPageIndex() {
return pageIndex;
}
public void setPageIndex(int pageIndex) {
this.pageIndex = (pageIndex < 1) ? 1 : pageIndex;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getRecordCount() {
return recordCount;
}
public void setRecordCount(int recordCount) {
this.recordCount = recordCount;
}
public String getSubmitUrl() {
return submitUrl;
}
public void setSubmitUrl(String submitUrl) {
this.submitUrl = submitUrl;
}
public String getParms() {
StringBuffer ps=new StringBuffer();
if(parms!=null && parms.length()>0){
//分離參數 A=b
String[] parmsArr=parms.split("&");
for(int i=0;i<parmsArr.length;i++){
String parmstemp=parmsArr[i];
String[] parmsEqArr=parmstemp.split("=");
//分離參數 鍵 值
try {
ps.append(i > 0 ? "&" : "");
ps.append(parmsEqArr[0]).append("=");
if(parmsEqArr.length>1){
ps.append( URLEncoder.encode(parmsEqArr[1],"UTF-8"));
}
} catch (UnsupportedEncodingException e) {
return "";
}
}
}
return ps.toString();
}
public void setParms(String parms) {
this.parms = parms;
}
}
http://download.csdn.net/detail/jilongliang/7302995
搭建請參考