BodyTagSupport与TagSupport的区别在于,BodyTagSupport标签处理类与标签体进行交互,TagSupport标签处理类不与标签体进行交互,因为BodyTagSupport是TagSupport的子类,所以用TagSupport实现的都可以用BodyTagSupport实现.
--下面就让我们来看一下自定义标签的编写流程
首先我们需要在编写工具(小白用的是eclipse)+tomcat服务容器,创建这些东西:一个java的类,一个.tld的标签库文件,还有一个jsp页面
有了这些后,我们就可以来研究一下标签的自定义过程
首先我们先打开.tld这个标签库文件,并进行设置
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<!-- 标签库描述符 -->
<taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>Simple Tags</short-name>
<uri>/outtag</uri>
<tag>
<!-- 标签名 -->
<name>out</name>
<!-- 标签助手类 -->
<tag-class>com.zking.outtag.OutTag</tag-class>
<!-- 标签的内容类型:empty表示空标签(使用空标签会报错),jsp表示可以为任何合法的JSP元素 -->
<body-content>JSP</body-content>
<!--属性设置(可以不设置属性)-->
<attribute>
<!--属性名字-->
<name>value</name>
<!--是否为必须属性-->
<required>true</required>
<!--是否可以使用表达式,如:EL表达式-->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
根据以上的自定义标签的设置,我们就得到了一个名字叫out的一个标签,out的标签内必须要有属性value,并且可以使用表达式
然后jsp页面使用我们自己定义的标签
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="o" uri="/outtag"%>
<!-- 这里的uri应该与.tld文件中的uri所对应 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>自定义标签</title>
</head>
<body>
<!-- 标签名:out,属性:value ,最后达到页面输出结果:123-->
<o:out value="123"></o:out>
</body>
</html>
那么问题来了,这个value的值是怎么样输出来的呢?,为什么会被输出呢?
所以,问题的答案追溯到我们的Java的类(标签助手类)中来解答吧?
package com.zking.outtag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
/*继承了BodyTagSupport*/
public class OutTag extends BodyTagSupport{
//对应的属性---value
private Object value;
/*
* 无参有返回构造方法
*/
public Object getValue() {
return value;
}
/*
* set方法
*/
public void setValue(Object value) {
this.value = value;
}
/*
* 开始执行jsp文件对应的<o:out value="123">
*/
public int doStartTag() throws JspException {
/*
* pageContext一个请求域,通过请求域与jsp达到一个连接的作用
* 这也就是value值能否显示的原因
*/
try {
pageContext.getOut().print(value);
} catch (IOException e) {
e.printStackTrace();
}
/*
* 返回的值
* EVAL_BODY_INCLUDE(运行出标签体包含的值,也就是开签与闭签之间的值)
* SKIP_BODY (跳过标签体,直接运行到闭签处)
*/
return SKIP_BODY;
}
/*
* 开始执行jsp文件对应的</o:out>
*/
public int doEndTag() throws JspException {
/*
* 返回的值
* EVAL_PAGE(继续运行下面内容,也就是说从该标签开始,下面的所有内容都能执行)
* SKIP_PAGE(从该标签开始,跳过下面全部内容,直接运行到</html>标签)
*/
return SKIP_PAGE;
}
}
我们写出的这个标签可以使用EL表达式${}和小脚本<%%>哦~
以上就是小白简单的介绍了一下自定义标签的设置过程,如果看懂了就试一下编写一个属于自己的标签吧~