自定义标签定义:是用户定义的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)。