Когда разработчик приложения создаёт кастомный отрисовщик, как описано в Делегирование отрисовки отрисовщику, он должен зарегистрировать его с помощью соответствующего инструментария отрисовки. Поскольку приложение карты изображения реализует карту изображения HTML, классы AreaRenderer
и MapRenderer
в примере Duke's Bookstore должны быть зарегистрированы с использованием инструментария отрисовки HTML.
Вы регистрируете отрисовщик либо используя аннотацию @FacesRenderer
, как описано в Создание класса отрисовщика, либо используя элемент render-kit
файла конфигурации приложения. Вот гипотетическая конфигурация AreaRenderer
:
<render-kit>
<renderer>
<component-family>Area</component-family>
<renderer-type>DemoArea</renderer-type>
<renderer-class>
dukesbookstore.renderers.AreaRenderer
</renderer-class>
<attribute>
<attribute-name>onmouseout</attribute-name>
<attribute-class>java.lang.String</attribute-class>
</attribute>
<attribute>
<attribute-name>onmouseover</attribute-name>
<attribute-class>java.lang.String</attribute-class>
</attribute>
<attribute>
<attribute-name>styleClass</attribute-name>
<attribute-class>java.lang.String</attribute-class>
</attribute>
</renderer>
...
Атрибуты, указанные в теге renderer
, переопределяют любые параметры в аннотации @FacesRenderer
.
Элемент render-kit
представляет реализацию javax.faces.render.RenderKit
. Если render-kit-id
не указан, предполагается, что используется инструментарий отрисовки HTML по умолчанию. Элемент renderer
представляет реализацию javax.faces.render.Renderer
. Вложив элемент renderer
в элемент render-kit
, вы регистрируете отрисовщик с помощью реализации RenderKit
, связанной с render-kit
.
renderer-class
— это полное имя класса Renderer
.
Элементы component-family
и renderer-type
используются компонентом для поиска отрисовщиков, которые могут его отрисовать. Идентификатор component-family
должен совпадать с идентификатором, возвращаемым методом getFamily
класса компонента. Семейство компонентов представляет компонент или набор компонентов, которые может отображать конкретный отрисовщик. renderer-type
должен совпадать с тем, который возвращается методом getRendererType
класса обработчика тега.
Используя семейство компонентов и тип отрисовщика для поиска отрисовщиков для компонентов, JavaServer Faces позволяет компоненту отображаться несколькими отрисовщиками и позволяет отрисовщику отображать несколько компонентов.
Каждый из тегов attribute
определяет зависящий от отрисовки атрибут и его тип. Элемент attribute
не влияет на работу приложения во время выполнения. Скорее, он предоставляет инструментам разработки информацию об атрибутах, которые поддерживает Renderer
.
Объект, отвечающий за отрисовщик компонента (будь то сам компонент или отрисовщик, которому компонент делегирует отрисовку), может использовать фасеты для помощи в процессе отрисовки. Эти аспекты позволяют разработчику кастомного компонента управлять некоторыми аспектами отрисовки компонента. Рассмотрите этот пример тега кастомного компонента:
<d:dataScroller>
<f:facet name="header">
<h:panelGroup>
<h:outputText value="Account Id"/>
<h:outputText value="Customer Name"/>
<h:outputText value="Total Sales"/>
</h:panelGroup>
</f:facet>
<f:facet name="next">
<h:panelGroup>
<h:outputText value="Next"/>
<h:graphicImage url="/images/arrow-right.gif" />
</h:panelGroup>
</f:facet>
...
</d:dataScroller>
Тег компонента dataScroller
включает в себя компонент, который будет отображать заголовок, и компонент, который будет отображать кнопку «Далее». Если отрисовщик, связанный с этим компонентом, отображает фасеты, вы можете включить следующие элементы facet
в элемент renderer
:
<facet>
<description>This facet renders as the header of the table. It should be
a panelGroup with the same number of columns as the data.
</description>
<display-name>header</display-name>
<facet-name>header</facet-name>
</facet>
<facet>
<description>This facet renders as the content of the "next" button in
the scroller. It should be a panelGroup that includes an outputText
tag that has the text "Next" and a right arrow icon.
</description>
<display-name>Next</display-name>
<facet-name>next</facet-name>
</facet>
Если компонент, который поддерживает фасеты, обеспечивает свой собственный отрисовщик, и вы хотите включить элементы facet
в файл конфигурации приложения, вам нужно поместить их в конфигурацию компонента, а не в конфигурацию отрисовщика.