自定义分页标签详解
来源:互联网 发布:2016西决g6知乎 编辑:程序博客网 时间:2024/05/19 13:56
最核心的自定义分页标签类的写法PagerTag.java,前提是要继承自TagSupport类
package com.javacrazyer.web.tag; import java.io.IOException; import java.util.Enumeration; import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.TagSupport; /** * 分页标签处理类 */ public class PagerTag extends TagSupport { private static final long serialVersionUID = 5729832874890369508L; private String url; //请求URI private int pageSize = 10; //每页要显示的记录数 private int pageNo = 1; //当前页号 private int recordCount; //总记录数 @SuppressWarnings("unchecked") public int doStartTag() throws JspException { int pageCount = (recordCount + pageSize - 1) / pageSize; //计算总页数 //拼写要输出到页面的HTML文本 StringBuilder sb = new StringBuilder(); sb.append("<style type=\"text/css\">"); sb.append(".pagination {padding: 5px;float:right;font-size:12px;}"); sb.append(".pagination a, .pagination a:link, .pagination a:visited {padding:2px 5px;margin:2px;border:1px solid #aaaadd;text-decoration:none;color:#006699;}"); sb.append(".pagination a:hover, .pagination a:active {border: 1px solid #ff0000;color: #000;text-decoration: none;}"); sb.append(".pagination span.current {padding: 2px 5px;margin: 2px;border: 1px solid #ff0000;font-weight: bold;background-color: #ff0000;color: #FFF;}"); sb.append(".pagination span.disabled {padding: 2px 5px;margin: 2px;border: 1px solid #eee; color: #ddd;}"); sb.append("</style>\r\n"); sb.append("<div class=\"pagination\">\r\n"); if(recordCount == 0){ sb.append("<strong>没有可显示的项目</strong>\r\n"); }else{ //页号越界处理 if(pageNo > pageCount){ pageNo = pageCount; } if(pageNo < 1){ pageNo = 1; } sb.append("<form method=\"post\" action=\"").append(this.url) .append("\" name=\"qPagerForm\">\r\n"); //获取请求中的所有参数 HttpServletRequest request = (HttpServletRequest) pageContext .getRequest(); Enumeration<String> enumeration = request.getParameterNames(); String name = null; //参数名 String value = null; //参数值 //把请求中的所有参数当作隐藏表单域 while (enumeration.hasMoreElements()) { name = enumeration.nextElement(); value = request.getParameter(name); // 去除页号 if (name.equals("pageNo")) { 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("pageNo") .append("\" value=\"").append(pageNo).append("\"/>\r\n"); // 输出统计数据 sb.append(" 共<strong>").append(recordCount) .append("</strong>项") .append(",<strong>") .append(pageCount) .append("</strong>页: \r\n"); //上一页处理 if (pageNo == 1) { sb.append("<span class=\"disabled\">« 上一页") .append("</span>\r\n"); } else { sb.append("<a href=\"javascript:turnOverPage(") .append((pageNo - 1)) .append(")\">« 上一页</a>\r\n"); } //如果前面页数过多,显示"..." int start = 1; if(this.pageNo > 4){ start = this.pageNo - 1; sb.append("<a href=\"javascript:turnOverPage(1)\">1</a>\r\n"); sb.append("<a href=\"javascript:turnOverPage(2)\">2</a>\r\n"); sb.append("…\r\n"); } //显示当前页附近的页 int end = this.pageNo + 1; if(end > pageCount){ end = pageCount; } for(int i = start; i <= end; i++){ if(pageNo == i){ //当前页号不需要超链接 sb.append("<span class=\"current\">") .append(i) .append("</span>\r\n"); }else{ sb.append("<a href=\"javascript:turnOverPage(") .append(i) .append(")\">") .append(i) .append("</a>\r\n"); } } //如果后面页数过多,显示"..." if(end < pageCount - 2){ sb.append("…\r\n"); } if(end < pageCount - 1){ sb.append("<a href=\"javascript:turnOverPage(") .append(pageCount - 1) .append(")\">") .append(pageCount - 1) .append("</a>\r\n"); } if(end < pageCount){ sb.append("<a href=\"javascript:turnOverPage(") .append(pageCount) .append(")\">") .append(pageCount) .append("</a>\r\n"); } //下一页处理 if (pageNo == pageCount) { sb.append("<span class=\"disabled\">下一页 »") .append("</span>\r\n"); } else { sb.append("<a href=\"javascript:turnOverPage(") .append((pageNo + 1)) .append(")\">下一页 »</a>\r\n"); } sb.append("</form>\r\n"); // 生成提交表单的JS sb.append("<script language=\"javascript\">\r\n"); sb.append(" function turnOverPage(no){\r\n"); sb.append(" if(no>").append(pageCount).append("){"); sb.append(" no=").append(pageCount).append(";}\r\n"); sb.append(" if(no<1){no=1;}\r\n"); sb.append(" document.qPagerForm.pageNo.value=no;\r\n"); sb.append(" document.qPagerForm.submit();\r\n"); sb.append(" }\r\n"); sb.append("</script>\r\n"); } sb.append("</div>\r\n"); //把生成的HTML输出到响应中 try { pageContext.getOut().println(sb.toString()); } catch (IOException e) { throw new JspException(e); } return SKIP_BODY; //本标签主体为空,所以直接跳过主体 } public void setUrl(String url) { this.url = url; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public void setPageNo(int pageNo) { this.pageNo = pageNo; } public void setRecordCount(int recordCount) { this.recordCount = recordCount; } }WEB-INF/pager.tld的写法
<?xml version="1.0" encoding="UTF-8"?> <taglib version="2.0" 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 web-jsptaglibrary_2_0.xsd"> <tlib-version>0.9</tlib-version> <!--标签头--> <short-name>w</short-name> <!--将来在页面用taglib引用时的uri属性,这部分的名字可以随便写,只要是符合HTTP网址形式的 --> <uri>http://javacrazyer.iteye.com/tags/pager</uri> <!-- 自定义标签的描述信息 --> <tag> <!-- 标签名 --> <name>pager</name> <!-- 对应的标签处理类全限定名 --> <tag-class>com.javacrazyer.web.tag.PagerTag</tag-class> <!-- 标签主体的类型 --> <body-content>empty</body-content> <!-- 当前页号属性的描述信息 --> <attribute> <!-- 属性名 --> <name>pageNo</name> <!-- 该属性是否为必要的 --> <required>true</required> <!-- 属性值是否可以在JSP运行时期动态产生 --> <rtexprvalue>true</rtexprvalue> <!-- 属性的数据类型 --> <type>int</type> </attribute> <!-- 总记录数属性的描述信息 --> <attribute> <name>recordCount</name> <required>true</required> <rtexprvalue>true</rtexprvalue> <type>int</type> </attribute> <!-- 总页数属性的描述信息 --> <attribute> <name>pageSize</name> <required>true</required> <rtexprvalue>true</rtexprvalue> <type>int</type> </attribute> <!-- 分页标签要跳转的URI属性的描述信息 --> <attribute> <name>url</name> <required>true</required> <rtexprvalue>true</rtexprvalue> <type>java.lang.String</type> </attribute> </tag> </taglib>
好了,就上面的两个基本要素就已经构成了完整的分页标签,下面就差在页面的使用方式了
一般的使用步骤为在JSP页面中:
先倒入标签库:<%@taglib uri="http://javacrazyer.iteye.com/tags/pager" prefix="w"%>
然后使用: <w:pager pageSize="${pageSize}" pageNo="${pageNo}" url="do.jsp" recordCount="${pm.recordCount}"/>
0 0
- 自定义分页标签详解
- 基于mySql的JAVA分页自定义标签详解
- jsp 自定义分页标签
- 自定义分页标签
- 自定义标签通用分页
- 自定义分页标签
- Hibernate分页+自定义标签
- jsp自定义分页标签
- 使用自定义标签分页
- struts2自定义分页标签
- 自定义分页标签
- struts2自定义分页标签
- 自定义分页标签
- Struts2自定义分页标签
- struts2自定义分页标签
- 自定义struts标签分页
- struts2自定义分页标签
- jsp自定义分页标签
- Ubuntu环境编译FFmpeg3.2.2-for-android
- 单点登录SSO的实现原理
- oracle数据库创建序列和触发器实现id自增
- 101个MySQL的调节和优化技巧
- SpringMVC学习笔记
- 自定义分页标签详解
- 异常机制—学习笔记—java中异常处理
- 关于推荐系统中的特征工程
- 设计模式(一)——简单工厂
- [Azure]基于Invoke-Parallel对Azure ARM虚拟机批量开关机
- ZJOI 2009 取石子游戏 博弈论
- Spring MVC过滤器-字符集过滤器(CharacterEncodingFilter)
- AVPlay播放视频
- 函数的返回值是引用