Библиотека тегов taglib

В соответствии с определением в спецификации JSP библиотека тегов – это коллекция действий, инкапсулирующих некоторую функциональность, которые могут использоваться из страницы JSP. То есть, библиотека тегов представляет собой набор java-классов, реализующих определенную бизнес-логику в соответствии с Tag Libraries Interface - интерфейс библиотеки тегов.

Структура тегов напоминает структуру сервлетов, которые могут быть многократно использованы в течение цикла жизни тегов. Библиотека тегов включает один или несколько тегов-классов и XML-дескриптор, содержащий описание тегов и параметров, используемых тегами.

Применение библиотеки тегов напоминает использование компонентов JavaBean, поскольку в обоих случаях часть действий и логика выносится за пределы страницы JSP, решая задачу модульного программирования информационных систем.

Существенным преимуществом использования библиотеки тегов перед компонентами JavaBean заключается в том, что тег (java-класс) имеет доступ к странице JSP и может оперировать содержимым самой страницы JSP.

Библиотека тегов может определять сложные расчеты в более компактной форме. Однако установка библиотек тегов требует большей работы по сравнению с компонентами JavaBean. Компоненты JavaBean особенно эффективны для организации взаимодействия между другими компонентами, поскольку компонент JavaBean может быть создан в одном сервлете, а использоваться другими сервлетами и JSP. Библиотеки тегов, как правило, представляют более замкнутую и самодостаточную систему.

Код java-класса, оформленный в виде тега для выполнения определенных действий, скрывает от пользователя набор операций, определяющих его функциональность. При использовании библиотеки тегов разработка java-кода на странице JSP заключается в описании пользовательских дескрипторов и определением необходимых атрибутов тега (java-класса).

Для использования/создания библиотеки тегов необходимо разработать:

  • класс (Tag handler class), обрабатывающий тег и определяющий его функциональные свойства;
  • XML-файл – дескриптор библиотеки тегов Tag Library Descriptor (файл TLD) – связывающий наименование элементов описания тегов с их реализацией.

Кроме вышеуказанных составляющих библиотеки тегов необходимо выполнить еще два условия использования библиотеки тегов:

  1. Зарегистрировать в дескрипторе поставки web.xml с помощью директивы <taglib> описание месторасположения библиотеки тегов.
  2. На странице JSP с помощью директивы taglib необходимо указать месторасположение файла TLD.

Определение библиотеки тегов, taglib-uri

Пример описания библиотеки тегов templates.tld в дескрипторе приложения web.xml :

<taglib>
    <taglib-uri>/sdo<taglib-uri>
    <taglib-location>/WEB-INF/tlds/templates.tld</taglib-location>
</taglib>

Alias библиотеки тегов для обращения со страницы JSP обозначен в дексрипторе приложения в теге <taglib-uri> как "sdo". После этого на странице JSP можно использовать ссылку на библиотеку следующим образом :

<% @taglib uri="/sdo" prefix="sdo"" %>

В данном примере библиотека тегов templates.tld располагается в директории WEB-INF/tlds.

При компиляции страницы JSP в сервлет пользовательские теги преобразуются в действия над объектами серверной стороны. Интерфейсы и классы, с помощью которых создаются пользовательские теги, располагаются в пакете javax.servlet.jsp.tagext.

Пользовательские действия определяются согласно следующей структуре:

  • открывающий тег – действие, выполняемое java-классом при открытии тега;
  • тело действия;
  • закрывающий тег – действие, выполняемое java-классом при закрытии тега.

Java-класс, обрабатывающий тег, может реализовывать один из следующих интерфейсов:

  • Tag;
  • IterationTag;
  • BodyTag.

Интерфейс Tag

Интерфейс Tag, являющийся наиболее общим интерфейсом, поддерживает пользовательские действия в JSP и определяет следующие базовые методы, инициируемые контейнером:

  • setter методы для инициализации переменных;
  • doStartTag () – метод, определяющий начало обработки действия тега;
  • doEndTag () (либо doFinally () при использовании интерфейса TryCatchFinally ()) – метод, определяющий окончание обработки действия тега.

Когда контейнер обнаруживает дескриптор пользователя, он вызывает методы setPageContext() и setParent() объекта, реализующего интерфейс Tag. Затем контейнер вызывает метод doStartTag(), определяя начало выполнения действия, и завершает его вызовом метода doEndTag().

Интерфейс IterationTag

Интерфейс IterationTag расширяет интерфейс Tag, добавляя метод doAfterBody(), используемый для перезагрузки тела. Метод doAfterBody() вызывается после каждой загрузки с тем, чтобы определить, требуется ли следующая перезагрузка.

Интерфейс BodyTag

Интерфейс BodyTag расширяет интерфейс IterationTag, добавляя два новых метода для манипуляции с телом тега:

  • setBodyContent() – метод, посылающий в буфер объект BodyContent;
  • doInitBody() – метод, предоставляющий возможность обрабатывать буфер перед первой загрузкой в него тела тега.

Для обработчиков JSP тегов можно использовать классы TagSupport, BodyTagSupport и TagExtraInfo в качестве базовых классов. Обработчик тега имеет доступ к API, позволяющему взаимодействовать с JSP-страницей. Входной точкой в API является объект контекста страницы javax.servlet.jsp.PageContext, через который обработчик тега может извлечь все другие внутренние объекты (запрос, сессию и приложение), доступные из JSP-страницы.

Использование JSP тегов с атрибутами

Возможность использования JSP тегов с атрибутами делает технологию использования библиотек тегов еще более гибкой. Обращение к пользовательскому тегу с атрибутами на странице JSP имеет следующий формат:

<prefix:tag_name attribute1='value1' attribute2='value2' .../>

Пример простейшего JSP тега приведен в следующем листинге.

package tags.sdo; 
  
import javax.servlet.jsp.*; 
import javax.servlet.jsp.tagext.*; 
  
public class InfoTag extends TagSupport 
{ 
    public int doStartTag () throws JspException 
    { 
        pageContext.getOut().print ("Библиотека тегов"); 
        return SKIP_BODY; 
    } 
} 

Исходный код необходимо откомпилировать обычным образом и установить в контейнер также, как устанавливается сервлет. Необходимо контролировать соответствие пакетов Java и каталогов файловой системы : в каталоге WEB-INF/classes данный тег InfoTag.class должен быть установлен в подкаталог tags/sdo.

  Рейтинг@Mail.ru