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
搭建请参考