JSP自定义标签-out、if、foreach标签

自定义标签定义:是用户定义的JSP语言元素。扩展名为tld的文件(tag标签的配置文件),通常放在WEB-INF下面。

怎样创建和使用自定义标签?

************步骤一*******************:

在你的web应用目录下,找到WEB-INF文件夹,在里面新建一个tld类型的文件:

<!-- 标签库描述符 -->
<taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
	<tlib-version>1.0</tlib-version><!-- 代表标签库的版本号 -->
	<jsp-version>1.2</jsp-version><!-- 代表jsp的版本 -->
	<short-name>Simple Tags</short-name><!-- 你的标签库的简称 -->
	<uri>/zking</uri><!-- 你标签库的引用uri -->
	<!-- out标签 -->
	<tag>
		<!-- 标签名 -->
		<name>out</name><!-- 你定义的标签的名称 -->
		<!-- 标签助手类 -->
		<tag-class>com.zking.text.OutTag</tag-class><!-- 对应的标签处理程序:包名+类名(全限定名) -->
		<!-- 标签的内容类型:empty表示空标签(使用空标签会报错),jsp表示可以为任何合法的JSP元素 -->
		<body-content>JSP</body-content><!-- 标签体内容的格式 -->
		<!-- value的属性 -->
		<attribute>
			<name>value</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
	</tag>

	<!-- if标签 -->
	<tag>
		<!-- 标签名 -->
		<name>if</name><!-- 你定义的标签的名称 -->
		<!-- 标签助手类 -->
		<tag-class>com.zking.text.IfTag</tag-class><!-- 对应的标签处理程序:包名+类名(全限定名) -->
		<!-- 标签的内容类型:empty表示空标签(使用空标签会报错),jsp表示可以为任何合法的JSP元素 -->
		<body-content>JSP</body-content><!-- 标签体内容的格式 -->
		<!-- test的属性 -->
		<attribute>
			<name>test</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
	</tag>

	<!-- foreach标签 -->
	<tag>
		<!-- 标签名 -->
		<name>foreach</name><!-- 你定义的标签的名称 -->
		<!-- 标签助手类 -->
		<tag-class>com.zking.text.ForeachTag</tag-class><!-- 对应的标签处理程序:包名+类名(全限定名) -->
		<!-- 标签的内容类型:empty表示空标签(使用空标签会报错),jsp表示可以为任何合法的JSP元素 -->
		<body-content>JSP</body-content><!-- 标签体内容的格式 -->
		<!-- var的属性 -->
		<attribute>
			<name>var</name>
			<required>true</required>
			<rtexprvalue>false</rtexprvalue>
		</attribute>
		<!-- items的属性 -->
		<attribute>
			<name>items</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
	</tag>
</taglib>

************步骤二*******************:

编写一个普通的java类,继承BodyTagSupport或TagSupport类~

BodyTagSupport和TagSupport的区别:

区别主要是标签处理类是否需要与标签体交互(标签处理类是否要读取标签体的内容和改变标签体返回的内容)。

(1)、创建一个Java类,编写out标签处理类:

import java.io.IOException;

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

/**
 * 自定义out标签处理类 BodyTagSupport(TagSupport)
 */
public class OutTag extends BodyTagSupport {

	private static final long serialVersionUID = -115921279272378672L;

	/**
	 * value属性
	 */
	private String value;

	public String getValue() {
		return value;
	}

	public void setValue(String value) {
		this.value = value;
	}

	@Override
	public int doStartTag() throws JspException {
		try {
			// 输出value值
			pageContext.getOut().println(value);
		} catch (IOException e) {
			e.printStackTrace();
		}
		// EVAL_BODY_INCLUDE显示文本内容
		// SKIP_BODY不显示标签中(文本)的内容
		return EVAL_BODY_INCLUDE;
	}

	@Override
	public int doEndTag() throws JspException {
		// EVAL_PAGE继续显示标签下面的内容
		// SKIP_PAGE 显示完该标签内容后,不再显示后面的标签内容,直接跳转到</html>
		return EVAL_PAGE;
	}

}

(2)、创建一个Java类,编写if标签处理类:

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

/**
 * 自定义if标签处理类 BodyTagSupport(TagSupport)
 */
public class IfTag extends BodyTagSupport {

	/**
	 * test属性
	 */
	private Boolean test;

	public Boolean getTest() {
		return test;
	}

	public void setTest(Boolean test) {
		this.test = test;
	}

	private static final long serialVersionUID = 233693256950568283L;

	@Override
	public int doStartTag() throws JspException {
		// 如果为true则显示文本中的内容,否则不显示
		if (test) {
			return EVAL_BODY_INCLUDE;
		} else {
			return SKIP_BODY;
		}
	}

	@Override
	public int doEndTag() throws JspException {
		// 继续显示标签下的内容
		return EVAL_PAGE;
	}

}
(3)、创建一个Java类,编写foreach标签处理类:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

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

/**
 * 自定义foreach标签处理类 BodyTagSupport(TagSupport)
 */
public class ForeachTag extends BodyTagSupport {

	/**
	 * items属性
	 */
	private List<Object> items = new ArrayList<>();

	/**
	 * var属性
	 */
	private String var;

	public List<Object> getItems() {
		return items;
	}

	public void setItems(List<Object> items) {
		this.items = items;
	}

	public String getVar() {
		return var;
	}

	public void setVar(String var) {
		this.var = var;
	}

	private static final long serialVersionUID = 108801136461441561L;

	@Override
	public int doStartTag() throws JspException {
		// 如果集合没有值则跳过,否则进行输出
		if (items == null || items.size() == 0) {
			return SKIP_BODY;
		} else {
			// 得到集合信息
			Iterator<Object> it = items.iterator();
			// 放入到请求域中
			pageContext.setAttribute("it", it);
			Object v = it.next();
			pageContext.setAttribute(var, v);
			// 显示文本内容
			return EVAL_BODY_INCLUDE;
		}
	}

	@Override
	public int doAfterBody() throws JspException {
		// 得到请求域中的值
		Iterator<Object> it = (Iterator<Object>) pageContext.getAttribute("it");
		if (it.hasNext()) {
			Object v = it.next();
			pageContext.setAttribute(var, v);
			// 循环
			return EVAL_BODY_AGAIN;
		} else {
			// 否则跳过 不输出
			return SKIP_BODY;
		}
	}

	@Override
	public int doEndTag() throws JspException {
		// 继续读取标签的值
		return EVAL_PAGE;
	}

}

************步骤三*******************:
开始使用自定义标签:

(1)、导入标签库
<%@ taglib prefix="m" uri="/zking"%>

<body>
	<!-- out标签的使用 -->
	<m:out value="123"></m:out>

	<!-- if标签的使用 -->
	<%
		String name = "zhangsan";
		request.setAttribute("name", name);
	%>

	<m:if test="${name eq 'zhangsan' }">if的自定义标签</m:if>


	<!-- foreach标签的使用 -->
	<%
		List<Object> list = new ArrayList<>();
		for (int i = 1; i < 11; i++) {
			list.add("张" + i);
		}
		request.setAttribute("list", list);
	%>

	<ul>
		<m:foreach items="${list }" var="s">
			<li>${s }</li>
		</m:foreach>
	</ul>
</body>
注意点:使用上述代码需要导入jar包(fastjson-1.2.44.jar、jstl-1.2.jar、jstl.jar)。


©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页