注意点1:setJspBody方法和doTag方法是整个简单标签里最重要的两个方法。服务器在调用标签的时候,首先会调用setJspBody方法,把标签体作为一个JspFragment对象传递进来。接着,服务器遇到标签执行的时候调用doTag方法,要特别注意的是,简单标签没有开始标签和结束标签之分!
注意点2:设置标签体类型scriptless。因为在JSP2.0中,sun公司已经不建议在JSP页面中写脚本代码!如果设置标签体类型JSP,这样JSP页面中就可以写脚本代码。
执行流程:浏览器向服务器发出请求,服务器执行jsp。遇到简单标签,第一步,实例化标签处理器类;第二步,调用setJspContext,把页面pageContext传递给标签处理器类;第三步,调用setParent,把父标签传递进去,如果没有,传null;第四步,调用setJspBody方法,把封装了标签体JspFragment对象传递给标签处理器类;经过上述步骤,标签的初始化完成,开始执行标签。第五步,执行页面中的自定义标签,实际上就是调用doTgt方法。标签执行完成!
1.控制jsp页面某一部分内容是否执行
jsp页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/simpletag" prefix="simpletag"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>用简单标签控制是否执行标签体</title>
</head>
<body>
<simpletag:demo1>
aaaaa
</simpletag:demo1>
</body>
</html>
标签处理器类:
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
//控制标签体是否执行
public class SimpleTagDemo1 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
JspFragment jf = this.getJspBody(); //拿到标签体
//jf.invoke(this.getJspContext().getOut()); //注释掉,代表什么都不做,不会有任何的输出
}
}
2.控制标签体 重复执行
jsp页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/simpletag" prefix="simpletag"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>控制标签体重复执行</title>
</head>
<body>
<simpletag:demo2>
This is my JSP page. <br>
</simpletag:demo2>
</body>
</html>
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class SimpleTagDemo2 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
JspFragment jf = this.getJspBody();
for (int i=0; i<5; i++) {
jf.invoke(null); //默认写到浏览器。等价于jf.invoke(this.getJspContext().getOut())
}
}
}
3.修改标签体内容输出
jsp页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/simpletag" prefix="simpletag"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>修改标签体</title>
</head>
<body>
<simpletag:demo3>
This is my JSP page. <br>
</simpletag:demo3>
</body>
</html>
标签处理器类:
import java.io.IOException;
import java.io.StringWriter;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
//修改标签体
public class SimpleTagDemo3 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);
}
}
4.控制标签余下的jsp页面是否执行
jsp页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/simpletag" prefix="simpletag"%>
<simpletag:demo4/>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>控制标签余下的JSP不执行</title>
</head>
<body>
This is my JSP page. <br>
</body>
</html>
标签处理器类:
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.SkipPageException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
//控制标签余下的JSP不执行
public class SimpleTagDemo4 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
throw new SkipPageException();
}
}