Читать «Java 7 (Наиболее полное руководство)» онлайн - страница 435

Ильдар Шаукатович Хабибуллин

<taglib>

<taglib-uri>/sdo</taglib-uri>

<taglib-location>/WEB-INF/sdotaglib.tld</taglib-location>

</taglib>

После этого на странице JSP можно написать ссылку на библиотеку так:

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

Псевдоним может быть указан и в TLD-файле, в элементе <uri>, как показано в листинге 27.4. В этом случае контейнер, обнаружив на странице JSP тег <%@ taglib %> с псевдонимом, просматривает TLD-файлы в поисках этого псевдонима в их элементах <uri>. Найдя псевдоним, контейнер связывает его с путем к TLD-файлу, содержащему псевдоним. Поиск TLD-файлов происходит только в подкаталогах каталога WEB-INF и во всех JAR-архивах, а именно в каталогах META-INF, находящихся в JAR-архивах.

Каждый тег создаваемой библиотеки реализуется классом Java, называемым в документации обработчиком тега (tag handler). Обработчик тега должен реализовать интерфейс Tag, а если у тега есть тело, которое надо выполнить несколько раз, то нужно реализовать его расширение — интерфейс IterationTag. Если же тело пользовательского тега требует предварительной обработки, то следует использовать расширение интерфейса IterationTag — интерфейс BodyTag. Эти интерфейсы собраны в пакет j avax. servlet. j sp.tagext. В нем есть и готовые реализации указанных интерфейсов — класс TagSupport, реализующий интерфейс IterationTag, и его расширение — класс BodyTagSupport, реализующий интерфейс BodyTag.

Итак, для создания пользовательского тега без тела или с телом, но не требующим предварительной обработки, удобно расширить класс TagSupport, а для создания тега с телом, которое надо предварительно преобразовать, — класс BodyTagSupport.

Классы, реализующие библиотеку тегов, хранятся в каталоге WEB-INF/classes, а если они упакованы в JAR-архив — то в каталоге WEB-INF/lib своего Web-приложения. Если библиотека разделяется несколькими Web-приложениями, то она хранится в каком-нибудь общем каталоге, например common/lib. Соответствие между именами тегов и классами, реализующими их, указывается в TLD-файле, описывающем библиотеку, в XML-элементе <tag>. В этом же элементе, во вложенном XML-элементе <attribute>, описываются атрибуты открывающего тега. Например:

<tag>

<name>reg</name>

<tag-class>sdotags.RegTag</tag-class>

<body-content>EMPTY</body-content>

<attribute>

<name>name</name>

<required>true</required>

<rtexprvalue>true</rtexprvalue>

<type>j ava.lang.String</type>

</attribute>

</tag>

Если после этого на странице JSP написать пользовательский тег <sdo:reg>, например:

<sdo:reg name="%=request.getParameter(\"name\") %" />

или с помощью языка JSP EL:

<sdo:reg name="${param.name}" />

то для обработки данного тега будет создан объект класса RegTag из пакета sdotags.

Класс-обработчик пользовательского тега

Как уже было сказано ранее, класс-обработчик элемента, не имеющего тела, или тело которого не требует преобразований, должен реализовать интерфейс Tag или расширить класс TagSupport. Если тело элемента перед посылкой клиенту надо преобразовать, то классу-обработчику следует реализовать интерфейс BodyTag или расширить класс BodyTagSupport. В случае простых преобразований можно реализовать интерфейс SimpleTag или расширить класс SimpleTagSupport.