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

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

□ <name-given> — постоянное имя переменной;

□ <name-from-attribute> — имя атрибута, значение которого будет именем переменной.

Остальные вложенные элементы необязательны:

□ <variable-class> класс переменной, по умолчанию String;

□ <declare> — создавать ли новый объект при обращении к переменной, по умолчанию

true;

□ <scope> — область действия переменной, одна из трех констант:

• nested — между открывающим и закрывающим тегами, т. е. в методах

doStartTag (), dolnitBody (), doEndBody (); принимается по умолчанию;

• at_begin — от открывающего тега до конца страницы;

• at_end — после закрывающего тега до конца страницы.

Например:

<tag>

<name>tagname</name>

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

<variable>

<name-given>varname</name-given>

<variable-class>j ava.lang.String</variable-class>

<declare>true</declare>

<scope>AT_END</scope>

</variable>

</tag>

Второй способ — определить объект, содержащий ту же самую информацию, что и элемент <variable>. Данный объект создается как расширение класса TagExtraInfo.

Вот как выглядит это расширение для примера, приведенного ранее:

public class MyTei extends TagExtraInfo{

public VariableInfo[] getVariableInfo(TagData data){ return new VariableInfo[]{

new VariableInfo(data.getAttributeString("id"),

"java.lang.String", true, VariableInfo.AT END)

};

}

}

Класс MyTei описывается в TLD-файле в элементе <tei-class> следующим образом:

<tag>

<name>tagname</name>

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

<tei-class>sdotags.MyTei</tei-class>

<bodycontent>JSP</bodycontent>

</tag>

У этого способа больше возможностей, чем у элемента <variable>. Класс TagExtraInfo имеет в своем распоряжении экземпляр класса TagData, содержащий сведения о теге, собранные из TLD-файла. Для удобства использования этого экземпляра в классе TagExtraInfo есть логический метод

public boolean isValid(TagData info);

Его можно применять для проверки атрибутов тега на этапе компиляции страницы JSP.

Обработка исключений в пользовательских тегах

Ранее уже говорилось о том, что обработку исключения, возникшего на странице JSP, можно перенести на другую страницу, указанную атрибутом errorPage тега <%@ page %>. В пользовательских тегах можно облегчить обработку исключения, реализовав интерфейс TryCatchFinally.

Интерфейс TryCatchFinally описывает всего два метода:

public void doCatch(Throwable thr); public void doFinally();

Метод doCatch () вызывается автоматически контейнером при возникновении исключения в одном из методов doStartTag(), doInitBody(), doAfterTag(), doEndTag() обработчика, реализующего интерфейс TryCatchFinally. Методу doCatch () передается созданный объект-исключение. Метод doCatch () сам может выбросить исключение.

Метод doFinally ( ) выполняется во всех случаях после метода doEndTag( ). Он уже не может выбрасывать исключения.