javaweb 自定义标签 - 分页功能

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

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 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3190 引用 • 8214 回帖
  • Web
    117 引用 • 433 回帖 • 8 关注

相关帖子

欢迎来到这里!

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

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