标签语言特点
<开始标签 属性="属性值">标签体</结束标签>
空标签
<br/><hr/>
<开始标签></结束标签>
<开始标签/>
自定义标签的开发及使用步骤
1 创建一个标签助手类(继承BodyTagSupport)
标签属性必须与助手类的属性对应、且要提供对应get/set方法
public class TestTag extends BodyTagSupport{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
2 创建标签库描述文件(tld),添加自定义标签的配置
注:tld文件必须保存到WEB-INF目录或其子目录
3 在JSP通过taglib指令导入标签库,并通过指定后缀访问自定义标签
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
标签生命周期
流程A:
SKIP_BODY
1 实例化标签助手类->doStartTag()------------->doEndTag()
//主要用开发简单标签
/**
* 在结束标签执行的动作
* 返回值两种结果
* 1.计算页面的后续部分(默认)EVAL_PAGE
* 2.跳过页面的后续部分 SKIP_PAGE
*
*
*/
@Override
public int doEndTag() throws JspException {
//System.out.println("doEndTag()......");
return EVAL_PAGE;
}
/**
* 在开始标签时执行的动作
* 返回值有两种
* 1.跳过标签体内容
* 2.执行计算标签体并输出内容
*
*/
@Override
public int doStartTag() throws JspException {
//System.out.println("doStartTag()......");
//System.out.println("我的名字叫"+this.name);
return EVAL_BODY_INCLUDE;
}
流程B:
EVAL_BODY_INCLUDE SKIP_BODY
2 实例化标签助手类->doStartTag()------------->doAfterBody---------------->doEndTag()...
EVAL_BODY_AGAIN
/**
* 在标签体之后在结束标签之前执行的动作
* 返回值两种:
* 1.跳过主题,执行doEndTag的方法SKIP_BOOY
* 2.再计算主题一次 EVAL_BODY_AGAIN
*/
/*@Override
public int doAfterBody() throws JspException {
//获取count值
int count = (int)pageContext.getAttribute("count");
if(count<3) {
count++;
pageContext.setAttribute("count", count);
return EVAL_BODY_AGAIN;
}else {
return SKIP_BODY;
}
}
*/
@Override
public int doEndTag() throws JspException {
return super.doEndTag();
}
/**
* 默认为跳过标签体
*/
@Override
public int doStartTag() throws JspException {
pageContext.setAttribute("count", 1);
String str="";
for (Object string : item) {
str+=string;
}
pageContext.setAttribute(var, str);
return EVAL_BODY_INCLUDE;
}
<z:test name="aa">111111</z:test>
SKIP_BODY:跳过主体( 不会打印“111111”)
EVAL_BODY_INCLUDE:计算标签主体内容并[输出](会打印“111111”)
EVAL_PAGE:计算页面的后续部分
SKIP_PAGE:跳过页面的后续部分(不建议用,太霸道)
EVAL_BODY_AGAIN:再计算主体一次