一、简单标签共定义了5个方法:
用于把JSP页面的pageContext对象传递给标签处理器对象
用于把父标签处理器对象传递给当前标签处理器对象
用于获得当前标签的父标签处理器对象
用于把代表标签体的JspFragment对象传递给标签处理器对象
用于完成所有的标签逻辑,包括输出、迭代、修改标签体内容等。在doTag方法中可以抛出javax.servlet.jsp.SkipPageException异常,用于通知WEB容器不再执行JSP页面中位于结束标记后面的内容,这等效于在传统标签的doEndTag方法中返回Tag.SKIP_PAGE常量的情况。
三、接口方法的执行顺序
private PageContext pageContext;
private String name;
/**
* 用于完成所有的标签逻辑,包括输出、迭代、修改标签体内容。在doTag方法中可以抛出javax.servelt.jsp.
* SkipPageException异常
* ,用于通知web容器不再执行JSP页面中位于结束标记后面的内容,者等效于在传统标签的doEndTag方法中返回Tag.SKIP_PAGE常量的情况
* *
*/
@Override
public void doTag() throws JspException, IOException {
System.out.println("doTag");
}
/**
* 用于获得当前标签的父标签的处理器对象
*/
@Override
public JspTag getParent() {
System.out.println("getParent");
return null;
}
/**
* 用于吧代表标签体的JspFragment对象传递给标签处理器对象
*/
@Override
public void setJspBody(JspFragment jspBody) {
System.out.println("setJspBody");
}
/**
* 用于把JSP页面的pageContext对象传递给标签处理器对象
*/
@Override
public void setJspContext(JspContext pc) {
this.pageContext = (PageContext) pc;
System.out.println("setJspContext");
}
/**
* 用于把父标签处理器对象传递给当前标签处理器对象
*/
@Override
public void setParent(JspTag parent) {
System.out.println("setParent");
}
/**
* 属性是通过这个setter方法设置进来
*/
public void setName(String name) {
System.out.println("设置name属性"+name);
this.name = name;
}
}
public class TagDemo1 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
JspFragment jf = this.getJspBody();
}
}
页面:
<html>
<head>
<title>控制标签体是否执行</title>
</head>
<body>
<hytc:demo1>
xxxx
</hytc:demo1>
</body>
</html>
2.//控制标签体是否执行
public class TagDemo2 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
JspFragment jf = this.getJspBody();
for(int i=0;i<10;i++){
jf.invoke(null);
}
}
}
页面:
<html>
<head>
<title>控制标签体重复执行</title>
</head>
<body>
<hytc:demo2>
xxxx
</hytc:demo2>
</body>
</html>
3.//修改标签体
public class TagDemo3 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
JspFragment jf = this.getJspBody();
StringWriter sw = new StringWriter();
jf.invoke(sw);
String content = sw.toString();
content = content.toUpperCase();
this.getJspContext().getOut().write(content);
}
}
页面:
<html>
<head>
<title>修改标签体</title>
</head>
<body>
<hytc:demo3>
xxxx
</hytc:demo3>
</body>
</html>
4.//控制整个jsp是否执行
public class TagDemo4 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
throw new SkipPageException();
}
}
页面:
<hytc:demo4/>
<html>
<head>
<title>修改标签体</title>
</head>
<body>
</body>
</html>
5.//
public class TagDemo5 extends SimpleTagSupport {
private int count;
private Date date;
public void setCount(int count) {
this.count = count;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public void doTag() throws JspException, IOException {
System.out.println(date);
for(int i=0;i<count;i++){
this.getJspBody().invoke(null);
}
}
}
页面:
<html>
<head>
<title>My JSP '5.jsp' starting page</title>
</head>
<body>
<hytc:demo5 count="5" date="<%=new Date() %>">
aaaaaaa
</hytc:demo5>
</body>
</html>
6.配置文件:
<tag>
<name>demo1</name>
<tag-class>web_16.simpletag.TagDemo1</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>demo2</name>
<tag-class>web_16.simpletag.TagDemo2</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>demo3</name>
<tag-class>web_16.simpletag.TagDemo3</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>demo4</name>
<tag-class>web_16.simpletag.TagDemo4</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>demo5</name>
<tag-class>web_16.simpletag.TagDemo5</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>count</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>date</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>