
- JSP 基礎教程
- JSP - 首頁
- JSP - 概述
- JSP - 環境搭建
- JSP - 架構
- JSP - 生命週期
- JSP - 語法
- JSP - 指令
- JSP - 動作
- JSP - 隱式物件
- JSP - 客戶端請求
- JSP - 伺服器響應
- JSP - HTTP 狀態碼
- JSP - 表單處理
- JSP - 編寫過濾器
- JSP - Cookie 處理
- JSP - Session跟蹤
- JSP - 檔案上傳
- JSP - 日期處理
- JSP - 頁面重定向
- JSP - 點選計數器
- JSP - 自動重新整理
- JSP - 傳送郵件
- 高階 JSP 教程
- JSP - 標準標籤庫
- JSP - 資料庫訪問
- JSP - XML 資料
- JSP - JavaBean
- JSP - 自定義標籤
- JSP - 表示式語言
- JSP - 異常處理
- JSP - 除錯
- JSP - 安全
- JSP - 國際化
- JSP 有用資源
- JSP - 問答
- JSP - 快速指南
- JSP - 有用資源
- JSP - 討論
JSP - 自定義標籤
本章將討論 JSP 中的自定義標籤。自定義標籤是使用者定義的 JSP 語言元素。當包含自定義標籤的 JSP 頁面被轉換為 Servlet 時,該標籤將被轉換為對稱為標籤處理器的物件的運算。然後,當執行 JSP 頁面的 Servlet 時,Web 容器將呼叫這些運算。
JSP 標籤擴充套件允許您建立新的標籤,您可以直接將其插入到 JavaServer 頁面中。JSP 2.0 規範引入了簡單的標籤處理器來編寫這些自定義標籤。
要編寫自定義標籤,您可以簡單地擴充套件SimpleTagSupport類並覆蓋doTag()方法,您可以在其中放置程式碼以生成標籤的內容。
建立“Hello”標籤
假設您想定義一個名為<ex:Hello>的自定義標籤,並且您想按照以下方式在沒有主體的情況下使用它:
<ex:Hello />
要建立自定義 JSP 標籤,您必須首先建立一個充當標籤處理器的 Java 類。現在讓我們建立如下HelloTag類:
package com.tutorialspoint; import javax.servlet.jsp.tagext.*; import javax.servlet.jsp.*; import java.io.*; public class HelloTag extends SimpleTagSupport { public void doTag() throws JspException, IOException { JspWriter out = getJspContext().getOut(); out.println("Hello Custom Tag!"); } }
上面的程式碼很簡單,其中doTag()方法使用getJspContext()方法獲取當前的 JspContext 物件,並使用它將“Hello Custom Tag!”傳送到當前的JspWriter物件。
讓我們編譯上面的類並將其複製到環境變數 CLASSPATH 中可用的目錄中。最後,建立以下標籤庫檔案:<Tomcat-安裝目錄>webapps\ROOT\WEB-INF\custom.tld。
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>Example TLD</short-name> <tag> <name>Hello</name> <tag-class>com.tutorialspoint.HelloTag</tag-class> <body-content>empty</body-content> </tag> </taglib>
現在讓我們在我們的 JSP 程式中使用上面定義的自定義標籤Hello,如下所示:
<%@ taglib prefix = "ex" uri = "WEB-INF/custom.tld"%> <html> <head> <title>A sample custom tag</title> </head> <body> <ex:Hello/> </body> </html>
呼叫上面的 JSP,這應該會產生以下結果:
Hello Custom Tag!
訪問標籤體
您可以像使用標準標籤一樣在標籤體中包含訊息。假設您想定義一個名為<ex:Hello>的自定義標籤,並且您想按照以下方式在有主體的情況下使用它:
<ex:Hello> This is message body </ex:Hello>
讓我們對上面的標籤程式碼進行以下更改以處理標籤體:
package com.tutorialspoint; import javax.servlet.jsp.tagext.*; import javax.servlet.jsp.*; import java.io.*; public class HelloTag extends SimpleTagSupport { StringWriter sw = new StringWriter(); public void doTag() throws JspException, IOException { getJspBody().invoke(sw); getJspContext().getOut().println(sw.toString()); } }
在這裡,呼叫產生的輸出首先被捕獲到StringWriter中,然後再寫入與標籤關聯的 JspWriter。我們需要更改 TLD 檔案,如下所示:
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>Example TLD with Body</short-name> <tag> <name>Hello</name> <tag-class>com.tutorialspoint.HelloTag</tag-class> <body-content>scriptless</body-content> </tag> </taglib>
現在讓我們使用正確的正文呼叫上面的標籤,如下所示:
<%@ taglib prefix = "ex" uri = "WEB-INF/custom.tld"%> <html> <head> <title>A sample custom tag</title> </head> <body> <ex:Hello> This is message body </ex:Hello> </body> </html>
您將收到以下結果:
This is message body
自定義標籤屬性
您可以與自定義標籤一起使用各種屬性。為了接受屬性值,自定義標籤類需要實現setter方法,與 JavaBean setter 方法相同,如下所示:
package com.tutorialspoint; import javax.servlet.jsp.tagext.*; import javax.servlet.jsp.*; import java.io.*; public class HelloTag extends SimpleTagSupport { private String message; public void setMessage(String msg) { this.message = msg; } StringWriter sw = new StringWriter(); public void doTag() throws JspException, IOException { if (message != null) { /* Use message from attribute */ JspWriter out = getJspContext().getOut(); out.println( message ); } else { /* use message from the body */ getJspBody().invoke(sw); getJspContext().getOut().println(sw.toString()); } } }
屬性的名稱是“message”,因此 setter 方法是setMessage()。現在讓我們使用<attribute>元素在 TLD 檔案中新增此屬性,如下所示:
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>Example TLD with Body</short-name> <tag> <name>Hello</name> <tag-class>com.tutorialspoint.HelloTag</tag-class> <body-content>scriptless</body-content> <attribute> <name>message</name> </attribute> </tag> </taglib>
讓我們按照帶有 message 屬性的 JSP 如下所示:
<%@ taglib prefix = "ex" uri = "WEB-INF/custom.tld"%> <html> <head> <title>A sample custom tag</title> </head> <body> <ex:Hello message = "This is custom tag" /> </body> </html>
這將產生以下結果:
This is custom tag
考慮為屬性包含以下屬性:
序號 | 屬性及用途 |
---|---|
1 | name name 元素定義屬性的名稱。每個屬性名稱對於特定標籤必須唯一。 |
2 | required 這指定此屬性是必需的還是可選的。對於可選屬性,它將為 false。 |
3 | rtexprvalue 宣告標籤屬性的執行時表示式值是否有效。 |
4 | type 定義此屬性的 Java 類型別。預設情況下,它假定為String。 |
5 | description 可以提供資訊性描述。 |
6 | fragment 宣告此屬性值是否應被視為JspFragment。 |
以下是指定與屬性相關的屬性的示例:
..... <attribute> <name>attribute_name</name> <required>false</required> <type>java.util.Date</type> <fragment>false</fragment> </attribute> .....
如果您使用兩個屬性,則可以修改您的 TLD,如下所示:
..... <attribute> <name>attribute_name1</name> <required>false</required> <type>java.util.Boolean</type> <fragment>false</fragment> </attribute> <attribute> <name>attribute_name2</name> <required>true</required> <type>java.util.Date</type> </attribute> .....