JSP - Tag personalizzati

In questo capitolo, discuteremo i tag personalizzati in JSP. Un tag personalizzato è un elemento del linguaggio JSP definito dall'utente. Quando una pagina JSP contenente un tag personalizzato viene tradotta in un servlet, il tag viene convertito in operazioni su un oggetto chiamato tag handler. Il contenitore Web quindi richiama quelle operazioni quando viene eseguito il servlet della pagina JSP.

Le estensioni tag JSP consentono di creare nuovi tag che è possibile inserire direttamente in una pagina JavaServer. La specifica JSP 2.0 ha introdotto i gestori di tag semplici per la scrittura di questi tag personalizzati.

Per scrivere un tag personalizzato, puoi semplicemente estendere SimpleTagSupport class e sovrascrivere il doTag() metodo, dove puoi inserire il tuo codice per generare contenuto per il tag.

Crea tag "Hello"

Considera di voler definire un tag personalizzato denominato <ex: Hello> e di usarlo nel modo seguente senza un corpo:

<ex:Hello />

Per creare un tag JSP personalizzato, è necessario prima creare una classe Java che funge da gestore di tag. Creiamo ora il fileHelloTag classe come segue -

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!");
   }
}

Il codice sopra ha una codifica semplice in cui il file doTag() il metodo accetta l'oggetto JspContext corrente utilizzando il getJspContext() metodo e lo utilizza per inviare "Hello Custom Tag!" alla corrente JspWriter oggetto

Compiliamo la classe precedente e copiamola in una directory disponibile nella variabile d'ambiente CLASSPATH. Infine, crea il seguente file di libreria di tag:<Tomcat-Installation-Directory>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>

Usiamo ora il tag personalizzato sopra definito Hello nel nostro programma JSP come segue:

<%@ taglib prefix = "ex" uri = "WEB-INF/custom.tld"%>

<html>
   <head>
      <title>A sample custom tag</title>
   </head>
   
   <body>
      <ex:Hello/>
   </body>
</html>

Chiama il JSP sopra e questo dovrebbe produrre il seguente risultato:

Hello Custom Tag!

Accesso al corpo del tag

Puoi includere un messaggio nel corpo del tag come hai visto con i tag standard. Considera di voler definire un tag personalizzato denominato<ex:Hello> e vuoi usarlo nel modo seguente con un corpo:

<ex:Hello>
   This is message body
</ex:Hello>

Apportiamo le seguenti modifiche al codice del tag precedente per elaborare il corpo del tag:

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());
   }
}

Qui, l'output risultante dall'invocazione viene prima catturato in un file StringWriterprima di essere scritto nel JspWriter associato al tag. Abbiamo bisogno di cambiare il file TLD come segue:

<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>

Chiamiamo ora il tag sopra con il corpo corretto come segue:

<%@ 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>

Riceverai il seguente risultato:

This is message body

Attributi tag personalizzati

Puoi utilizzare vari attributi insieme ai tuoi tag personalizzati. Per accettare un valore di attributo, una classe di tag personalizzato deve implementare ilsetter metodi, identici ai metodi setter JavaBean come mostrato di seguito -

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());
      }
   }
}

Il nome dell'attributo è "message", quindi il metodo setter è setMessage(). Aggiungiamo ora questo attributo nel file TLD utilizzando l'estensione<attribute> elemento come segue -

<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>

Seguiamo JSP con l'attributo del messaggio come segue:

<%@ 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>

Questo produrrà il seguente risultato:

This is custom tag

Considera l'idea di includere le seguenti proprietà per un attributo:

S.No. Proprietà e scopo
1

name

L'elemento name definisce il nome di un attributo. Ogni nome di attributo deve essere univoco per un particolare tag.

2

required

Specifica se questo attributo è obbligatorio o facoltativo. Sarebbe falso per facoltativo.

3

rtexprvalue

Dichiara se un valore di espressione di runtime per un attributo di tag è valido

4

type

Definisce il tipo di classe Java di questo attributo. Per impostazione predefinita si presume comeString

5

description

Può essere fornita una descrizione informativa.

6

fragment

Dichiara se il valore di questo attributo deve essere trattato come un file JspFragment.

Di seguito è riportato l'esempio per specificare le proprietà relative a un attributo:

.....
   <attribute>
      <name>attribute_name</name>
      <required>false</required>
      <type>java.util.Date</type>
      <fragment>false</fragment>
   </attribute>
.....

Se stai utilizzando due attributi, puoi modificare il tuo TLD come segue:

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