Учебники

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

В этой главе мы обсудим пользовательские теги в JSP. Пользовательский тег — это пользовательский элемент языка JSP. Когда страница JSP, содержащая пользовательский тег, преобразуется в сервлет, тег преобразуется в операции над объектом, называемым обработчиком тега. Затем веб-контейнер вызывает эти операции при выполнении сервлета страницы JSP.

Расширения тегов 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 () берет текущий объект JspContext с помощью метода getJspContext () и использует его для отправки «Hello Custom Tag!» к текущему объекту JspWriter

Давайте скомпилируем вышеприведенный класс и скопируем его в каталог, доступный в переменной окружения CLASSPATH. Наконец, создайте следующий файл библиотеки тегов: <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>

Давайте теперь используем определенный выше пользовательский тег Hello в нашей программе JSP следующим образом:

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

Атрибуты пользовательских тегов

Вы можете использовать различные атрибуты вместе со своими пользовательскими тегами. Чтобы принять значение атрибута, пользовательский класс тега должен реализовать методы установки, идентичные методам установки JavaBean, как показано ниже —

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» , поэтому метод установки — setMessage () . Давайте теперь добавим этот атрибут в файл TLD, используя элемент <attribute> следующим образом:

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

Давайте следовать 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

Рассмотрите возможность включения следующих свойств для атрибута:

S.No. Недвижимость и цель
1

название

Элемент name определяет имя атрибута. Имя каждого атрибута должно быть уникальным для определенного тега.

2

требуется

Это указывает, является ли этот атрибут обязательным или необязательным. Это было бы ложным для необязательного.

3

rtexprvalue

Объявляет, допустимо ли значение выражения времени выполнения для атрибута тега

4

тип

Определяет тип класса Java этого атрибута. По умолчанию он принят как String

5

описание

Информационное описание может быть предоставлено.

6

фрагмент

Объявляет, следует ли рассматривать это значение атрибута как JspFragment .

название

Элемент name определяет имя атрибута. Имя каждого атрибута должно быть уникальным для определенного тега.

требуется

Это указывает, является ли этот атрибут обязательным или необязательным. Это было бы ложным для необязательного.

rtexprvalue

Объявляет, допустимо ли значение выражения времени выполнения для атрибута тега

тип

Определяет тип класса Java этого атрибута. По умолчанию он принят как String

описание

Информационное описание может быть предоставлено.

фрагмент

Объявляет, следует ли рассматривать это значение атрибута как JspFragment .

Ниже приведен пример для указания свойств, связанных с атрибутом:

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

Если вы используете два атрибута, вы можете изменить свой TLD следующим образом: