BodyTagSupport与TagSupport自定义标签

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表达式${}和小脚本<%%>哦~

以上就是小白简单的介绍了一下自定义标签的设置过程,如果看懂了就试一下编写一个属于自己的标签吧~



猜你喜欢

转载自blog.csdn.net/Mr_xiayijie/article/details/80559790