Latest web development tutorials

Niestandardowe znaczniki JSP

Etykiety niestandardowe są JSP elementy języka zdefiniowane przez użytkownika. Gdy strona JSP zawiera niestandardowy znacznik zostanie przekonwertowany do serwletu, konwersja etykiet dla obiektu nosi nazwę operacji modułu obsługi znacznika, który po wykonaniu połączenia kontenerów serwletów Web te operacje.

JSP tag Rozszerzenie pozwala utworzyć nową etykietę i mogą być umieszczone bezpośrednio na stronie JSP. Specyfikacja JSP 2.0 wprowadzono prostych programów obsługi Tag napisać te znaczniki niestandardowe.

Można dziedziczyć klasę SimpleTagSupport i zastąpić metodę doTag () opracowanie prostych etykiet niestandardowych.


Utwórz etykietę "Hello"

Następnie chcemy utworzyć etykietę niestandardową nazwie <ex: Witam> format tag:

<ex:Hello />

Aby utworzyć niestandardowe znaczniki JSP, należy najpierw utworzyć wiele etykiet z klas Javy. Więc stwórzmy klasę HelloTag, co następuje:

package com.w3big;

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

Poniższy kod przesłania metodę doTag (), metoda stosowana metoda getJspContext (), aby uzyskać aktualny obiekt JspContext i "Hello niestandardowy Tag!" Jest przekazywany do obiektu JspWriter.

Kompilowania powyższych klas, a następnie skopiować go do katalogu zmiennej środowiskowej CLASSPATH. Wreszcie, należy utworzyć następujące biblioteki znaczników: <katalog instalacyjny> 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.w3big.HelloTag</tag-class>
    <body-content>empty</body-content>
  </tag>
</taglib>

Następnie możemy użyć tagu Witaj w pliku JSP:

<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>
<html>
  <head>
    <title>A sample custom tag</title>
  </head>
  <body>
    <ex:Hello/>
  </body>
</html>

Powyższy program jest wyjście:

Hello Custom Tag!

Ciało zakładka Dostęp

Możesz być jak ta sama biblioteka standardowa tag zawiera treść wiadomości na etykiecie. Jak chcemy to zawartość Witam, niestandardowy format jest w następujący sposób:

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

Możemy zmodyfikować plik klasy obsługi znacznika, co następuje:

package com.w3big;

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

}

Następnie musimy zmodyfikować plik TLD w następujący sposób:

<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.w3big.HelloTag</tag-class>
    <body-content>scriptless</body-content>
  </tag>
</taglib>

Teraz możemy użyć zmodyfikowanego etykietę w JSP, co następuje:

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

Powyższy wyjściowe programu jest następujący:

This is message body

Niestandardowe atrybuty tagu

Można ustawić kryteria niestandardowe w różnych właściwościach, aby otrzymać właściwość, wartość niestandardowej klasy tag musi implementować metody setter, metody JavaBeans setter przedstawiają się następująco:

package com.w3big;

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) {
          /* 从属性中使用消息 */
          JspWriter out = getJspContext().getOut();
          out.println( message );
       }
       else {
          /* 从内容体中使用消息 */
          getJspBody().invoke(sw);
          getJspContext().getOut().println(sw.toString());
       }
   }

}

Nazwa własności jest "message", więc setter jest SetMessage (). Teraz użyjmy plik TLD <atrybut> element, aby dodać tę właściwość:

<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.w3big.HelloTag</tag-class>
    <body-content>scriptless</body-content>
    <attribute>
       <name>message</name>
    </attribute>
  </tag>
</taglib>

Teraz możemy użyć właściwości wiadomości w pliku JSP, jak pokazano poniżej:

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

Przykłady powyższych danych wyjściowych jest:

This is custom tag

Można również dołączyć następujące właściwości:

nieruchomość opis
nazwa Określ nazwę właściwości. Każdy znacznik jest nazwą atrybutu musi być unikalna.
wymagany Określa, czy atrybut jest wymagane lub opcjonalne, jeśli jest ustawiona na false opcjonalne.
rtexprvalue Po uruchomieniu wyrażenia oświadczenie, atrybuty znaczników są niepoprawne.
typ Zdefiniuj klasę typu Java nieruchomości. Domyślna wartość jest określona jakociąg
opis opis
fragment Jeśli zadeklarujesz nieruchomości, wartość nieruchomości będzie traktowane jakoJspFragment.

Są to cechy związane z określonym przykład:

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

W przypadku korzystania z dwóch właściwości, należy zmodyfikować plik TLD w następujący sposób:

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