package com.example.tag;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.PageContext;
public class HelloTag implements Tag {
private PageContext pageContext;
private Tag parent;
public void setPageContext(PageContext pc) { this.pageContext = pc; }
public void setParent(Tag parent) { this.parent = parent; }
public Tag getParent() { return parent; }
public int doStartTag() {
try {
pageContext.getOut().print("Hello World!");
} catch (Exception e) {}
return SKIP_BODY; // 無標籤主體內容
}
public int doEndTag() { return EVAL_PAGE; }
public void release() {} // 釋放資源
}

關鍵常數: EVAL_PAGE 繼續處理頁面、SKIP_BODY 跳過主體、SKIP_PAGE 停止處理。
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="https://java.sun.com/xml/ns/javaee" version="2.1">
<tlib-version>1.0</tlib-version>
<short-name>mytag</short-name>
<uri>https://example.com/mytag</uri>
<tag>
<name>hello</name>
<tag-class>com.example.tag.HelloTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>

<%@ taglib prefix="my" uri="https://example.com/mytag" %>
<html><body>
<my:hello /> <!-- 輸出: Hello World! -->
<my:hello /> <!-- 再次輸出 -->
</body></html>

<my:pager />、<my:menu />| 類型 | 介面/基類 | 特點 |
|---|---|---|
| 簡單標籤 | Tag / SimpleTagSupport | 無主體、無屬性、單一功能 |
| 帶屬性標籤 | Tag + setter 方法 | 支援屬性配置 <my:tag attr="value"> |
| 帶主體標籤 | BodyTag / BodyTagSupport | 處理標籤內容 <my:tag>body</my:tag> |
| 迭代標籤 | IterationTag | 重複處理主體 EVAL_BODY_AGAIN |