Читать «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;