自定义标签探究(一)
标签调用过程
tld文件
jsp页面调用
引用块
jsp顶部引用
使用标签
定义标签解释
<tag>
<name>set</name>——jsp页面使用的标签名 c:set
<tag-class>com.rong.tag.SetTag()</tag-class>
<body-content>JSP</body-content>
<attribute>——定义标签的属性
<description>标签描述</description>
<name>value</name>——属性名
<required>false</required>——是否必填
<rtexprvalue>true</rtexprvalue>——是否支持表达式(el表达式,ognl表达式)
<type>boolean</type>
</attribute>
</tag>
过程
1.引用块的prefix是写你在该页面使用时用的标签总名(这里我用的是r)
2.通过引用块的uri找到要调用的标签的tld文件(看上面的tld文件),
3.在tld文件里会找到你使用的标签名助手类:
<tag-class>com.rong.tag.DemoTag</tag-class>
4.之后就运行助手类中的内容了
助手类
自定义标签生命周期图
内容
package com.rong.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 SKIP_BODY;//跳过标签体
return EVAL_BODY_INCLUDE;//不跳过标签体
}
@Override
public int doAfterBody() throws JspException {
System.out.println("doAfterBody--------------");
// return EVAL_PAGE;//返回该值退出循环
return EVAL_BODY_AGAIN;//返回该值继续循环
}
@Override
public int doEndTag() throws JspException {
System.out.println("doEndTag--------------");
return super.doEndTag();
}
}
加上上面jsp页面调用的运行结果
这个不退出循环有点炸
自定义r标签
set标签
tld定义
<tag>
<name>set</name>
<tag-class>com.rong.tag.SetTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>var</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>value</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
助手类
package com.rong.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class SetTag extends BodyTagSupport{
private static final long serialVersionUID = 538697625512657267L;
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 {
pageContext.setAttribute(var, value);
return SKIP_BODY;
}
}
out标签
tld定义
<tag>
<name>out</name>
<tag-class>com.rong.tag.OutTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>value</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
助手类
package com.rong.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 static final long serialVersionUID = 3420962230160108108L;
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 SKIP_BODY;
}
}
if标签
tld定义
<tag>
<name>if</name>
<tag-class>com.rong.tag.IfTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>test</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
助手类
package com.rong.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class IfTag extends BodyTagSupport{
private static final long serialVersionUID = 6848194088322690923L;
private boolean test;
public boolean isTest() {
return test;
}
public void setTest(boolean test) {
this.test = test;
}
@Override
public int doStartTag() throws JspException {
return test?EVAL_BODY_INCLUDE:SKIP_BODY;
}
}
三个标签的jsp代码
三个标签的jsp页面
总结
博主有点炸,看完这个你别炸!