JSP自定义标签

目录

一、标签语言特点

二、标签生命周期

三、自定义标签的开发及使用步骤

四、开发自定义标签

4.1.z:print

4.2.z:out

4.3.z:if

4.4.z:foreach


一、标签语言特点

标准/普通标签
<开始标签>标签体</结束标签>

<a></a>

<开始标签 属性名="属性值"></结束标签>

<a href = ""></a>

空/单标签

<开始标签/>

<br/>


二、标签生命周期


三、自定义标签的开发及使用步骤

第一步:创建一个标签助手类(继承BodyTagSupport)。
   标签属性必须助手类的属性对应、且要提供对应get/set方法。

第二步:创建标签库描述文件(tld),添加自定义标签的配置。
      注:tld文件必须保存到WEB-INF目录或其子目录。

第三步:在JSP通过taglib指令导入标签库描述文件,并通过指定后缀访问此自定义标签。

标签助手类三个重写方法 return 后面的返回值

public class MyTag extends BodyTagSupport{
	@Override
	public int doStartTag() throws JspException {
		// TODO Auto-generated method stub
		return super.doStartTag();
	}
	
	@Override
	public int doAfterBody() throws JspException {
		// TODO Auto-generated method stub
		return super.doAfterBody();
	}
	
	@Override
	public int doEndTag() throws JspException {
		// TODO Auto-generated method stub
		return super.doEndTag();
	}
}

1.doStartTag() :开始标签

返回值1:SKIP_BODY 跳过标签体计算;

不会计算标签体的内容。

返回值2:EVAL_BODY_INCLUDE 计算标签体;

全部都输出。

2.标签体:doAfterBody()

返回值1:SKIP_BODY计算一次标签体;

正常运行一次。

返回值2:EVAL_BODY_AGAIN 再次计算标签体;

 无限循环。

3.doEndTag():结束标签

jsp界面:

<body>
<z:print>哈哈</z:print>
我是结束标签之后的文字!!!
</body>

返回值1:SKIP_PAGE 从结束标签之后,直接到</body>(跳过计算标签后续内容);

不会输出结束标签之后的内容(</z:print>后面的内容)。

输出结果:

返回值2:EVAL_PAGE 计算标签后续内容;

输出结束标签之后的内容(</z:print>后面的内容)。

输出结果:

四、开发自定义标签

4.1.z:print

示例:

<z:print>哈哈</z:print>

功能:输出标签体内容。

第一步:创建标签助手类继承BodyTagSupport。重写方法doStartTag()、doEndTag()、doAfterBody()。

package com.zking.tag;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;

public class PrintTag extends BodyTagSupport {
	/**
	 * 开始标签:
	 * 		  1.skip_body 跳过标签体计算
	 * 		  2.eval_body_include 计算标签体
	 * @return
	 * @throws JspException
	 */
	@Override
	public int doStartTag() throws JspException {
		System.out.println("我是开始标签!");
		return EVAL_BODY_INCLUDE;
	}
	
	/**
	 * 标签体:
	 * 		1.skip_body 
	 *      2.eval_body_again 再次计算标签体
	 * @return
	 * @throws JspException
	 */
	@Override
	public int doAfterBody() throws JspException {
		System.out.println("我是标签体!");
		return SKIP_BODY;
	}
	
	/**
	 * 结束标签:
	 * 		  1.skip_page 从结束标签之后,直接到</body>(跳过后续页面计算)
	 * 		  2.eval_page 计算标签后续内容
	 * @return
	 * @throws JspException
	 */
	@Override
	public int doEndTag() throws JspException {
		System.out.println("我是结束标签!");
		return EVAL_PAGE;
	}
}

二、创建标签库描述文件(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版本 -->
	<jsp-version>1.2</jsp-version>
	<!-- 自定义标签简称(给标签库取名字)-->
	<short-name>Simple Tags</short-name>
	<!-- 自定义标签引用名 -->
	<uri>/zking</uri>

	<!-- print标签 -->
	<tag>
		<!-- 标签名 -->
		<name>print</name>
		<!-- 该标签对应的标签助手类(完整类名),java会通过反射自动实例化标签助手类 -->
		<tag-class>com.zking.tag.HelloTag</tag-class>
		<!-- 声明标签类型 1.jsp类型:jsp; 2.空类型:empty。 -->
		<body-content>jsp</body-content>
	</tag>

</taglib>

三、在JSP通过taglib指令导入标签库描述文件,并通过指定后缀访问此自定义标签。

1.在JSP通过taglib指令导入标签库描述文件;

<%@taglib prefix="z" uri="/zking" %>

2.并通过指定后缀访问此自定义标签;
<z:print>哈哈</z:print>

<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="z" 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>
	<!-- 输出标签体内容 -->
	<z:print>哈哈</z:print>
</body>
</html>

4.2.z:out

示例:

<z:out value="呵呵"/>

功能:输出value值。

第一步:写一个标签助手类继承BodyTagSupport。重写方法doStartTag()、doEndTag()、doAfterBody()。

package com.zking.tag;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;

public class OutTag extends BodyTagSupport {
	// 标签属性必须助手类的属性对应、且要提供对应get/set方法
	private String value;
	
	public String getValue() {
		return value;
	}
	
	public void setValue(String value) {
		this.value = value;
	}
	
	/**
	 * 开始标签
	 */
	@Override
	public int doStartTag() throws JspException {
		// TODO Auto-generated method stub
		return super.doStartTag();
	}
	
	/**
	 * 标签体
	 */
	@Override
	public int doAfterBody() throws JspException {
		// TODO Auto-generated method stub
		return super.doAfterBody();
	}
	
	/**
	 * 结束标签
	 */
	@Override
	public int doEndTag() throws JspException {
		// 将属性值写入到页面显示
		PrintWriter out = null;
		try {
			out = pageContext.getResponse().getWriter();
			// 写入值并输出
			out.print(this.value);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return super.doEndTag();
	}
	
}

因为out标签是有value属性的,所以还要在标签助手类定义一个属性,并提供对应的get/set方法。

注意:标签属性必须助手类的属性对应。

比如:标签:<z:out value="呵呵"/>,标签的属性是value,

标签助手类定义的属性也应该是value。

在结束标签方法内写入out标签的输出功能。

    /**
	 * 结束标签
	 */
	@Override
	public int doEndTag() throws JspException {
		// 将属性值写入到页面显示
		PrintWriter out = null;
		try {
			out = pageContext.getResponse().getWriter();
			// 写入值并输出
			out.print(this.value);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return super.doEndTag();
	}

二、创建标签库描述文件(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版本 -->
	<jsp-version>1.2</jsp-version>
	<!-- 自定义标签简称(给标签库取名字)-->
	<short-name>Simple Tags</short-name>
	<!-- 自定义标签引用名 -->
	<uri>/zking</uri>
	<!-- out标签 -->
	<tag>
        <!-- 标签名 -->
		<name>out</name>
		<!-- 该标签对应的标签助手类 -->
		<tag-class>com.zking.tag.OutTag</tag-class>
		<!-- 声明标签类型 1.jsp类型:jsp; 2.空类型:empty。 -->
		<body-content>empty</body-content>
		
		<!-- 声明属性 -->
		<attribute>
			<!-- 属性名 -->
			<name>value</name>
			<!-- 该属性是否必写 -->
			<required>true</required>
			<!-- 是否接收表达式传值 -->
			<rtexprvalue>true</rtexprvalue>
		</attribute>
	</tag>

</taglib>

这里要加入属性定义声明。

<!-- 声明属性 -->
<attribute>
	<!-- 属性名 -->
	<name>value</name>
	<!-- 该属性是否必写 -->
	<required>true</required>
	<!-- 是否接收表达式传值 -->
	<rtexprvalue>true</rtexprvalue>
</attribute>

三、在JSP通过taglib指令导入标签库描述文件,并通过指定后缀访问此自定义标签。

<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="z" 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>
	<!-- 输出value值 -->
	<z:out value="呵呵"/>
</body>
</html>

4.3.z:if

示例:

<z:if test="ture">
        哈哈呵呵
</z:if>

功能:如果条件为true,就运行标签体内容;为false,就不运行标签体内容。

第一步:写一个标签助手类继承BodyTagSupport。重写方法doStartTag()、doEndTag()、doAfterBody()。

package com.zking.tag;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;

public class IfTag extends BodyTagSupport {
	private boolean test;
	
	public boolean isTest() {
		return test;
	}

	public void setTest(boolean test) {
		this.test = test;
	}
	
	/**
	 * 开始标签
	 */
	@Override
	public int doStartTag() throws JspException {
		if(this.test)
			return EVAL_BODY_INCLUDE;// 计算标签体
		else
			return SKIP_BODY;// 跳过标签体计算
	}
	
	/**
	 * 标签体
	 */
	@Override
	public int doAfterBody() throws JspException {
		// TODO Auto-generated method stub
		return super.doAfterBody();
	}
	
	/**
	 * 结束标签
	 */
	@Override
	public int doEndTag() throws JspException {
		// TODO Auto-generated method stub
		return super.doEndTag();
	}
	
}

在开始标签方法写入if标签的功能。

    /**
	 * 开始标签
	 */
	@Override
	public int doStartTag() throws JspException {
		if(this.test)
			return EVAL_BODY_INCLUDE;// 计算标签体
		else
			return SKIP_BODY;// 跳过标签体计算
	}

二、创建标签库描述文件(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版本 -->
	<jsp-version>1.2</jsp-version>
	<!-- 自定义标签简称(给标签库取名字)-->
	<short-name>Simple Tags</short-name>
	<!-- 自定义标签引用名 -->
	<uri>/zking</uri>

	<!-- if标签 -->
	<tag>
		<!-- 标签名 -->
		<name>if</name>
		<!-- 该标签对应的标签助手类 -->
		<tag-class>com.zking.tag.IfTag</tag-class>
		<!-- 声明标签类型 1.jsp类型:jsp; 2.空类型:empty。 -->
		<body-content>jsp</body-content>
		
		<!-- 定义属性 -->
		<attribute>
			<!-- 属性名 -->
			<name>test</name>
			<!-- 该属性是否必写 -->
			<required>true</required>
			<!-- 是否接收表达式传值 -->
			<rtexprvalue>true</rtexprvalue>
		</attribute>
	</tag>

</taglib>

三、在JSP通过taglib指令导入标签库描述文件,并通过指定后缀访问此自定义标签。

<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="z" 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>
	<!-- 如果条件为true,就输出标签体内容;为false,就跳过标签体,不输出标签体内容。 -->
	<z:if test="ture">
		哈哈呵呵
	</z:if>
</body>
</html>

4.4.z:foreach

示例:

<z:foreach test="${myl }" items="a">
    ${a }<br/>
</z:foreach>

功能:遍历集合里面的数据。

第一步:写一个标签助手类继承BodyTagSupport。重写方法doStartTag()、doEndTag()、doAfterBody()。

package com.zking.tag;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;

public class ForeachTag extends BodyTagSupport{
	private List test;
	private String items;
	
	public String getItems() {
		return items;
	}

	public void setItems(String items) {
		this.items = items;
	}
	
	public List getTest() {
		return test;
	}

	public void setTest(List test) {
		this.test = test;
	}
	
	/**
	 * 开始标签
	 */
	@Override
	public int doStartTag() throws JspException {
		PrintWriter out = null;
		try {
			out = pageContext.getResponse().getWriter();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// 如果得到的属性值为空,那么就不循环直接跳过标签体
		if(null == this.test) {
			return SKIP_BODY;
		}else {
			// 将值取出来
			Iterator myi = test.iterator();
			if(myi.hasNext()) {
				pageContext.getRequest().setAttribute(this.items, myi.next());
				
				// 先在开始标签输出一次值
//				out.write(myi.next().toString());
				pageContext.getRequest().setAttribute("myi", myi);
			}
			return EVAL_BODY_INCLUDE;
		}
	}
	
	/**
	 * 标签体
	 */
	@Override
	public int doAfterBody() throws JspException {
		Iterator myi =  (Iterator) pageContext.getRequest().getAttribute("myi");
		if(myi.hasNext()) {
			pageContext.getRequest().setAttribute(this.items, myi.next());
			return EVAL_BODY_AGAIN;
		}else {
			return SKIP_BODY;
		}
	}
	
	/**
	 * 结束标签
	 */
	@Override
	public int doEndTag() throws JspException {
		return super.doEndTag();
	}
	
}

在开始标签方法和标签体方法写入foreach标签的功能。

    /**
	 * 开始标签
	 */
	@Override
	public int doStartTag() throws JspException {
		PrintWriter out = null;
		try {
			out = pageContext.getResponse().getWriter();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// 如果得到的属性值为空,那么就不循环直接跳过标签体
		if(null == this.test) {
			return SKIP_BODY;
		}else {
			// 将值取出来
			Iterator myi = test.iterator();
			if(myi.hasNext()) {
				pageContext.getRequest().setAttribute(this.items, myi.next());
				
				// 先在开始标签输出一次值
//				out.write(myi.next().toString());
				pageContext.getRequest().setAttribute("myi", myi);
			}
			return EVAL_BODY_INCLUDE;
		}
	}
	
	/**
	 * 标签体
	 */
	@Override
	public int doAfterBody() throws JspException {
		Iterator myi =  (Iterator) pageContext.getRequest().getAttribute("myi");
		if(myi.hasNext()) {
			pageContext.getRequest().setAttribute(this.items, myi.next());
			return EVAL_BODY_AGAIN;
		}else {
			return SKIP_BODY;
		}
	}

二、创建标签库描述文件(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版本 -->
	<jsp-version>1.2</jsp-version>
	<!-- 自定义标签简称(给标签库取名字)-->
	<short-name>Simple Tags</short-name>
	<!-- 自定义标签引用名 -->
	<uri>/zking</uri>

	<!-- foreach标签 -->
	<tag>
		<!-- 标签名 -->
		<name>foreach</name>
		<!-- 该标签对应的标签助手类 -->
		<tag-class>com.zking.tag.ForeachTag</tag-class>
		<!-- 声明标签类型 1.jsp类型:jsp; 2.空类型:empty。 -->
		<body-content>jsp</body-content>
		
		<!-- 定义属性1 -->
		<attribute>
			<!-- 属性名 -->
			<name>test</name>
			<!-- 该标签是否必写 -->
			<required>true</required>
			<!-- 是否接收表达式传值 -->
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<!-- 定义属性2 -->
		<attribute>
			<!-- 属性名 -->
			<name>items</name>
			<!-- 该属性是否必写 -->
			<required>false</required>
			<!-- 是否接收表达式传值 -->
			<rtexprvalue>false</rtexprvalue>
		</attribute>
	</tag>

</taglib>

三、在JSP通过taglib指令导入标签库描述文件,并通过指定后缀访问此自定义标签。

<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="z" 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>
    <%
		List list = new ArrayList();
		for(int i = 1; i <= 100; i++){
			list.add("傻蛋: " + i + "号");
		}
		session.setAttribute("myl", list);
	%>
<body>
	<z:foreach test="${myl }" items="a">
	    ${a }<br/>
	</z:foreach>
</body>
</html>

完。

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值