自定義標籤分頁源代碼
第一步:創建一個計算分頁總數和生成分頁腳本的類;PageControllerTag.java
源代碼如下:
package org.luojs.tag;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class PageControllerTag extends BodyTagSupport {
/** 每頁顯示的記錄數(標籤的屬性) */
private int pageSize = 5;
/** 目的地(標籤的屬性) */
private String gotoURI;
/** 總記錄數名 */
public static final String TOTAL = "total";
/** 當前頁號名 */
public static final String PAGNENO = "pageNo";
/** 每頁要顯示的記錄數名 */
public static final String RECORDCOUNT = "pageSize";
/** 目的地名 */
public static final String GOTOURI = "gotoURI";
// 標籤處理程序
public int doStartTag() throws JspException {
/** 當前頁號(從請求對象中得到) */
int pageNo = 1;
/** 總記錄數(從請求對象中得到) */
int total = 0;
/** 總頁數(計算得出) */
int totalPage = 1;
HttpServletRequest request = (HttpServletRequest) pageContext
.getRequest();
// 要輸出到頁面的HTML文本
StringBuffer sb = new StringBuffer();
sb.append("\r\n<form method='post' action='' ").append(
"name='pageController'>\r\n");
// 獲取所有提交的參數(包括查詢條件參數)
Enumeration enumeration = request.getParameterNames();
String name = null;
String value = null;
while (enumeration.hasMoreElements()) {
name = (String) enumeration.nextElement();
value = request.getParameter(name);
if (name.equals(RECORDCOUNT)) {
continue;
}
// 從請求對象中獲取要跳轉到的頁號
if (name.equals(PAGNENO)) {
if (null != value && !"".equals(value)) {
pageNo = Integer.parseInt(value);
}
continue;
}
sb.append("<input type='hidden' name='").append(name).append(
"' value='").append(value).append("'/>\r\n");
}
// 把當前頁號設置成請求參數
sb.append("<input type='hidden' name='").append(PAGNENO).append(
"' value='").append(pageNo).append("'/>\r\n");
// 從請求對象中獲取總記錄數
String tot = (String) request.getAttribute(TOTAL);
if (null != tot && !"".equals(tot)) {
total = Integer.parseInt(tot);
}
// 計算總頁數
totalPage = getTotalPage(total);
System.out.println("total-->" + total);
sb.append("<br/>\r\n");
sb
.append(" \r\n");
sb.append("共 ").append(totalPage).append(" 頁 當前第 ").append(pageNo)
.append(" 頁\r\n");
sb
.append(" \r\n");
if (pageNo == 1) {
sb.append("首頁");
sb.append(" ");
sb.append("上一頁\r\n");
} else {
sb.append("<a href='#' onclick='turnOverPage(1)'>首頁</a>\r\n");
sb.append(" ");
sb.append("<a href='#' onclick='turnOverPage(")
.append((pageNo - 1)).append(")'>上一頁</a>\r\n");
}
sb.append(" ");
if (pageNo == totalPage) {
sb.append("下一頁");
sb.append(" ");
sb.append("尾頁\r\n");
} else {
sb.append("<a href='#' onclick='turnOverPage(")
.append((pageNo + 1)).append(")'>下一頁</a>\r\n");
sb.append(" ");
sb.append("<a href='#' onclick='turnOverPage(").append(totalPage)
.append(")'>尾頁</a>\r\n");
}
sb.append(" ");
sb.append("跳轉到<select onChange='turnOverPage(this.value)'>\r\n");
for (int i = 1; i <= totalPage; i++) {
if (i == pageNo) {
sb.append(" <option value='").append(i).append("' selected>第")
.append(i).append("頁</option>\r\n");
} else {
sb.append(" <option value='").append(i).append("'>第")
.append(i).append("頁</option>\r\n");
}
}
sb.append("</select>\r\n");
sb.append(" \r\n");
sb.append("</form>\r\n");
// 生成提交表單的JS
sb.append("<script language='javascript'>\r\n");
sb.append(" function turnOverPage(no){\r\n");
sb.append(" var form = document.pageController;\r\n");
sb.append(" //頁號越界處理\r\n");
sb.append(" if(no").append(">").append(totalPage).append(") {\r\n");
sb.append(" no=").append(totalPage).append(";\r\n");
sb.append(" }\r\n");
sb.append(" if(no").append("<=0){\r\n");
sb.append(" no=1;\r\n");
sb.append(" }\r\n");
sb.append(" form.").append(PAGNENO).append(".value=no;\r\n");
sb.append(" form.action='").append(gotoURI).append("';\r\n");
sb.append(" form.submit();\r\n");
sb.append(" }\r\n");
sb.append("</script>\r\n");
try {
pageContext.getOut().println(sb.toString());
} catch (IOException e) {
e.printStackTrace();
}
return super.doStartTag();
}
public String getGotoURI() {
return gotoURI;
}
public void setGotoURI(String gotoURI) {
this.gotoURI = gotoURI;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
/**
* 根據總記錄數得到總頁數
*
* @return int 總頁數
*/
private int getTotalPage(int total) {
int totalPage = 1;
if (total == 0) {
totalPage = 1;
} else {
totalPage = (total % pageSize == 0) ? (total / pageSize) : (total
/ pageSize + 1);
}
return totalPage;
}
}