Читать «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, таким же, как описанный в разд. "Обработка взаимодействующих тегов” данной главы одноименный элемент TLD-файла.