Читать «Java 7 (Наиболее полное руководство)» онлайн - страница 442
Ильдар Шаукатович Хабибуллин
Например, при реализации тега <sdo:connection> допускается использование методов интерфейса TryCatchFinally для отката транзакции следующим образом:
public class ConnectionTag extends TagSupport implements TryCatchFinally{
private Connection conn;
// Прочие поля и методы класса
public void doCatch(Throwable t) throws Throwable{ conn.rollback();
throw t;
}
public void doFinally(){ conn.close();
}
}
Обработка тегов средствами JSP
Уже упоминавшаяся тенденция к изгнанию со страниц JSP всякого чужеродного кода, даже кода Java, привела к тому, что для обработки пользовательского тега вы можете вместо класса Java написать страницу JSP, описав на ней действия тега. Имя файла с такой страницей-обработчиком JSP получает расширение tag, а если она оформлена как документ XML, то расширение tagx. Файл, содержащий отдельный фрагмент страницы-обработчика, получает имя с расширением tagf.
Например, тег <sdo:info />, действие которого мы показали в листинге 27.5, можно обработать следующей, очень простой, страницей JSP, записанной в tag-файл с именем info.tag:
<j sp:root
xmlns:j sp=" ava.sun.com/JSP/Page"
version="2.0" >
Библиотека тегов СДО.
</jsp:root>
Поскольку элемент <jsp:root> необязателен, весь файл info.tag может состоять только из одной строчки:
Библиотека тегов СДО.
На странице-обработчике пользовательских тегов можно записывать любые теги JSP, кроме директивы page. Вместо нее указывается специально введенная для этой цели в язык JSP директива tag. Например:
<%@ tag body-content="scriptless">
Второе отличие заключается в том, что в директиве <%@ taglib %> следует записывать не атрибут uri, а атрибут tagdir, в котором указывается каталог с tag-файлами, например:
<%@ taglib tagdir="/WEB-INF/tags" prefix="sdo" %>
Атрибуты обрабатываемого пользовательского тега описываются еще одной специально введенной директивой attribute, аналогичной элементу <attribute> TLD-файла. Пусть, например, на странице JSP применяется пользовательский тег с двумя атрибутами:
<sdo:reg name="Иванов" age="25"/>
В файле reg.tag, обрабатывающем этот тег, можно написать
<%@ attribute name="name" required="true" fragment="false" rtexprvalue="false"
%>
<%@ attribute name="age" type="j ava.lang.Integer"
%>
Если тип type атрибута не указан, то по умолчанию он считается строкой класса
j ava.lang.String.
Типом атрибута может быть фрагмент JSP, т. е. объект класса javax.servlet.jsp.tagext. JspFragment. В таком случае атрибуты type и rtexprvalue не указываются, а атрибут
fragment="true".
После этого описания значения атрибутов, введенные в обрабатываемый тег, в примере они равны "Иванов" и "25", можно использовать в файле reg.tag как ${name} и $ {age}.
Третья, специально введенная директива variable, аналогичная элементу <variable> TLD-файла, позволяет описать переменную на странице-обработчике. Например:
<%@ variable name-given="x"
variable-class="j ava.lang.Integer"
scope="NESTED"
declare="true"
%>
Область действия переменной определяется атрибутом scope, таким же, как описанный в