一個 Tag 本質上是一個普通的 Java 類別,唯一特殊之處在於它必須繼承 TagSupport 或 BodyTagSupport。這兩個基類由 JSP 容器提供,封裝了頁面與標籤類別的互動細節(輸入/輸出、屬性設定、體內容處理等)。開發者只需專注業務邏輯實作。
package diegoyun;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
public class OutputTag extends TagSupport {
private String name = null;
public void setName(String name) {
this.name = name;
}
public int doStartTag() throws JspException {
try {
JspWriter out = pageContext.getOut();
out.print("Hello! " + name);
} catch (Exception e) {
throw new JspException(e);
}
return EVAL_PAGE;
}
}
關鍵點:
setName 對應 name 屬性)doStartTag():標籤開始時觸發,處理邏輯與輸出pageContext.getOut() 取得輸出流EVAL_PAGE 表示繼續處理頁面其餘部分<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>diego</short-name>
<tag>
<name>out</name>
<tag-class>diegoyun.OutputTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>name</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
</taglib>
儲存為 WEB-INF/tlds/diego.tld。
<%@ page language="java" %>
<%@ taglib uri="/WEB-INF/tlds/diego.tld" prefix="diego" %>
Test Tag: <diego:out name="diegoyun"></diego:out>
啟動 Tomcat,瀏覽頁面應顯示:Test Tag: Hello! diegoyun
empty:無標籤體內容JSP:標籤體包含 JSP 程式碼,需繼承 BodyTagSupporttagdependent:標籤體由標籤自行解析| 回傳值 | 含義 |
|---|---|
| EVAL_PAGE | 繼續處理頁面 |
| SKIP_PAGE | 跳過頁面剩餘部分 |
| EVAL_BODY_INCLUDE | 處理標籤體內容 |
| EVAL_BODY_AGAIN | 重複處理標籤體(迴圈標籤常用) |
設為 true 時,屬性值可為運行時運算式(如 name="${user.name}"),大幅增強靈活性。
Tag 結尾,TLD 前綴簡短有意義SimpleTagSupport (JSP 2.0+) 簡化開發掌握 Taglib 開發,能讓 JSP 頁面更乾淨、邏輯更可復用,是從「寫頁面」進階到「建元件」的關鍵一步。