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

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

}

Метод doinitBody () оставлен пустым.

Итак, в самом простом случае достаточно расширить класс TagSupport, переопределив метод doStartTag (). Пусть, например, определен пользовательский тег без аргументов и без тела, всего лишь отправляющий клиенту сообщение:

<sdo:info />

Реализующий его класс может выглядеть так, как показано в листинге 27.5.

Листинг 27.5. Класс простейшего пользовательского тега

package sdotags;

import javax.servlet.jsp.*;

import j avax.servlet.jsp.tagext.*;

public class InfoTag extends TagSupport{

public int doStartTag() throws JspException{

pageContext.getOut().print(,,Библиотека тегов СДО."); return SKIP_BODY;

}

}

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

Еще проще эти действия выполняются с помощью метода doTag( ) интерфейса SimpleTag, реализованного в классе SimpleTagSupport. У данного метода нет аргументов и возвращаемого значения, он объединяет действия, обычно выполняемые методами

doStartTag() и doEndTag().

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

Для каждого атрибута открывающего тега надо определить свойство JavaBean, т. е. поле с именем, совпадающим с именем атрибута, и методы доступа getXxx() и setXxx(). Например, немного ранее (см. разд. "Пользовательские теги” данной главы) мы определили пользовательский тег

<sdo:reg name="имя" />

с одним атрибутом name. Класс RegTag, содержащийся в листинге 27.6, реализует этот тег.

Листинг 27.6. Пользовательский тег с атрибутом

package sdotags;

import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;

public class RegTag extends TagSupport{

private String name;

public String getName(){ return name;

}

public void setName(String name){ this.name = name;

}

public int doStartTag() throws JspException{ if (name == null)

name = pageContext.getRequest().getParameter("name"); registrate(name); return SKIP_BODY;

}

}

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

Если у пользовательского тега есть тело, то при описании тега в TLD-файле в элементе <body-content> вместо слова empty следует написать слово jsp или вообще не писать этот элемент, поскольку его значение jsp принимается по умолчанию.

У тела элемента <body-content> могут быть еще два значения. Значение tagdependent применяется, если содержимое тела тега написано не на языке JSP, а на каком-то другом языке, например это запрос на языке SQL. Значение scriptless показывает, что в теге нет скриптлетов.

Если содержимое тела тега не нужно обрабатывать, а надо только отправить клиенту, то при создании его обработчика достаточно реализовать интерфейс Tag или расширить класс TagSupport. Если метод dostartTag() обработчика вернет значение eval_body_include, то все тело тега будет автоматически отправлено в выходной поток.

Пусть, например, в файле sdotaglib.tld определен пользовательский тег head: