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