首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

JSP 自定義標籤開發完整指南:從 SimpleTag 到 TLD 配置

     編輯:Java 綜合教學

JSP 自定義標籤開發完整指南:從 SimpleTag 到 TLD 配置

JSP 自定義標籤通過封裝可復用邏輯減少頁面 Java 代碼,提升可維護性。本文系統講解基於 SimpleTag 接口的標籤開發全流程,涵蓋無主體標籤、帶主體標籤、TLD 配置細節及 JspFragment 處理。

核心接口:SimpleTag 關鍵方法

方法調用時機作用
setJspContext(JspContext)最先調用接收 PageContext,用於後續輸出操作
setParent(JspTag)有父標籤時建立標籤嵌套關係
setJspBody(JspFragment)有標籤主體時接收標籤體片段對象
doTag()最後調用執行標籤核心邏輯

調用順序固定:setJspContext → setParent → setJspBody → doTag

JspFragment 關鍵方法

void invoke(Writer out)  // 執行片段並輸出到指定 Writer,null 表示輸出到 JspContext.getOut()

案例一:無主體標籤(輸出固定文本)

1. 實現類(繼承 SimpleTagSupport)

package userDefinedJspTag;

import java.io.IOException;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class TagDemo1 extends SimpleTagSupport {
    private PageContext pc;

    @Override
    public void setJspContext(JspContext pc) {
        this.pc = (PageContext) pc;
    }

    @Override
    public void doTag() throws JspException, IOException {
        pc.getOut().print("hello");
    }
}

2. TLD 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="https://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="https://java.sun.com/xml/ns/j2ee https://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
    <tlib-version>1.0</tlib-version>
    <short-name>myfn</short-name>
    <uri>https://www.thecatcher/mytag</uri>

    <tag>
        <name>printHi</name>
        <tag-class>userDefinedJspTag.TagDemo1</tag-class>
        <body-content>empty</body-content>  <!-- 關鍵:無主體 -->
    </tag>
</taglib>

3. JSP 頁面使用

<%@ taglib uri="https://www.thecatcher/mytag" prefix="mytag"%>
<mytag:printHi/>

案例二:帶主體標籤(輸出標籤體內容)

1. 實現類核心邏輯

public void doTag() throws JspException, IOException {
    JspFragment jf = this.getJspBody();
    jf.invoke(null);  // null 表示輸出到當前 JspContext 的 out
}

2. TLD 配置差異

<tag>
    <name>out</name>
    <tag-class>userDefinedJspTag.TagDemo2</tag-class>
    <body-content>scriptless</body-content>  <!-- 關鍵:允許 EL 表達式,禁止 Java 代碼 -->
</tag>

body-content 四種取值詳解

值含義典型場景
empty無主體<mytag:printHi/>
JSP支持 EL、Java 代碼、腳本複雜邏輯標籤(不推薦)
scriptless支持 EL、JSP 標籤,禁止 Java 代碼最常用,符合減少 Java 代碼原則
tagdependent不解析任何表達式,原樣輸出模板引擎、代碼生成器

JSP 頁面使用帶主體標籤

<mytag:out>你好啊.</mytag:out>

最佳實踐建議

  • 優先使用 scriptless,配合 EL 表達式實現邏輯
  • 複雜渲染邏輯考慮使用標籤文件或模板引擎
  • TLD 文件放在 WEB-INF/tld/ 目錄,web.xml 中可不顯式聲明(Servlet 2.4+ 自動掃描)
  • 標籤類建議放在獨立包(如 com.project.tags)便於管理
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved