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>
.....
廣告