Java Platform, Enterprise Edition (Java EE) 8
Учебник по Java EE

Назад Вперёд Содержание

Делегирование отрисовки отрисовщику

И MapComponent, и AreaComponent делегируют всю отрисовку отдельному отрисовщику. В разделе Выполнение кодирования объясняется, как MapRenderer выполняет кодирование для MapComponent. В этом разделе подробно объясняется процесс делегирования отрисовки отрисовщику с использованием AreaRenderer, который выполняет отрисовку для AreaComponent.

Чтобы делегировать отрисовку, нужно выполнить описанные в следующих разделах задачи:

Создание класса отрисовщика

При делегировании отрисовки отрисовщику вы можете делегировать всё кодирование и декодирование отрисовщику, или вы можете сделать часть этого в классе компонента. Класс AreaComponent делегирует кодирование классу AreaRenderer.

Класс отрисовщика начинается с аннотации @FacesRenderer:

@FacesRenderer(componentFamily = "Area", rendererType = "DemoArea")
public class AreaRenderer extends Renderer {

Аннотация @FacesRenderer регистрирует класс отрисовщика с JavaServer Faces. Аннотация определяет семейство компонентов и тип отрисовщика.

Чтобы выполнить отрисовку для AreaComponent, AreaRenderer должен реализовать метод encodeEnd. Метод encodeEnd в AreaRenderer извлекает форму, координаты и альтернативные текстовые значения, хранящиеся в бине ImageArea, который связан с AreaComponent. Предположим, что тег area, отображаемый в данный момент, имеет значение атрибута value равное "book203". Следующая строка из encodeEnd получает значение атрибута "book203" из объекта FacesContext:

ImageArea ia = (ImageArea)area.getValue();

Значением атрибута является объект компонента ImageArea, который содержит значения shape, coords и alt, связанные с book203 AreaComponent. Конфигурирование модели данных описывает, как приложение хранит эти значения.

После извлечения объекта ImageArea метод отображает значения для shape, coords и alt, просто вызывая связанные методы доступа и передавая возвращённые значения в объект ResponseWriter, как показано этими строками кода, которые записывают форму и координаты:

writer.startElement("area", area);
writer.writeAttribute("alt", iarea.getAlt(), "alt");
writer.writeAttribute("coords", iarea.getCoords(), "coords");
writer.writeAttribute("shape", iarea.getShape(), "shape");

Метод encodeEnd также отображает JavaScript для атрибутов onmouseout, onmouseover и onclick. Страница Facelets должна содержать только путь к изображениям, которые должны быть загружены во время действия onmouseover или onmouseout:

<bookstore:area id="map3" value="#{Book203}"
                onmouseover="resources/images/book_203.jpg"
                onmouseout="resources/images/book_all.jpg"
                targetImage="mapImage"/>

Класс AreaRenderer заботится о генерации JavaScript для этих действий, как показано в следующем коде из encodeEnd. JavaScript, который AreaRenderer генерирует для действия onclick, устанавливает значение скрытого поля равным значению идентификатора компонента текущей области и отправляет страницу.

sb = new StringBuffer("document.forms[0]['").append(targetImageId).
        append("'].src='");
sb.append(
        getURI(context,
        (String) area.getAttributes().get("onmouseout")));
sb.append("'");
writer.writeAttribute("onmouseout", sb.toString(), "onmouseout");
sb = new StringBuffer("document.forms[0]['").append(targetImageId).
        append("'].src='");
sb.append(
        getURI(context,
        (String) area.getAttributes().get("onmouseover")));
sb.append("'");
writer.writeAttribute("onmouseover", sb.toString(), "onmouseover");
sb = new StringBuffer("document.forms[0]['");
sb.append(getName(context, area));
sb.append("'].value='");
sb.append(iarea.getAlt());
sb.append("'; document.forms[0].submit()");
writer.writeAttribute("onclick", sb.toString(), "value");
writer.endElement("area");

Отправляя страницу, этот код заставляет жизненный цикл JavaServer Faces вернуться к фазе восстановления представления. В этой фазе сохраняется вся информация о состоянии, включая значение скрытого поля, так что создаётся новое дерево компонентов запроса. Это значение извлекается методом decode класса MapComponent. Этот метод декодирования вызывается JavaServer Faces в фазе применения значений запроса, которая следует за фазой восстановления представления.

В дополнение к методу encodeEnd, AreaRenderer содержит пустой конструктор. Он используется для создания объекта AreaRenderer для добавления его в инструментарий отрисовки.

Аннотация @FacesRenderer регистрирует класс отрисовщика с JavaServer Faces. Аннотация определяет семейство компонентов и тип отрисовщика.

Определение типа отрисовщика

Зарегистрируйте отрисовщик с помощью инструментария отрисовки, используя аннотацию @FacesRenderer (или используя файл конфигурации приложения, как описано в Регистрация кастомного отрисовщика с помощью инструментария отрисовки). В фазе отрисовки ответа JavaServer Faces вызывает метод getRendererType обработчика тега компонента, чтобы определить, какой отрисовщик вызывать, если он есть.

Вы определяете тип, связанный с отрисовщиком, в элементе rendererType в аннотации @FacesRenderer для AreaRenderer, а также в элементе renderer-type дескриптора библиотеки тегов.


Назад Вперёд Содержание
Логотип Oracle  Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены. Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)