BodyTagSupport和TagSupport的关系:
BodyTagSupport是继承TagSupport的,因此,我们可以知道BodyTagSupport的功能会比较的多。
BodyTagSupport和TagSupport的区别主要是:标签处理类是否需要与标签体交互。不需要交互的就用TagSupport,需要交互就用BodyTagSupport。
交互就是标签处理类是否要读取标签体的内容和改变标签体返回的内容。
BodyTagSupport实例:
(1)、编写标签描述文件**.tld (在web-info文件夹下创建myTag.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>/zking</uri>
<!-- hello world标签 -->
<tag>
<!-- 标签名 -->
<name>out</name>
<!-- 标签助手类 -->
<tag-class>com.zking.tag.outTag</tag-class>
<!-- 标签的内容类型:empty表示空标签(使用空标签会报错),jsp表示可以为任何合法的JSP元素 -->
<body-content>JSP</body-content>
<attribute>
<name>value</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
(2)、编写tag的java类:(自定义标签类)
/**
* 标签的助手类
*
*/
public class outTag extends BodyTagSupport {
private Object value;
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
/**
* 标签的开始
*/
@Override
public int doStartTag() throws JspException {
try {
// 将数据值输出到jsp页面
pageContext.getOut().print(value);
} catch (Exception e) {
e.printStackTrace();
}
return SKIP_BODY;
}
/**
* 标签的结束
*/
@Override
public int doEndTag() throws JspException {
return EVAL_PAGE;
}
(3)、页面中添加:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="m" uri="/zking"%>
<!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>Insert title here</title>
</head>
<body>
<%
String name = "自定义标签";
request.setAttribute("name", name);
%>
<m:out value="自定义标签"></m:out>
<m:out value="${name }"></m:out>
<m:out value="<%=1 + 1%>"></m:out>
</body>
</html>
标签类说明:
创建的outTag类继承了BodyTagSupport类,而它又实现了Tag接口,Tag接口的生命周期由其所在的容器控制,如下图:
(1)、setPageContext() 将所在jsp页面的pageContext注入进来,目的是为了在后面的方法中可以访问到jsp页面对象的pageContext属性
(2)、setParent() 设置此标签的父标签
(3)、setAttribute() 将标签中的属性注入到此class的属性,不需要自己实现但要提供属性的get与set方法
(4)、doStartTag() 在开始标签属性设置后调用,如果返回SKIP_BODY则忽略标签之中的内容,如果返回EVAL_BODY_INCLUDE则将标签体的内容进行输出
(5)、doEndTag() 在结束标签之前调用,返回SKIP_PAGE跳过整个jsp页面后面的输出,返回EVAL_PAGE执行页面余下部分
(6)、release() 生命周期结束时调用