English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Пользовательские теги JSP

Пользовательские теги являются элементами языка JSP, определяемыми пользователем. При включении пользовательского тега в страницу JSP он преобразуется в сервлет, а тег преобразуется в набор операций над    Операции объекта, называемого tag handler, то есть те операции, которые вызываются Web контейнером при выполнении сервлета.

JSP тег расширения позволяет создавать новые теги и напрямую вставлять их в страницу JSP. В спецификации JSP 2.0 были введены Simple Tag Handlers для написания этих пользовательских тегов.

Вы можете наследовать класс SimpleTagSupport и переписать метод doTag(), чтобы разработать самый простой пользовательский тег.

Создание тега "Hello"

Далее мы хотим создать пользовательский тег под названием <ex:Hello>, формат тега таков:

<ex:Hello />

Чтобы создать пользовательский тег JSP, вы сначала должны создать Java-класс для обработки тега. Поэтому давайте создадим класс HelloTag, как показано ниже:

package com.w3codebox;
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.w3codebox.HelloTag</tag-class>
    <body-content>empty</body-content>
  </tag>
</taglib>

Теперь мы можем использовать тег Hello в файле JSP:

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

Результат выполнения программы приведен ниже:

Hello Custom Tag!

Доступ к телу тега

Вы можете включать содержимое в тег, как в стандартной библиотеке тегов. Например, чтобы включить содержимое в наш пользовательский Hello, формат таков:

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

Мы можем изменить файл класса обработчика тега, код таков:

package com.w3codebox;
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());
    }
}

Далее нам нужно изменить файл 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.w3codebox.HelloTag</tag-class>
    <body-content>scriptless</body-content>
  </tag>
</taglib>

Теперь мы можем использовать измененный тег в JSP, как показано ниже:

<%@ 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. Пример метода setter в JavaBean таков:

package com.w3codebox;
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());
       }
   }
}

Название атрибута - "message", поэтому метод установки - 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.w3codebox.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

Вы также можете включить следующие атрибуты:

АтрибутОписание
nameОпределите имя атрибута. Имя атрибута каждого тега должно быть уникальным.
requiredУкажите, является ли атрибут обязательным или необязательным. Если установлено в false, это необязательное.
rtexprvalueУкажите, является ли атрибут действительным при выполнении выражения.
typeОпределите тип Java класса для этого атрибута. По умолчанию указывается String
descriptionинформационное описание
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>
.....