javaweb自定义标签-分页功能

First.编写’TagSupport’子类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
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目录下面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?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界面编写

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

END. 效果查看

image


javaweb自定义标签-分页功能
https://code666.top/articles/2018/12/09/1544360268424.html
作者
Sean
发布于
2018年12月9日
许可协议