[JSP]自定义标签库taglib

自定义标签的步骤

自定义标签的步骤大概有三步:

1.继承javax.servlet.jsp.tagext.*下提供的几个标签类,如Tag、TagSupport、BodyTagSupport、SimpleTagSupport(JSP2.0)。

2.在tld文件中配置标签库信息,以及标签与实现类的映射。

3.在jsp文件中引用自定义标签。

标签API

Tag接口

doEndTag():执行当前标签实例的结束标签。在doStartTag()执行后调用

doStartTag():执行当前标签实例的开始标签。

getParent():获取当前标签的父标签

release():释放当前标签的状态

setPageContext(PageContext):设置当前标签的页面

setParent(Tag):设置当前标签的父标签

TagSupport类

TagSupport类是实现Tag接口的一个模板类。它实现了Tag接口的大部分方法,用户只需要实现doStartTag()doEndTag()方法。

SimpleTag接口(JSP2.0)

JSP2.0的接口,比Tag接口更简单。

doTag():执行当前标签的所有处理任务。

getParent():获取当前标签的父标签。

setJspBody(JspFragment):提供当前标签的实体为一个JspFragment对象

setJspContext(JspContext):设置JSP页面的

setParent(JspTag):设置当前标签的父标签。

SimpleTagSupport类(JSP2.0)

SimpleTagSupport类是实现SimpleTag接口的一个模板类。它实现了SimpleTag接口的大部分方法,用户只需要实现doTag()方法。

tld标签库描述文件

tld全称为Tag Library Description,即标签库描述文件。

tld文件用来配置标签库的基本信息。

taglib主要元素

taglib.tld

<?xml version="1.0"encoding="UTF-8" ?>

<taglib

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"

version="2.0">

<tlibversion>1.0</tlibversion>

<jspversion>2.0</jspversion>

<shortname>taglib</shortname>

<uri>http://notes.javaee.jsp.com/taglib</uri>

<info>Private Taglib</info>

<tag>

<name>copyright</name>

<tagclass>notes.javaee.jsp.taglib.Copyright</tagclass>

<bodycontent>JSP</bodycontent>

<info>Copyright tag.</info>

</tag>

</taglib>

l shortname指明推荐使用的prefix。

l uri指明引用这个标签库时使用的uri。

l tag指明要定义标签的信息。

其中,tag可以设置的属性如下:

属性

描述

name

定义属性的名称。每个标签的是属性名称必须是唯一的。

tagclass

指定映射的Java类。

required

指定属性是否是必须的或者可选的,如果设置为false为可选。

rtexprvalue

声明在运行表达式时,标签属性是否有效。

type

定义该属性的Java类类型 。默认指定为String。

description

描述信息。

fragment

如果声明了该属性,属性值将被视为一个JspFragment。

bodycontent

指明标签体的限制,有3种取值:empty、JSP和tagdependent empty:不允许有标签体存在。 JSP:允许有标签体存在。 tagdependent:允许有标签体存在,但是标签体内的JSP代码不会被执行。

如果tld文件位于/WEB-INF/下面,Tomcat会自动加载tld文件中的标签库。如果位于其他的位置,可以在web.xml中配置。

<jsp-config>

<taglib>

<taglib-uri>http://notes.javaee.jsp.com/taglib</taglib-uri>

<taglib-location>/WEB-INF/taglib.tld</taglib-location>

</taglib>

</jsp-config>

或者在JSP中直接使用

<%@ taglib uri="/WEB-INF/taglib.tld" prefix="taglib"%>

实例

使用TagSupport自定义标签

1. 继承标签API

定义一个HelloTag类,继承TagSupport类。

HelloTag.java:

package notes.javaee.jsp.taglib;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.TagSupport;

public class HelloTag extends TagSupport {

private static final long serialVersionUID = -8828591126748246256L;

private String name;

@Override

public int doEndTag() throws JspException {

try {

this.pageContext.getOut().println("Hello, " + name);

        } catch (Exception e) {

throw new JspException(e);

        }

return EVAL_PAGE;

    }

public String getName() {

return name;

    }

public void setName(String name) {

this.name = name;

    }

}

2. 在tld中配置标签库信息

在/WEB-INF下新建taglib.tld文件。

<shortname>指明推荐使用的prefix为taglib。

<uri>指明引用这个标签库时使用的uri为http://notes.javaee.jsp.com/taglib

<tag>定义要引用的标签信息。<name>指明标签名,<tagclass>指明映射的Java类,和前面的对应。

然后定义这个标签的属性。因为前面Java类中的属性为name,这里也要对应上。

taglib.tld:

<?xml version="1.0"encoding="UTF-8" ?>

<taglib

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"

version="2.0">

<tlibversion>1.0</tlibversion>

<jspversion>2.0</jspversion>

<shortname>taglib</shortname>

<uri>http://notes.javaee.jsp.com/taglib</uri>

<info>Private Taglib</info>

<tag>

<name>hello</name>

<tagclass>notes.javaee.jsp.taglib.HelloTag</tagclass>

<bodycontent>empty</bodycontent>

<info>Hello tag with parameters.</info>

<attribute>

<name>name</name>

<required>true</required>

<rtexprvalue>true</rtexprvalue>

</attribute>

</tag>

</taglib>

3. 在jsp文件中引用标签

前面在tld文件中配置了各个关键信息,现在就可以直接在jsp文件中使用了。

首先,需要在jsp文件中引入标签库文件。这里和标准标签库JSTL一样,使用taglib关键字来说明要引入的是标签库。uri是引入地址,prefix是标签库关键字。

<%@ taglib uri="http://notes.javaee.jsp.com/taglib"prefix="taglib"%>

由于前面定义的标签name为hello,所以可以使用的标签名为:prefix+name,即:taglib:hello。

Hello.jsp:

<%@ page language="java"contentType="text/html; charset=UTF-8"%>

<%@ taglib uri="http://notes.javaee.jsp.com/taglib"prefix="taglib"%>

<html>

<head>

<meta http-equiv="Content-Type"content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

<taglib:hello name="World"/> <br/>

</body>

</html>

结果:

使用SimpleTagSupport自定义标签(JSP2.0)

1. 继承标签API

定义一个HelloTag类,继承SimpleTagSupport类。

PersonTag.java:

package notes.javaee.jsp.taglib2;

import java.io.IOException;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.SimpleTagSupport;

public class PersonTag extends SimpleTagSupport {

private String name;

private String sex;

private int age;

@Override

public void doTag() throws JspException, IOException {

this.getJspContext().getOut().write(

"[Person Info]name: " + name + ", sex: " + sex + ", age:" + age);

    }

public String getName() {

return name;

    }

public void setName(String name) {

this.name = name;

    }

public String getSex() {

return sex;

    }

public void setSex(String sex) {

this.sex = sex;

    }

public int getAge() {

return age;

    }

public void setAge(int age) {

this.age = age;

    }

}

2.在tld中配置标签库信息

在/WEB-INF下新建taglib.tld文件。

关键配置信息基本和使用TagSupport自定义标签范例中一样。但是由于对应Java类中有3个属性,需要一一对应上。

taglib.tld:

<?xml version="1.0"encoding="UTF-8" ?>

<taglib

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"

version="2.0">

<tlibversion>1.0</tlibversion>

<jspversion>2.0</jspversion>

<shortname>taglib</shortname>

<uri>http://notes.javaee.jsp.com/taglib</uri>

<info>Private Taglib</info>

<tag>

<name>person</name>

<tagclass>notes.javaee.jsp.taglib2.PersonTag</tagclass>

<bodycontent>empty</bodycontent>

<info>person info tag</info>

<attribute>

<name>name</name>

<required>true</required>

<rtexprvalue>true</rtexprvalue>

</attribute>

<attribute>

<name>sex</name>

<required>true</required>

<rtexprvalue>true</rtexprvalue>

</attribute>

<attribute>

<name>age</name>

<required>true</required>

<rtexprvalue>true</rtexprvalue>

</attribute>

</tag>

</taglib>

3.在jsp文件中引用标签

引用标签方式和使用TagSupport自定义标签范例一样。

personTag.jsp:

<%@ page language="java"contentType="text/html; charset=UTF-8"%>

<%@ taglib uri="http://notes.javaee.jsp.com/taglib"prefix="taglib"%>

<html>

<head>

<meta http-equiv="Content-Type"content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

<taglib:person name="Alex"sex="man" age="18"/>

</body>

</html>

结果:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程微刊

ajax和axios请求本地json数据对比

AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术,通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重...

1074
来自专栏IT可乐

SpringMVC详解(六)------与json交互

  Json(JavaScript Object Notation),它是一种轻量级数据交换格式,格式简单,易于读写,目前使用特别广泛。那么这篇博客我们主要谈谈...

1906
来自专栏jeremy的技术点滴

处理一个NodeJS程序内存泄露的问题

2849
来自专栏北京马哥教育

3000 字 Flask 快速学习指南:从入门到开发

作者:过了即是客 Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务。本文参考自Flask官方文档,...

4039
来自专栏Android群英传

PWA程序实践

612
来自专栏应用案例

Web前端面试题小集

来自:前端打小怪升级笔记,作者:spademan segmentfault.com/a/1190000008322096 一、一个页面上两个div左右铺满整个浏...

2669
来自专栏HTML5学堂

2016.06 第二周 群问题分享

HTML+CSS display:none与visibility:hidden相同点与不同点 2016.06.06~2016.06.10 核心概念 displa...

3318
来自专栏Android 研究

APK安装流程详解6——PackageManagerService启动前奏

由于在后面讲解PackageManager流程启动的时候会 涉及到Setting类,我们就先预热下 Settings.java源码地址

782
来自专栏乐百川的学习频道

Flask 快速入门

Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务。本文参考自Flask官方文档,大部分代码引用自官方...

2299
来自专栏Java帮帮-微信公众号-技术文章全总结

shell编程基础入门

shell编程基础入门 文章最后有下载shell学习指南电子书链接。 1.shell格式:例 shell脚本开发习惯 1.指定解释器 #!/bi...

3164

扫码关注云+社区