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

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

Основной метод интерфейса Tag

public int doStartTag();

выполняет действия, предписанные открывающим тегом. К нему сервлет обращается автоматически, начиная обработку элемента. Метод должен вернуть одну из двух констант интерфейса Tag, указывающих на дальнейшие действия:

□ eval_body_include — обрабатывать тело элемента;

□ skip_body — не обрабатывать тело элемента.

После завершения этого метода сервлет обращается к методу

public int doEndTag();

который выполняет действия, завершающие обработку пользовательского тега. Метод возвращает одну из двух констант интерфейса Tag:

□ eval_page — продолжать обработку страницы JSP;

□ ski p_page — завершить на этом обработку страницы JSP.

Интерфейс IterationTag добавляет метод

public int doAfterTag();

позволяющий обработать повторно тело пользовательского тега. Он будет выполняться перед методом doEndTag (). Если метод doAfterTag () возвращает константу EVAL_BODY_AGAI N интерфейса IterationTag, то тело элемента будет обработано еще раз, если константу ski p_body — обработка тела не станет повторяться.

Интерфейс BodyTag позволяет буферизовать выполнение тела элемента. Буферизация производится, если метод doStartTag() возвращает константу EVAL_BODY_BUFFERED интерфейса BodyTag. В таком случае перед обработкой тела тега контейнер обращается к методу

public void doInitBody();

который может выполнить различные предварительные действия.

У этих методов нет аргументов, они получают информацию из объекта класса PageContext, который всегда создается Web-контейнером для выполнения любой страницы JSP. При реализации интерфейса Tag или BodyTag данный объект можно получить методом getPageContext ( ) класса JspFactory, предварительно получив объект класса JspFactory его собственным статическим методом getDefaultFactory(). Сложность таких манипуляций — еще один аргумент для того, чтобы не реализовывать интерфейсы, а расширять класс TagSupport или класс BodyTagSupport.

Итак, для создания пользовательского тега без тела или с телом, не требующим обработки, удобнее всего расширить класс TagSupport, а для создания пользовательского тега с обработкой тела — расширить класс BodyTagSupport. При этом разработчик получает в свое распоряжение объект класса PageContext просто в виде защищенного поля

pageContext.

Описанные ранее методы реализованы в классе TagSupport очень просто:

public int doStartTag() throws JspException{ return SKIP_BODY;

}

public int doEndTag() throws JspException{ return EVAL_PAGE;

}

public int doAfterBody() throws JspException{ return SKIP BODY;

В подклассе BodyTagSupport реализация метода dostartTag () немного изменена:

public int doStartTag() throws JspException{ return EVAL_BODY_BU FFERED;