Читать «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( ). Он уже не может выбрасывать исключения.