@FacesRenderer(componentFamily = "Area", rendererType = "DemoArea")
public class AreaRenderer extends Renderer {
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
дескриптора библиотеки тегов.
Назад | Вперёд | Содержание |