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"/>
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于