在sun官方文档上有下面这样一段话。
public interface SimpleTag
extends JspTag
Interface for defining Simple Tag Handlers.
Simple Tag Handlers differ from Classic Tag Handlers in that instead of supporting doStartTag() and doEndTag(), the SimpleTag interface provides a simple doTag() method, which is called once and only once for any given tag invocation. All tag logic, iteration, body evaluations, etc. are to be performed in this single method. Thus, simple tag handlers have the equivalent power of BodyTag, but with a much simpler lifecycle and interface.
To support body content, the setJspBody() method is provided. The container invokes the setJspBody() method with a JspFragment object encapsulating the body of the tag. The tag handler implementation can call invoke() on that fragment to evaluate the body as many times as it needs.
A SimpleTag handler must have a public no-args constructor. Most SimpleTag handlers should extend SimpleTagSupport.
The following is a non-normative, brief overview of the SimpleTag lifecycle. Refer to the JSP Specification for details.
必知必会:简单标签也是一个标签,所以声明的过程也Tag的一样,同样是三步。
package web.simpletag;
import java.io.IOException;
import java.io.StringWriter;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.SkipPageException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/** * 控制标签体是否执行 * @author Summer * */
public class BodyController extends SimpleTagSupport {
static{
/* * 简单标签整体的执行流程如下: * 1.浏览器向web服务器发送请求,然后web服务器调用servlet(jsp) * 2.complier解释器进行初始化工作,先是调用setJspContext方法,将pageContext对象传递进去 * 3.然后是看看此标签的父标签,即setParent方法 * 4.再就是调用doTag方法了吧?但是要知道doTag内部会使用JspFragment对象,所以就必须先得到它,因此应该是调用setJspBody(JspFragment jspBody)方法 * 5.最后是调用doTag 方法,执行相关的代码逻辑 */
}
/** * 简单标签可以使用这一个方法实现所有的业务逻辑 */
@Override
public void doTag() throws JspException, IOException {
//代表标签体的对象
JspFragment fragment = this.getJspBody();
//fragment.invoke(null);是指将标签中的内容写给谁,null代表浏览器
//1.修改标签体的内容
// fragment.invoke(null);
//2.控制标签体内容的重复输出
// for(int i=1;i<=5;i++){
// fragment.invoke(null);//设置为null,默认为向浏览器输出
// }
//3.修改标签体的内容
PageContext context = (PageContext) fragment.getJspContext();
StringWriter writer = new StringWriter();
fragment.invoke(writer);
String content = writer.getBuffer().toString();
this.getJspContext().getOut().write(content.toUpperCase());
//4.控制jsp页面的执行与否,只需要掌握一个原理即可
/* * SkipPageException - If the page that (either directly or indirectly) invoked this * tag is to cease evaluation. A Simple Tag Handler generated from a tag * file must throw this exception if an invoked Classic Tag Handler * returned SKIP_PAGE or if an invoked Simple Tag Handler threw * SkipPageException or if an invoked Jsp Fragment threw a * SkipPageException. */
// throw new SkipPageException();
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0">
<description>JSTL 1.1 XML library</description>
<display-name>JSTL XML</display-name>
<tlib-version>1.1</tlib-version>
<short-name>x</short-name>
<uri>/simplesummer</uri>
<!-- 控制标签体内容的的简单标签的自定义标签 -->
<tag>
<name>BodyController</name>
<tag-class>web.simpletag.BodyController</tag-class>
<body-content>scriptless</body-content>
</tag>
</taglib>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib uri="/simplesummer" prefix="summer"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用SimpleTag接口实现的控制标签体内容是否执行的测试页面</title>
</head>
<body>
<summer:BodyController>Summer</summer:BodyController>
</body>
</html>