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

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

Вы можете использовать различные атрибуты вместе со своими собственными тегами. Чтобы принять значение атрибута, класс настраиваемого тега должен реализоватьsetter методы, идентичные методам установки 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

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

2

required

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

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