JavaServer Faces предлагает концепцию составных компонентов с Facelets. Составной компонент — это специальный тип шаблона, который действует как компонент.
Любой компонент — это, по сути, фрагмент кода, который можно использовать многократно и который ведет себя определённым образом. Например, компонент ввода принимает пользовательский ввод. С компонентом также могут быть связаны валидаторы, конвертеры и слушатели для выполнения определённых действий.
Составной компонент состоит из набора тегов разметки и других существующих компонентов. Этот повторно используемый компонент, созданный пользователем, имеет определённую функциональность и может иметь валидаторы, конвертеры и слушатели, связанные с ним, как с любым другим компонентом.
С помощью Facelets любая страница XHTML, содержащая теги разметки и другие компоненты, может быть конвертирована в составной компонент. Используя ресурсы, составной компонент может храниться в библиотеке, которая доступна приложению из определённого местоположения.
Таблица 8-3 перечисляет наиболее часто используемые составные теги и их функции.
Таблица 8-3. Составные теги компонентов
Тег |
Функция |
composite:interface
|
Объявляет контракт на использование составного компонента. Составной компонент может использоваться как отдельный компонент, набор функций которого представляет собой объединение функций, объявленных контрактом на использование. |
composite:implementation
|
Определяет реализацию составного компонента. Если появляется элемент composite:interface , должен быть соответствующий ему элемент composite:implementation . |
composite:attribute
|
Объявляет атрибут, который может быть задан объекту составного компонента, в котором объявлен этот тег. |
composite:insertChildren
|
Любые дочерние компоненты или текст шаблона в теге составного компонента на странице использования будут переопределены в составном компоненте в точке, указанной размещением этого тега в разделе composite:implementation . |
composite:valueHolder
|
Объявляет, что составной компонент, чей контракт объявлен composite:interface , в который вложен этот элемент, предоставляет реализацию ValueHolder , подходящую для использования в качестве цели для прикреплённых объектов на используемой странице. |
composite:editableValueHolder
|
Объявляет, что составной компонент, чей контракт объявлен composite:interface , в который вложен этот элемент, предоставляет реализацию EditableValueHolder , подходящую для использования в качестве цели присоединяемых объектов на используемой странице. |
composite:actionSource
|
Объявляет, что составной компонент, чей контракт объявлен composite:interface , в который вложен этот элемент, предоставляет реализацию ActionSource2 , подходящую для использования в качестве цели присоединяемых объектов на используемой странице. |
Для получения дополнительной информации и полного списка составных тегов Facelets см. документацию библиотеки тегов Facelet JavaServer Faces.
В следующем примере показан составной компонент, который принимает на вход адрес электронной почты:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:composite="http://xmlns.jcp.org/jsf/composite"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
<title>This content will not be displayed</title>
</h:head>
<h:body>
<composite:interface>
<composite:attribute name="value" required="false"/>
</composite:interface>
<composite:implementation>
<h:outputLabel value="Email id: "></h:outputLabel>
<h:inputText value="#{cc.attrs.value}"></h:inputText>
</composite:implementation>
</h:body>
</html>
Обратите внимание на использование cc.attrs.value
при определении значения компонента inputText
. Слово cc
в JavaServer Faces является зарезервированным словом для составных компонентов. Выражение #{cc.attrs.`attribute-name`}
используется для доступа к атрибутам, определённым для интерфейса составного компонента, который в этом случае оказывается value
.
Содержимое предыдущего примера хранится в виде файла email.xhtml
в каталоге resources/emcomp
корневого каталога веб-приложения. JavaServer Faces считает этот каталог библиотекой, и компонент может быть доступен из такой библиотеки. Для получения дополнительной информации о ресурсах см. Веб-ресурсы.
Веб-страница, которая использует этот составной компонент, обычно называется страницей использования. Страница использования включает ссылку на составной компонент в объявлениях пространства имён xml
:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:em="http://xmlns.jcp.org/jsf/composite/emcomp">
<h:head>
<title>Using a sample composite component</title>
</h:head>
<body>
<h:form>
<em:email value="Enter your email id" />
</h:form>
</body>
</html>
Локальная библиотека составных компонентов определяется в пространстве имён xmlns
с объявлением xmlns:em="http://xmlns.jcp.org/jsf/composite/emcomp"
. Доступ к самому компоненту осуществляется через тег em:email
. Содержимое предыдущего примера можно сохранить как веб-страницу с именем emuserpage.xhtml
в корневом веб-каталоге. При компиляции и развёртывании на сервере доступ к нему можно получить по следующему URL:
http://localhost:8080/application-name/emuserpage.xhtml