目录
一、标签语言特点
标签结构
分类
二、自定义标签的开发及使用步骤
步骤
案例1
三、标签的生命周期
返回值
标签开发场景
四、案例
z:if标签
z:set与z:out标签
一、标签语言特点
标签结构
<开始标签 属性="属性值">标签体结束标签>
分类
空标签 例如:br、hr
ui标签:没有标签体也能在网页中输出内容的标签,称为UI标签
控制标签 例如:if、foreach
数据标签 例如:set、out标签
二、自定义标签的开发及使用步骤
步骤
按住Ctrl点击c:if标签,可以连接跳到c.tld文件中,而.tld文件即使c标签库的定义配置文件
继承BodyTagSupport(助手类)
注意:tld必须保存到WEB-INF目录或其子目录
jsp通过taglib指令导入标签库
案例1
c:if换成z:if
把所有c.tld 复制一份新建的文件,然后只留下一个tag标签
JSTL 1.1 core library JSTL core 1.1 z http://jsp.veryedu.cn Provides core validation features for JSTL tags. org.apache.taglibs.standard.tlv.JstlCoreTLV demo1 com.maomao.tag.DemoTag JSP var false false if com.maomao.tag.IfTag JSP test true true
package com.maomao.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 {
// 如果不满足条件,就不输出标签体->dostarttag的返回值skip_body
// 需要获取到是否满足条件的结果集,那么该标签就有一个属性,属性值是boolean
return test?EVAL_BODY_INCLUDE:SKIP_BODY;
}
}
三、标签的生命周期
返回值
SKIP_BODY:跳过主体
EVAL_BODY_INCLUDE:计算标签主体内容并输出
EVAL_BODY_AGAIN:再计算主体一次
EVAL_PAGE:计算页面的后续部分
SKIP_PAGE:跳过页面的后续部分
标签开发场景
doStartTag()-------------------------->doEndTag()
doStartTag()-------------------------->doAfterBody------------------------------->doEndTag()
doStartTag()-------------------------->doAfterBody(循环)----------------------->doEngTag()
package com.maomao.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class DemoTag extends BodyTagSupport{
@Override
public int doStartTag() throws JspException {
System.out.println("------------------doStartTag-------------------");
return EVAL_BODY_INCLUDE;
}
@Override
public int doAfterBody() throws JspException {
System.out.println("------------------doAfterBody-------------------");
// return EVAL_BODY_AGAIN;
return super.doAfterBody();
// return SKIP_PAGE;
}
@Override
public int doEndTag() throws JspException {
System.out.println("------------------doEndTag-------------------");
// return super.doEndTag();
return SKIP_PAGE;
}
}
四、案例
z:if标签
package com.maomao.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 {
// 如果不满足条件,就不输出标签体->dostarttag的返回值skip_body
// 需要获取到是否满足条件的结果集,那么该标签就有一个属性,属性值是boolean
return test?EVAL_BODY_INCLUDE:SKIP_BODY;
}
}
z:set与z:out标签
package com.maomao.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 {
// 如果不满足条件,就不输出标签体->dostarttag的返回值skip_body
// 需要获取到是否满足条件的结果集,那么该标签就有一个属性,属性值是boolean
return test?EVAL_BODY_INCLUDE:SKIP_BODY;
}
}
z:set与z:out标签
z:set
package com.maomao.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class SetTag extends BodyTagSupport{
private String var;
private Object value;
public String getVar() {
return var;
}
public void setVar(String var) {
this.var = var;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
@Override
public int doStartTag() throws JspException {
// 要存储数据,一键值对的方式存储,分析得来,该标签有2个属性
pageContext.setAttribute(var, value);
return super.doStartTag();
}
}
z:out
package com.maomao.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class OutTag extends BodyTagSupport{
private Object value;
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
@Override
public int doStartTag() throws JspException {
JspWriter out = pageContext.getOut();
try {
out.print(value);
} catch (IOException e) {
e.printStackTrace();
}
return super.doStartTag();
}
}



