javaweb 自定义标签 - 分页功能

本贴最后更新于 2290 天前,其中的信息可能已经事过景迁

First.编写'TagSupport'子类

package top.code666.utils; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.Tag; import javax.servlet.jsp.tagext.TagSupport; /** * 自定义分页标签 * @类功能说明: * @作者:汪思源 */ public class PageTag extends TagSupport{ // PageContext对象,用于获取request private PageContext pageContext; //自定义标签传入的当前页名称(通过request.getParameter(当前页名称)来得到数据) private String pageIndexName; //自定义标签传入的分页总数名称(通过request.getAttribute(总页名)来得到数据) private String pageCountName; //传入当前页url, //比如:/okCart/index 、 /okCart/index?xxxx=111 //xxxx=111 表示其它功能参数,与分页无关 private String url; public String getPageIndexName() { return pageIndexName; } public void setPageIndexName(String pageIndexName) { this.pageIndexName = pageIndexName; } public String getPageCountName() { return pageCountName; } public void setPageCountName(String pageCountName) { this.pageCountName = pageCountName; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } // 标签开始执行的方法 @Override public int doStartTag() throws JspException { JspWriter out = pageContext.getOut(); HttpServletRequest request = (HttpServletRequest) pageContext.getRequest(); //得到分页总数 int pageCount = (Integer) request.getAttribute(pageCountName); //得到当前页 int pageIndex = request.getParameter(pageIndexName)==null?1:Integer.parseInt(request.getParameter(pageIndexName)); String reqUrl = ""; //判断url是否有其它参数值,有则用&拼接,否则用? if(url.contains("?")){ reqUrl = url+"&curPage="; }else{ reqUrl = url+"?curPage="; } //开始拼接分页html页面 -- 这里用的bootstrap StringBuilder sb = new StringBuilder(); sb.append("<nav aria-label=\"Page navigation\"><ul class=\"pagination\">"); sb.append("<li><a href=\"/okCart/\"> 首页</a></li>"); for(int i = 1;i<=pageCount;i++){ if(pageIndex == i){ // 表示当前页 sb.append("<li class=\"active\"><span>"+i+"</span></li>"); }else{ sb.append("<li><a href=\""+reqUrl+String.valueOf(i)+"\">"+i+"</a></li>"); } } sb.append("<li><a href=\""+reqUrl+String.valueOf(pageCount)+"\">尾页</a></li>"); sb.append("</ul></nav>"); try { out.print(sb.toString()); // 输出页面 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return Tag.EVAL_PAGE; } // 标签结束执行的方法 @Override public int doEndTag() throws JspException { return super.doEndTag(); } // 得到pageContext对象 @Override public void setPageContext(PageContext pageContext) { this.pageContext = pageContext; } }

Second.编写自定义标签 tld 文件

此文件放在 WEB-INF 目录下面

<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" version="2.1"> <!-- 此tld文件的描述,description应该放在其它属性前面,否则编辑器会报错 --> <description>my tag</description> <display-name>JSTL core</display-name> <tlib-version>1.1</tlib-version> <!-- 在jsp页面使用的前缀 --> <short-name>code666</short-name> <!-- 当前自定义标签所在的uri --> <uri>http://code666.top/jstl/page</uri> <!-- 当前taglib下面的某一个tag,此标签可以有多个,jsp页面引用时如又所示:<code666:page/>、<code666:page1/> <tag> <description> 自定义标签里的元素居然要有个顺序,不然会报错!! </description> <name>page</name> <!-- 当前tag所在类的全限定名 --> <tag-class>top.code666.utils.PageTag</tag-class> <!-- body-content有四个属性值: tagdependent:标签体内容直接被写入BodyContent,由自定义标签类来进行处理,而不被JSP容器解释 <test:myList>select name,age from users</test:myList> JSP:接受所有JSP语法,如定制的或内部的tag、scripts、静态HTML、脚本元素、JSP指令和动作 <my:test><%=request.getProtocol()%> // ②</my:test> empty:空标记,即起始标记和结束标记之间没有内容。 <test:mytag /><test:mytag uname="Tom" /><test:mytag></test:mytag scriptless:接受文本、EL和JSP动作。如上述②使用<body-content> scriptless </body-content>则报错 --> <body-content>empty</body-content> <!-- 标签属性(详情请查看另一篇blog《自定义标签完全解析》) --> <attribute> <description>当前页名称</description> <name>pageIndexName</name> <!-- 指定属性是否是必须的或者可选的,如果设置为false为可选,这里是必须要当前属性 --> <required>true</required> <!-- 声明在运行表达式时,标签属性是否有效。rtexprvalue的全称是 Run-time Expression Value,表示是否可以使用jsp表达式 --> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description>分页总数名称</description> <name>pageCountName</name> <required>true</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description>传入的父类url</description> <name>url</name> <required>true</required> <rtexprvalue>false</rtexprvalue> </attribute> </tag> </taglib>

Threed.View 界面编写

<!-- 传入当前页与总页的名称,后台java代码会根据名称 request到值 --> <page:page pageCountName="totalPage" url="/okCart/index" pageIndexName="curPage"/>

END. 效果查看

image

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3194 引用 • 8214 回帖
  • Web
    119 引用 • 433 回帖 • 8 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...