/** * 分页标签 * @author WangZongHuan */ public class SplitPageTag extends SimpleTagSupport{ /** * 显示模式 */ private int pageModel = 1; /** * 是否支持查询 */ private boolean isQuery = true; /** * 主题颜色 */ private String color = "#666666"; //#2A6496 #406518 #F16C32 #406518 /** * DIV Class 名称 */ private String divClassName = "split_page_tag_" + UUID.randomUUID(); /** * 表单中当前页字段ID */ private String pageIndexId; /** * 显示长度 */ private int length = 5; /** * 当前页码 */ private int pageIndex; /** * 显示条数 */ private int pageSize; /** * 总页数 */ private int pageCount; /** * 总条数 */ private int recordCount; /** * 跳转路径或者表单ID */ private String url; @Override public void doTag() throws JspException, IOException { StringBuffer content = new StringBuffer(); if(recordCount > 0){ if (pageSize > recordCount){ pageSize = recordCount; } /** 计算出总页数 */ pageCount = (recordCount % pageSize == 0) ? recordCount / pageSize : recordCount / pageSize + 1; if (pageIndex > pageCount){ pageIndex = pageCount; } switch (pageModel) { case 1: content = splitPageTagModel1(isQuery); break; case 2: content = splitPageTagModel2(isQuery); break; default: content = splitPageTagModel1(isQuery); break; } }else{ content.append("<div>没有任何记录!</div>"); } getJspContext().getOut().println(content.toString().trim()); } /** * 第一种分页 * @param isQuery 是否可以查询 * @return content 标签内容 */ private StringBuffer splitPageTagModel1(boolean isQuery){ //替换标识 String REPLACE_FLAG = "###"; //判断是否为表单提交 boolean isFormSubmit = isFormSubmit(url); //当前页的项 String CURRENT_PAGE_LI = "<li class=\"number_li current_page_li\">"; //没有链接的文字项 String NO_LINK_TEXT_LI = "<li class=\"text_li no_link_li\">"; //有链接的文字项 String LINK_TEXT_LI = ""; if(isFormSubmit){ LINK_TEXT_LI = "<li class=\"text_li\" οnmοusemοve=\"splitPage_over(this);\" οnmοuseοut=\"splitPage_out(this);\" οnclick=\"splitPage_submitForm('" + url + "'," + REPLACE_FLAG + ");\">"; }else{ LINK_TEXT_LI = "<li class=\"text_li\" οnmοusemοve=\"splitPage_over(this);\" οnmοuseοut=\"splitPage_out(this);\" οnclick=\"splitPage_submitUrl('" + REPLACE_FLAG + "');\">"; } //没有链接的数字项 String NO_LINK_NUMBER_LI = "<li class=\"number_li no_link_li\">"; //有链接的数字项 String LINK_NUMBER_LI = ""; if(isFormSubmit){ LINK_NUMBER_LI = "<li class=\"number_li\" οnmοusemοve=\"splitPage_over(this);\" οnmοuseοut=\"splitPage_out(this);\" οnclick=\"splitPage_submitForm('" + url + "'," + REPLACE_FLAG + ");\">"; }else{ LINK_NUMBER_LI = "<li class=\"number_li\" οnmοusemοve=\"splitPage_over(this);\" οnmοuseοut=\"splitPage_out(this);\" οnclick=\"splitPage_submitUrl('" + REPLACE_FLAG + "');\">"; } StringBuffer content = new StringBuffer(); content.append("<div class=\""+ divClassName +"\">"); content.append("<ul>"); //上一页 if(pageIndex == 1){ content.append(NO_LINK_TEXT_LI + "上一页</li>"); }else{ content.append(createLI(isFormSubmit, String.valueOf(pageIndex - 1),"上一页", LINK_TEXT_LI, REPLACE_FLAG)); } //页数 if(pageCount <= length){ for(int i = 1; i <= pageCount; i++){ if(pageIndex == i){ content.append(CURRENT_PAGE_LI + i + "</li>"); }else{ content.append(createLI(isFormSubmit, String.valueOf(i), String.valueOf(i), LINK_NUMBER_LI, REPLACE_FLAG)); } } }else{ if(pageIndex < (length/2)+3){ for(int i = 1; i <= length; i++){ if(pageIndex == i){ content.append(CURRENT_PAGE_LI + i + "</li>"); }else{ content.append(createLI(isFormSubmit, String.valueOf(i), String.valueOf(i), LINK_NUMBER_LI, REPLACE_FLAG)); } } content.append(NO_LINK_NUMBER_LI + "...</li>"); content.append(createLI(isFormSubmit, String.valueOf(pageCount), String.valueOf(pageCount), LINK_NUMBER_LI, REPLACE_FLAG)); }else if(pageIndex >= pageCount - (length/2)-1){ content.append(createLI(isFormSubmit, String.valueOf(1), String.valueOf(1), LINK_NUMBER_LI, REPLACE_FLAG)); content.append(NO_LINK_NUMBER_LI + "...</li>"); for(int i = pageCount - (length-1); i <= pageCount; i++){ if(pageIndex == i){ content.append(CURRENT_PAGE_LI + i + "</li>"); }else{ content.append(createLI(isFormSubmit, String.valueOf(i), String.valueOf(i), LINK_NUMBER_LI, REPLACE_FLAG)); } } }else{ content.append(createLI(isFormSubmit, String.valueOf(1), String.valueOf(1), LINK_NUMBER_LI, REPLACE_FLAG)); content.append(NO_LINK_NUMBER_LI + "...</li>"); for(int i = (length/2); i >= 1; i--){ content.append(createLI(isFormSubmit, String.valueOf(pageIndex - i), String.valueOf(pageIndex - i), LINK_NUMBER_LI, REPLACE_FLAG)); } content.append(CURRENT_PAGE_LI + pageIndex + "</li>"); for(int i = 1; i <= (length/2); i++){ content.append(createLI(isFormSubmit, String.valueOf(pageIndex + i), String.valueOf(pageIndex + i), LINK_NUMBER_LI, REPLACE_FLAG)); } content.append(NO_LINK_NUMBER_LI + "...</li>"); content.append(createLI(isFormSubmit, String.valueOf(pageCount), String.valueOf(pageCount), LINK_NUMBER_LI, REPLACE_FLAG)); } } //下一页 if(pageIndex == pageCount){ content.append(NO_LINK_TEXT_LI + "下一页</li>"); }else{ content.append(createLI(isFormSubmit, String.valueOf(pageIndex + 1), "下一页", LINK_TEXT_LI, REPLACE_FLAG)); } content.append("</ul>"); if(isQuery){ content.append("<span class=\"text_span\">"); content.append("共" + pageCount + "页 "); content.append("第 <input type=\"text\" id=\"splitPage_pageNumber\" value=\"" + pageIndex + "\" style=\"height:19px; width:35px; text-align:center;\"/> 页 "); if(isFormSubmit){ content.append(" <span class=\"go_span\" οnclick=\"splitPage_query('"+ url +"');\">GO</span>"); }else{ content.append(" <span class=\"go_span\" οnclick=\"splitPage_query();\">GO</span>"); } content.append("</span>"); } content.append("<div style=\"clear: left;\"></div>"); content.append("</div>"); //样式和脚本 content.append("<script type=\"text/javascript\">") .append("function splitPage_submitUrl(url){ document.location.href = encodeURI(url); }") .append("function splitPage_submitForm(formID,pageIndex){var pageIndexId = '" + pageIndexId + "'; if(pageIndexId == 'null' || pageIndexId == \"\"){ alert(\"表单提交需提供pageIndexId参数!\"); return false; } ") .append("var form = document.getElementById(formID); var pageIndexInput = document.getElementById(pageIndexId);") .append("if(form == null){ alert(\"未找到ID为\" + formID + \"的表单!\"); return false; }") .append("if(pageIndexInput == null){ alert(\"未找到ID为\"+ pageIndexId + \"的文本框!\"); return false; }") .append("pageIndexInput.value = pageIndex; form.submit(); }") .append("function splitPage_query(formID){ var num = document.getElementById(\"splitPage_pageNumber\").value;") .append("if (isNaN(num) || num < 1 || num >"+ pageCount +"){ alert(\"请输入[1-"+ pageCount +"]范围内页码!\"); return false; }") .append("if(formID != null && formID != \"\"){splitPage_submitForm(formID,num);} else {var tempUrl = '" + url + "'.replace(\"{0}\",num); splitPage_submitUrl(tempUrl);} }") .append("function splitPage_over(target){ target.style.color = \"#2A6496\"; target.style.backgroundColor = \"#EEEEEE\"; target.style.cursor = \"pointer\"; target.style.borderColor = \"" + color + "\"; }") .append("function splitPage_out(target){ target.style.color = \"\"; target.style.backgroundColor = \"\"; target.style.cursor = \"\"; target.style.borderColor=\"\"; }") .append("</script>") .append("<style type=\"text/css\">") .append("."+ divClassName +"{ margin-top:5px; font-family:\"宋体\";}") .append("."+ divClassName +" ul{ margin:0px; padding:0px; list-style:none; font-size:12px; }") .append("."+ divClassName +" ul li{ float:left; margin:0px; border:solid 1px #cccccc; height:22px;") .append(" line-height:22px; display:block; margin-left:5px;color:" + color + "; padding:1px 8px 0px 8px; text-align:center; }") .append("."+ divClassName +" ul li.number_li{ }") .append("."+ divClassName +" ul li.text_li{ }") .append("."+ divClassName +" ul li.current_page_li{ background-color:" + color + "; font-weight:bolder; color:#FFFFFF;}") .append("."+ divClassName +" ul li.no_link_li{ color:#cccccc; }") .append("."+ divClassName +" .text_span{ font-size:12px; margin:3px 0px 0px 10px; color:#999999; float:left;}") .append("."+ divClassName +" .text_span .go_span{ padding:4px 10px 2px 10px; font-weight:bold; ") .append(" color:#FFFFFF; background-color:" + color + "; cursor:pointer; }") .append("</style>"); return content; } /** * 第二种分页 * @param isQuery 是否可以查询 * @return content 标签内容 */ private StringBuffer splitPageTagModel2(boolean isQuery){ StringBuffer content = new StringBuffer(); content.append("<div>第二种分页</div>"); return content; } /** * 判断是否表单提交 * @param url 提交路径或者表单ID * @return true 表单提交 false 路径提交 */ private boolean isFormSubmit(String url){ return url.indexOf("{0}") == -1 ? true : false; } /** * 创建LI(适用于模型1) * @param isFormSubmit 是否为表单提交 * @param pageIndex 当前页码 * @param linkText 链接显示的文字 * @param LI LI标签前部分 * @param REPLACE_FLAG 替换表示符 * @return LI标签字符串 */ private String createLI(boolean isFormSubmit,String pageIndex,String linkText,String LI,String REPLACE_FLAG){ StringBuffer content = new StringBuffer(); if(!isFormSubmit){ String tempUrl = url.replace("{0}", pageIndex); //将路径中的标识符替换成当前页码 content.append(LI.replace(REPLACE_FLAG, tempUrl) + linkText + "</li>"); }else{ content.append(LI.replace(REPLACE_FLAG, pageIndex) + linkText + "</li>"); } return content.toString(); } public int getPageModel() { return pageModel; } public void setPageModel(int pageModel) { this.pageModel = pageModel; } public int getPageIndex() { return pageIndex; } public void setPageIndex(int pageIndex) { if (pageIndex < -1){ pageIndex = 1; }else{ this.pageIndex = pageIndex; } } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { if (pageSize < 1){ this.pageSize = 1; }else{ this.pageSize = pageSize; } } public int getPageCount() { return pageCount; } public void setPageCount(int pageCount) { this.pageCount = pageCount; } public int getRecordCount() { return recordCount; } public void setRecordCount(int recordCount) { this.recordCount = recordCount; } public boolean getIsQuery() { return isQuery; } public void setIsQuery(boolean isQuery) { this.isQuery = isQuery; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public int getLength() { return length; } public void setLength(int length) { this.length = length; } public String getPageIndexId() { return pageIndexId; } public void setPageIndexId(String pageIndexId) { this.pageIndexId = pageIndexId; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } } |