《王总大气-Java web项目通用分页标签》
 前言:

很久很久很久以前,山里有座庙,庙里有个老和尚.....?~!靠,sorry走神了。

其实我想说的是,在很久很久很久以前,森林里有一位白雪公主....和....七个小...混蛋~!?!又走神了?~!!(这下走得有点远,到国外去了...),sorry,sorry,sorry。

其实我想说,很久以前就有想写博客的想法了,都不知道写些啥?难道真写“庙里的老和尚”...?最近接触到一个新项目,学习到里面的一些思想;终于完成了属于自己的一套分页标签标签,觉得用起来蛮方便的,在此分享一下。

主题:

《Java Web 项目通用灵活分页标签》是一套可用于任何Java Web项目的通用标签,可用在各个项目中独立使用灵活性高,可灵活配置分页的主题样式、长度、模式等。

步骤:

         1.创建java类

   2.创建tld文件(放入WEB-INF目录下)

3. Jsp页面使用标签

1.创建java类

/**
 * 分页标签
 * @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("第&nbsp;<input type=\"text\" id=\"splitPage_pageNumber\" value=\"" + pageIndex + "\" style=\"height:19px; width:35px; text-align:center;\"/>&nbsp;页&nbsp;");
   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;
 }
 
}


2.创建tld文件(放入WEB-INF目录下)

<?xml version="1.0" encoding="utf-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
         http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0">

<tlib-version>1.0</tlib-version>
    <short-name>wzdq</short-name>
    <uri>/wzdq-tags</uri>
   
    <tag>
     <name>splitPage</name>
     <tag-class>org.wzhq.tag.SplitPageTag</tag-class>
     <body-content>scriptless</body-content>
     
     <attribute>
      <description>显示模式(默认为1)</description>
      <name>pageModel</name>
      <required>false</required>
      <fragment>true</fragment>
     </attribute>

<attribute>
      <description>主题颜色(默认为#666666)</description>
      <name>color</name>
      <required>false</required>
      <fragment>true</fragment>
     </attribute>

<attribute>
      <description>显示长度(默认为5)</description>
      <name>length</name>
      <required>false</required>
      <fragment>true</fragment>
     </attribute>

<attribute>
      <description>是否支持查询(默认为true)</description>
      <name>isQuery</name>
      <required>false</required>
      <fragment>true</fragment>
     </attribute>

<attribute>
      <description>表单中当前页码字段ID(表单方式提交时必填)</description>
      <name>pageIndexId</name>
      <required>false</required>
      <fragment>true</fragment>
     </attribute>

<attribute>
      <description>当前页码</description>
      <name>pageIndex</name>
      <required>true</required>
      <fragment>true</fragment>
     </attribute>

<attribute>
      <description>每页显示条数 </description>
      <name>pageSize</name>
      <required>true</required>
      <fragment>true</fragment>
     </attribute>

<attribute>
      <description>总条数</description>
      <name>recordCount</name>
      <required>true</required>
      <fragment>true</fragment>
     </attribute>

<attribute>
      <description>
      跳转路径或者表单ID(存在{0}代表为跳转路径,不存在时则代表是表单ID ***使用表单提交时必须提供pageIndexId参数;
      跳转路径格式:http://localhost:8080/MyTag?pageIndex={0},pageIndex是存储当前页的变量名称,
      {0}为替换符不可变。)
      </description>
      <name>url</name>
      <required>true</required>
      <fragment>true</fragment>
     </attribute>

</tag>
</taglib>

3.Jsp页面使用标签

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/wzdq-tags" prefix="w" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'index.jsp' starting page</title>
  </head>
 
  <body>
    <w:splitPage pageIndex="${param.pageIndex}" pageSize="5" recordCount="100" url="form" pageIndexId="pageIndex"></w:splitPage>
    <form action="#" id="form">
     <input type="hidden" id="pageIndex" name="pageIndex">
    </form>
  </body>
</html>

效果图:

下载地址:http://download.csdn.net/download/wangzonghuan/7004641

人生有太多的第一次,这是我的第一次,也是你的...~!? 又瞎扯了?!

初次涉猎,多多指教. 

《王总大气-Java web项目通用分页标签》相关推荐

  1. ComeFuture英伽学院——2020年 全国大学生英语竞赛【C类初赛真题解析】(持续更新)

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  2. ComeFuture英伽学院——2019年 全国大学生英语竞赛【C类初赛真题解析】大小作文——详细解析

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  3. 信息学奥赛真题解析(玩具谜题)

    玩具谜题(2016年信息学奥赛提高组真题) 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业.有一天, 这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的 ...

  4. 信息学奥赛之初赛 第1轮 讲解(01-08课)

    信息学奥赛之初赛讲解 01 计算机概述 系统基本结构 信息学奥赛之初赛讲解 01 计算机概述 系统基本结构_哔哩哔哩_bilibili 信息学奥赛之初赛讲解 02 软件系统 计算机语言 进制转换 信息 ...

  5. 信息学奥赛一本通习题答案(五)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  6. 信息学奥赛一本通习题答案(三)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  7. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  8. 信息学奥赛一本通题目代码(非题库)

    为了完善自己学c++,很多人都去读相关文献,就比如<信息学奥赛一本通>,可又对题目无从下手,从今天开始,我将把书上的题目一 一的解析下来,可以做参考,如果有错,可以告诉我,将在下次解析里重 ...

  9. 信息学奥赛一本通(C++版) 刷题 记录

    总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 刷题 记录 http://ybt.ssoier. ...

  10. 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离

    首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...

最新文章

  1. php删除目录下的所有文件和目录
  2. L - Oil Deposits HDU - 1241
  3. 调制的缺点_电光调制与声光调制原理和应用领域
  4. java实现 k nn算法_数据挖掘(二)——Knn算法的java实现
  5. Spring Boot下的Tomcat,你真的会用吗?
  6. opencv第一课 打开一个图片
  7. 直通BAT必考题系列:JVM的4种垃圾回收算法、垃圾回收机制与总结
  8. tcp状态机-三次握手-四次挥手以及常见面试题
  9. 滴滴CTO五轮面试真是太刺激了,Java高级工程师一二三四五面面经(已拿到offer)...
  10. maven mirror repository
  11. TensorFlow:曼德布洛特(Mandelbrot)集合
  12. paip.lucene 4.3 中文语义搜索最佳实践
  13. 老罗Android开发 视频教程
  14. IEEE论文投稿模板大全
  15. k8s ingress配置自签名证书,并解决Kubernetes Ingress Controller Fake Certificate
  16. RT-Thread学习笔记——事件集
  17. 使用 Anaconda 安装 Pytorch
  18. 导出anaconda的代码为pdf
  19. Java--UML类图--使用/详解
  20. 开源巨献:Google最热门的40款开源项目

热门文章

  1. 4核8G云服务器4c8g或4h8g指的是什么?
  2. 搭档之家:柯达股价异常飙升,盘内23分钟暴涨79%迎五次熔断
  3. github 拉取指定 tag 版本
  4. 龙芯杯系统能力竞赛CPU赛道参赛准备
  5. java 运行class_运行java的class文件方法详解
  6. 转载--徐小平:不做人生规划,你离挨饿只有三天
  7. 安装应用需要打开未知来源权限_OPPO手机未知来源权限在哪 OPPO手机未知来源权限设置方法...
  8. KFC门店定点查询(输入城市名称即可查询)
  9. Python面试之沪江网“数据爬虫算法实习”
  10. javaweb_一个用户注册的界面