由于工程项目的需要,自己开发了一个分页的标签:

package com.xxx.eclanswers.utils; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import org.apache.taglibs.standard.tag.el.core.ExpressionUtil; import org.springframework.util.StringUtils; import org.springframework.web.servlet.tags.RequestContextAwareTag; public class PaginationTag extends RequestContextAwareTag { /** * @author patrick.hung */ private static final long serialVersionUID = 1L; public String itemsTotal = null; public String currentNO = null; public String itemsPage = null; public String paginationUrlParam=null; private String _paginationUrlParam=""; private Integer _itemsPage = 2; private Integer _currentNO = 1; private Integer _itemsTotal = 0; private void evaluateExprssions() throws JspException { _itemsTotal = (Integer) ExpressionUtil.evalNotNull("Pagination", "itemsTotal", itemsTotal, Integer.class, this, pageContext); if (StringUtils.hasText(currentNO)) { _currentNO = (Integer) ExpressionUtil.evalNotNull("Pagination", "currentNO", currentNO, Integer.class, this, pageContext); } if (StringUtils.hasText(itemsPage)) { _itemsPage = (Integer) ExpressionUtil.evalNotNull("Pagination", "itemsPage", itemsPage, Integer.class, this, pageContext); } if(StringUtils.hasText(paginationUrlParam)) { _paginationUrlParam=(String)ExpressionUtil.evalNotNull("Pagination", paginationUrlParam, paginationUrlParam, String.class, this, pageContext); } } @Override protected int doStartTagInternal() throws Exception { evaluateExprssions(); int elements = _itemsTotal; int pageNO = elements / _itemsPage + (elements % _itemsPage == 0 ? 0 : 1); JspWriter writer = pageContext.getOut(); StringBuffer sb = new StringBuffer(500); sb.append("<mce:style type=/"text/css/"><!-- a.hcl:link,a.hcl:visited, a.hcl:active { color:#3666d4; font:13px/1.231 arial,helvetica,clean,sans-serif; font-family: arial, helvetica, 'bitstream vera sans', clean, sans-serif; border: 1px solid #ccdbe4; margin:0 5px 0 0; padding:2px 8px; text-align:center; text-decoration:none; }a.hcl:hover{color:#FFFFFF;background-color: #66FFFF;background:#3666d4;border-color:#2b55af;}a.hcl_cur:link,a.hcl_cur:visited, a.hcl_cur:active {color:#3666d4;font:13px/1.231 arial,helvetica,clean,sans-serif;font-family: arial, helvetica, 'bitstream vera sans', clean, sans-serif; border: 0px solid #ccdbe4;margin:0 5px 0 0;padding:2px 8px;text-align:center;text-decoration:none;font-weight: bold;} --></mce:style><style type=/"text/css/" mce_bogus="1">a.hcl:link,a.hcl:visited, a.hcl:active { color:#3666d4; font:13px/1.231 arial,helvetica,clean,sans-serif; font-family: arial, helvetica, 'bitstream vera sans', clean, sans-serif; border: 1px solid #ccdbe4; margin:0 5px 0 0; padding:2px 8px; text-align:center; text-decoration:none; }a.hcl:hover{color:#FFFFFF;background-color: #66FFFF;background:#3666d4;border-color:#2b55af;}a.hcl_cur:link,a.hcl_cur:visited, a.hcl_cur:active {color:#3666d4;font:13px/1.231 arial,helvetica,clean,sans-serif;font-family: arial, helvetica, 'bitstream vera sans', clean, sans-serif; border: 0px solid #ccdbe4;margin:0 5px 0 0;padding:2px 8px;text-align:center;text-decoration:none;font-weight: bold;}</style>"); if (pageNO < 4) {// the scene of the page smaller than 4. sb.append(buildPrev(_currentNO)); sb.append(processLogic(_currentNO, pageNO, -1)); } else if (pageNO > 3 && pageNO < 7) {// the scene of the page between // 3 and 7. sb.append(buildPrev(_currentNO)); if (_currentNO > 3 && _currentNO < 7) { sb.append(processLogic(_currentNO, pageNO, -1)); } else if(_currentNO<4){ sb.append(processLogic(_currentNO, pageNO, 4)); } } else if (pageNO > 6 && pageNO < 10) {// the scene of the page between 6 and 10. sb.append(buildPrev(_currentNO)); if (_currentNO > 6 && _currentNO < 10) { sb.append(processLogic(_currentNO, pageNO, -1)); } else if (_currentNO > 3 && _currentNO < 7) {//It must be in between 1 and 7. sb.append(processLogic(_currentNO, pageNO, 7)); } else { sb.append(processLogic(_currentNO, pageNO, 4)); } } else {// the scene of pageNO smaller than 10 sb.append(buildPrev(_currentNO)); if (_currentNO > 9) { for (int i = _currentNO - 8; i < _currentNO; i++) { sb.append(buildHref(i, String.valueOf(i),"hcl") + " "); } sb.append(buildHref(_currentNO, String.valueOf(_currentNO),"hcl_cur")); if (_currentNO < pageNO) {// 判断是否还有下一页 sb.append(buildHref(_currentNO + 1, "Next>","hcl")); } } else if (_currentNO < 10 && _currentNO > 6) { sb.append(processLogic(_currentNO, pageNO, 10)); } else if (_currentNO < 7 && _currentNO > 3) { sb.append(processLogic(_currentNO, pageNO, 7)); } else { if (_currentNO < 4) { sb.append(processLogic(_currentNO, pageNO, 4)); } } } writer.append(sb.toString()); writer.flush(); return 0; } /** * execute building the list of page * @param currentNO * @param pageNO * @param endpage <p>please fill the last page number * @return */ private String processLogic(int currentNO,int pageNO,int endpage) { StringBuffer sb=new StringBuffer(100); int endPage=pageNO+1; if(endpage!=-1) { endPage=endpage; } for (int i = 1; i < currentNO; i++) { sb.append(buildHref(i, String.valueOf(i),"hcl") + " "); } sb.append(buildHref(currentNO, String.valueOf(currentNO),"hcl_cur"));//for current page,make use 'hcl_cur' style for (int i = currentNO + 1; i < endPage; i++) { sb.append(buildHref(i, String.valueOf(i),"hcl") + " "); } if (currentNO<pageNO) {// 判断是否还有下一页 sb.append(buildHref(_currentNO + 1, "Next>","hcl")); } return sb.toString(); } private String buildHref(int t, String s,String styleId) { StringBuffer sb = new StringBuffer(30); sb.append("<a class='"); sb.append(styleId); sb.append("' href="?"); if(StringUtils.hasText(paginationUrlParam)) { sb.append(_paginationUrlParam).append("&pageNo=").append(t).append("" mce_href="?"); if(StringUtils.hasText(paginationUrlParam)) { sb.append(_paginationUrlParam).append("&pageNo=").append(t).append("">"); } sb.append(s); sb.append("</a>"); return sb.toString(); }; private String buildPrev(int currentNO) { String str = ""; if (currentNO != 1) { str = buildHref(currentNO - 1, "<Prev","hcl") + " "; } return str; }; private String buildNext(int currentNO) { String str = ""; str = buildHref(_currentNO + 1, "Next>","hcl"); return str; } // private String makeUrl(int t) { // StringBuffer sb=new StringBuffer(20); // if(StringUtils.hasText(paginationUrlParam)) { // sb.append(_paginationUrlParam).append("&pageNo=").append(t).append("'>"); // } // return sb.toString(); // } public String getItemsTotal() { return itemsTotal; } public void setItemsTotal(String itemsTotal) { this.itemsTotal = itemsTotal; } public String getCurrentNO() { return currentNO; } public void setCurrentNO(String currentNO) { this.currentNO = currentNO; } public String getItemsPage() { return itemsPage; } public void setItemsPage(String itemsPage) { this.itemsPage = itemsPage; } public String getPaginationUrlParam() { return paginationUrlParam; } public void setPaginationUrlParam(String paginationUrlParam) { this.paginationUrlParam = paginationUrlParam; } }

其中:itemsTotal 、currentNO、itemsPage三个属性是冒出来的,在标签中要提供输入的值。前面带有“_”号的变量是本地变量,通过evaluateExprssions()函数转化的。

主要的是要覆写RequestContextAwareTag类doStartTagInternal方法。


配置部分:

编写tld文件,使其作为引入标签时使用。

新建一tld文档,内容如下:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name>eclanswers</short-name> <uri>http://eclanswers.xxxxxx.com/tags</uri> <tag> <name>pagination</name> <tag-class>com.ecl.eclanswers.utils.PaginationTag</tag-class> <body-content>JSP</body-content> <description>display operation with per page by this tag</description> <attribute> <name>itemsTotal</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>currentNO</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>itemsPage</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>paginationUrlParam</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>

把需要的属性,比如itemsTotal 、currentNO、itemsPage这三个在该文档中标注出来。

对该tld文档进行加载是通过web.xml来加载的,只需在web.xml中配置如下:

<taglib> <taglib-uri>http://eclanswers.xxxxxx.com/tags</taglib-uri> <taglib-location>/WEB-INF/tld/eclanswers.tld(你自己的tld文档路径)</taglib-location> </taglib>

在前台jsp页面中像使用其他spring标签时一样,即可。

自定义Tag标签的编写相关推荐

  1. Spring自定义tag标签及使用

    tag文件和jsp很相似,也有不同,tag文件只是以tag为后缀名的文本文件.除了jsp页面指令外,其他jsp元素都可以出现在tag文件中.jsp的指令有include,taglib和page,但ta ...

  2. 自定义TAG标签页面聚合

    TAG标签是一种由用户自己定义的,比分类更准确.更具体,可以概括文章主要内容的关键词,TAG标签一般出现在我们首页的侧栏中,将我们已经有排名的网页通过TAG标签进行聚合,可以提高页面的权重,通过超链接 ...

  3. Vue自定义Tag标签

    1.需求:项目中有好几处用到标签组,有单行.多行.单行显示不下省略(鼠标放上去提示)等等需求,为了方便使用提取为组件. 2.在项目的components文件下新建文件夹TagList,文件下三个文件( ...

  4. 标签系统mysql设计_关于tag标签系统的实现

    实验室的项目,需要做对用户发布的主题进行打标签的功能,纠结甚久,实现思路如下: 一.数据库表的设计 1.tag表 create table qa_tag ( tag_id int primary ke ...

  5. jsp自定义标签(taglib)编写的原理和实现

    jsp自定义标签(taglib)编写的原理和实现 转:http://www.javaeye.com/topic/157737 个tag就是一个普通的java类,它惟一特别之处是它必须继承TagSupp ...

  6. django “如何”系列4:如何编写自定义模板标签和过滤器

    django的模板系统自带了一系列的内建标签和过滤器,一般情况下可以满足你的要求,如果觉得需更精准的模板标签或者过滤器,你可以自己编写模板标签和过滤器,然后使用{% load %}标签使用他们. 代码 ...

  7. OneNav一为主题魔改教程(四):自定义网址内容页的Tag标签到任意位置--洞五洞洞幺

    今日主题: 自定义网址内容页的Tag标签到任意位置 声明:本篇有违"魔改"这个标题:修改之前做好笔记或备份. 在原WebStackPro的版本中, 内容页中的Tag标签块紧帖着简介 ...

  8. R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、自定义为指定的分列因子添加分组标签、编写自定义函数指定统计量的呈现方式

    R语言使用table1包绘制(生成)三线表.使用单变量分列构建三线表.自定义为指定的分列因子添加分组标签.编写自定义函数指定统计量的呈现方式 目录

  9. elementUI table自定义表头弹框搜索,排序,显示tag标签

    elementUI table自定义表头弹框搜索,排序,显示tag标签 允许一种排序,多种搜索条件 包括三种类别,添加了solt插槽,也可以自定义: 输入框[input] 多选[checkbox] 范 ...

最新文章

  1. urlrewrite使用小结
  2. 无线网络嗅探中的Radiotap
  3. Python脚本--微信公众号自定义菜单的创建及获取
  4. golang中的strings.Join
  5. iphone尺寸_iPhone折叠机概念图:屏幕双打孔,iPhone折叠机有多优秀!
  6. java word 在线编辑图片_java开发实现word在线编辑及流转
  7. CMD下提示“命令不是内部或外部命令”解决方法
  8. ElementUI el-table 在flex下的宽度自适应问题
  9. 领域驱动设计和开发实战总结
  10. java删除list元素的几种方式
  11. 2008R2Win7管理九DNS冗余和恢复
  12. UITableView总忘记的
  13. Unity3D核心类型一览
  14. 95-30-012-Channel-AbstractNioChannel
  15. Axure高保真智慧校园管理系统/校园管理/人事管理/学籍管理/教学管理/流程审批/备课管理/考务管理/成绩管理/排课管理/选课管理/选课系统/调课申请/教师考评管理/web端管理系统
  16. pytorch 生成随机数Tensor的方法 torch.rand torch.randn torch.normal torch.linespace
  17. win10突然不能使用usb大容量存储设备(移动硬盘)的解决方法
  18. RGB VGA显示时序
  19. 渗透测试-灰鸽子远控木马
  20. 解决CMU-15-213-ICS的部分lab在部分64位系统WSL中btest无法运行的问题

热门文章

  1. Closure call with mismatched arguments: function ‘routes.<anonymous closure>‘
  2. 在 iPhone 和 Android 上恢复已删除的微信消息/聊天的 3 种方法
  3. Jenkins执行Python代码时提示‘taskkill‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  4. 2021年8月15日---------vue
  5. 雷神小钢炮笔记本u盘装win8单系统教程
  6. 两台电脑共用一根网线上网详细教程
  7. GPIO_init()函数初始化详解
  8. 华为最美小姐姐,被外派到墨西哥后...
  9. 你见过有哪些超级搞笑的代码?
  10. html 左中右如何布局,CSS 布局