//第一步、编写一个实现SimpleTag接口(实际上我们更常的是继承SimpleTagSupport接口的实现类
//第二步、编写标签的TLD文件,用于指定标签的URI和对标签的声明描述
//第三步、用jsp的<%@taglib uri="" prefix=""%>编译指令导入自定义的标签
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class MyTag extends SimpleTagSupport {
/***
* ① 编写一个实现SimpleTag接口
* (实际上我们更常的是继承SimpleTagSupport接口的实现类
* 从而免于覆写所有的方法)的Java类,这个Java类也称为标签处理器类。
② 编写标签的TLD文件,用于指定标签的URI和对标签的声明描述,
这一点和EL函数时一样的,TLD文件必须放置在web应用下的【WEB-INF】文件中,
可以是除【classes】和【lib】目录以外的任何子目录中。
TLD文件的模板可以从
【Tomcat】--->【webapps】--->【examples】--->【WEB-INF】--->【jsp2】
中有一个“jsp2-example-taglib.tld”文件复制首尾和其中的<Tag>标签。
注:在TLD文件中我们使用<tag>标签来对每一个自定义标签的Java类进行描述,
其中每个<tag>标签下还需要指定<body-content>的值,
这个是描述标签体的类型:对于简单标签使用:“empty”(无标签体内容时)
或“scriptless” (有标签体内容时)。
注意:简单标签在JSP页面中,标签体内容中是不允许使用JSP脚本的。
三、用jsp的<%@taglib uri="" prefix=""%>编译指令导入自定义的标签
详细请见:
https://www.cnblogs.com/fjdingsd/p/5118166.html
*/
@Override
public void doTag(){
//标签体对象
JspFragment fragment = this.getJspBody();
try {
//执行标签体必须调用invoke()方法
fragment.invoke(null);
//上面的代码等效于fragment.invoke(null);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/***
* javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段,这段JSP片段中不能包含JSP脚本元素。
WEB容器在处理简单标签的标签体时,会把标签体内容用一个JspFragment对象表示,并调用标签处理器对象的setJspBody方法把JspFragment对象传递给标签处理器对象。JspFragment类中只定义了两个方法,如下所示:
getJspContext方法
用于返回代表调用页面的JspContext对象.
public abstract void invoke(java.io.Writer out)
用于执行JspFragment对象所代表的JSP代码片段
参数out用于指定将JspFragment对象的执行结果写入到哪个输出流对象中,如果传递给参数out的值为null,则将执行结果写入到JspContext.getOut()方法返回的输出流对象中。
(简而言之,可以理解为写给浏览器)
*/
/***
JspFragment.invoke方法是JspFragment最重要的方法,利用这个方法可以控制是否执行和输出标签体的内容、是否迭代执行标签体的内容或对标签体的执行结果进行修改后再输出。例如:
在标签处理器中如果没有调用JspFragment.invoke方法,其结果就相当于忽略标签体内容;
在标签处理器中重复调用JspFragment.invoke方法,则标签体内容将会被重复执行;
若想在标签处理器中修改标签体内容,
只需在调用invoke方法时指定一个可取出结果数据的输出流对象(例如StringWriter)
,让标签体的执行结果输出到该输出流对象中,
然后从该输出流对象中取出数据进行修改后再输出到目标设备,
即可达到修改标签体的目的
*/
<?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 http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>我的自定义标签</description>
<tlib-version>1.0</tlib-version>
<short-name>MM</short-name><!-- 定义标签头名字 -->
<uri>http:// hongxiaohong</uri>
<tag>
<description>Populates the page context with a BookBean</description>
<name>kk</name><!-- 定义标签名字 -->
<tag-class>com.hong.web.commons.MyTag</tag-class>
<body-content>scriptless</body-content>
</tag>
</taglib>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http:// hongxiaohong" prefix="MM" %>
<%--通过taglib导入自定义标签 --%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'diyTag.jsp' starting page</title>
</head>
<body>
This is my JSP page. <br>
<MM:kk>让泪化作相思雨</MM:kk><%--自定义的标签的使用 --%>
</body>
</html>