Читать «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: