В вычислительной технике Facelets — это система веб-шаблонов с открытым исходным кодом под лицензией Apache и технология обработчика представлений по умолчанию (также известная как язык декларирования представлений) для Jakarta Faces (JSF; ранее Jakarta Server Faces и JavaServer Faces). Для работы языка требуются допустимые входные XML- документы. Facelets поддерживает все компоненты пользовательского интерфейса JSF и полностью фокусируется на построении дерева компонентов JSF, отражающего представление для приложения JSF.
Хотя технологии JSP и Faces были улучшены для лучшей совместной работы, Facelets устраняет проблемы, отмеченные в статье Ганса Бергстена «Улучшение JSF путем отказа от JSP» [1].
Facelets черпает некоторые идеи из Apache Tapestry , [2] [3] и достаточно похож, чтобы провести сравнение. Проект концептуально похож на Tapestry, который рассматривает блоки элементов HTML как компоненты фреймворка, поддерживаемые классами Java. Facelets также имеет некоторые сходства с фреймворком Apache Tiles в отношении поддержки шаблонов и композиции.
Facelets изначально был создан Джейкобом Хукомом в 2005 году [3] как отдельный, альтернативный язык объявления представлений для JSF 1.1 и JSF 1.2, которые оба использовали JSP в качестве языка объявления представлений по умолчанию. Начиная с JSF 2.0, Facelets был предложен экспертной группой JSF в качестве языка объявления представлений по умолчанию. JSP был объявлен устаревшим как устаревший резервный вариант. [4] [5]
В Facelets теги шаблонов из библиотеки тегов могут быть введены в двух формах: напрямую как квалифицированный xml
элемент или косвенно через jsfc
атрибут произвольного неквалифицированного элемента. В последнем случае компилятор Facelet проигнорирует фактический элемент и обработает элемент так, как если бы он был задан атрибутом jsfc
.
В следующем примере показано прямое использование квалифицированных тегов:
<!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://java.sun.com/jsf/html" > <body> <h:form> <h:outputText value= "Добро пожаловать, #{loggedInUser.name}" disabled= "#{empty loggedInUser}" /> <h:inputText value= "#{bean.property}" /> <h:commandButton value= "OK" action= "#{bean.doSomething}" /> </h:form> </body> </html>
Используя jsfc
атрибут, этот же код можно выразить, как в примере, приведенном ниже:
<!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://java.sun.com/jsf/html" > < body > < form jsfc = "h:form" > < span jsfc = "h:outputText" value = "Добро пожаловать, #{loggedInUser.name}" disabled = "#{empty loggedInUser}" /> < input type = "text" jsfc = "h:inputText" value = "#{bean.property}" /> < input type = "submit" jsfc = "h:commandButton" value = "ОК" действие = "#{bean.doSomething}" /> </ form > </ body > </ html >
Вышеприведенный код можно просматривать в браузере и редактировать с помощью обычных инструментов дизайна WYSIWYG . Это невозможно при прямом использовании квалифицированных тегов. Тем не менее, прямое использование квалифицированных тегов является наиболее популярным способом использования Facelets на практике [6] и является стилем, наиболее часто используемым в книгах и примерах. [7] [8]
Facelets предоставляет возможность шаблонизации. [9] [10] Файл Facelets может ссылаться на главный шаблон и предоставлять содержимое для заполнителей, определяемых этим главным шаблоном. Файл, который ссылается на такой шаблон, называется клиентом шаблона . Сами клиенты шаблонов могут снова использоваться в качестве шаблона для других клиентов шаблонов, и, таким образом, может быть создана иерархия шаблонов.
Ниже показан пример простого главного шаблона:
templates/главный_шаблон.xhtml
<!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://java.sun.com/jsf/html" xmlns:ui= "http://java.sun.com/jsf/facelets" > <h:head> <meta http-equiv= "content-type" content= "text/html;charset=UTF-8" /> <meta http-equiv= "pragma" content= "no-cache" /> </h:head> <h:body> Стандартный текст заголовка для каждой страницы. <ui:insert name= "body_content" /> Стандартный текст нижнего колонтитула для каждой страницы. </h:body> </html>
Приведенный выше код содержит HTML-фрейм по умолчанию и один заполнитель, называемый body_content . Клиент шаблона может использовать этот шаблон следующим образом:
template_client.xhtml
<ui:composition template= "/templates/master_template.xhtml" xmlns= "http://www.w3.org/1999/xhtml" xmlns:ui= "http://java.sun.com/jsf/facelets" > <ui:define name= " body_content" > Это шаблон клиентской страницы , использующий главный шаблон. </ui:define> </ui: composition >
Приведенный выше код использует шаблон /templates/master_template.xhtml
и предоставляет содержимое для заполнителя в этом шаблоне. Конечным результатом будет страница с именем template_client.xhtml
, которая имеет содержимое /templates/master_template.xhtml
, но <ui:insert name="body_content"/>
замененное на «Это клиентская страница шаблона, которая использует главный шаблон».
В дополнение к шаблонизации Facelets обеспечивает поддержку повторного использования, позволяя пользователю включать контент, который находится в другом файле. Включение такого контента может быть выполнено тремя различными способами:
Самый простой способ включить содержимое другого Facelet — это сослаться на него по имени с помощью <ui:include>
тега. [11] [12] Это приводит к тому, что содержимое в указанном файле напрямую включается в вызывающий Facelet компилятором Facelets. Помимо повторного использования содержимого в нескольких местах, это можно использовать для разбиения большого Facelet на более мелкие части.
Ниже показан пример:
templates/главный_шаблон.xhtml
<!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://java.sun.com/jsf/html" xmlns:ui= "http://java.sun.com/jsf/facelets" > <ui:include src= "html_head.xhtml" /> <h:body> Стандартный текст заголовка для каждой страницы. <ui:insert name= "body_content" /> Стандартный текст нижнего колонтитула для каждой страницы. </h:body> </html>
html_head.xhtml
<ui:composition xmlns= "http://www.w3.org/1999/xhtml" xmlns:h= "http://java.sun.com/jsf/html" > <h:head> <meta http-equiv= "content-type" content= "text/html;charset=UTF-8" /> <meta http-equiv= "pragma" content= "no-cache" /> </h:head> </ui:composition>
Facelets поддерживает косвенное включение контента через пользовательские теги. [13] Такой пользовательский тег может быть связан с Facelet в файле taglib. Вхождения этого тега затем будут заменены содержимым связанного Facelet.
Ниже показан пример этого:
templates/главный_шаблон.xhtml
<!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://java.sun.com/jsf/html" xmlns:ui= "http://java.sun.com/jsf/facelets" xmlns:my= "http://example.com/my" > <ui:include src= "html_head.xhtml" /> <h:body> Стандартный текст заголовка для каждой страницы. <my:spacer> <ui:insert name= "body_content" /> Стандартный текст нижнего колонтитула для каждой страницы. </h:body> </html>
Код выше использует тег <my:spacer>
для обозначения точки в Facelet, куда должен быть вставлен контент. Такой тег должен быть объявлен в файле Taglib, где он может быть связан с Facelet следующим образом:
пример.taglib.xml
<?xml версия="1.0" кодировка="UTF-8"?> <facelet-taglib xmlns= "http://java.sun.com/xml/ns/javaee" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd" версия= "2.0" > <пространство имен> http://example.com/my </пространство имен> <тег> <имя-тега> пробел < /имя-тега> <источник > пробел.xhtml </источник > </ тег > </facelet-taglib>
Ниже показан пример того, как может выглядеть фактический контент Facelet:
spacer.xhtml
<ui:composition xmlns= "http://www.w3.org/1999/xhtml" xmlns:ui= "http://java.sun.com/jsf/facelets" xmlns:h= "http://java.sun.com/jsf/html" > <h:outputText value= " " escape= "false" /> </ui:composition>
Помимо прямого включения контента, Facelets предоставляет механизм составных компонентов, который делает контент доступным как первоклассный компонент JSF. [14] [15] Составные компоненты не нужно объявлять в файле Taglib, вместо этого их нужно поместить в специальный каталог. По соглашению контенту затем автоматически назначается пространство имен и имя тега. Пространство имен состоит из фиксированной строки 'http://java.sun.com/jsf/composite/', объединенной с именем каталога, в котором находится файл контента относительно каталога 'resources'. [16] Имя тега становится именем файла без суффикса .xhtml.
Ниже показан пример этого:
ресурсы/мой/spacer.xhtml
<ui:composition xmlns= "http://www.w3.org/1999/xhtml" xmlns:ui= "http://java.sun.com/jsf/facelets" xmlns:h= "http://java.sun.com/jsf/html" xmlns:cc= "http://java.sun.com/jsf/composite" > <cc:interface/> <cc:implementation> <h:outputText value= " " escape= "false" /> </cc:implementation> </ui:composition>
Вышеуказанный Facelet автоматически доступен как компонент в пространстве имен «http://java.sun.com/jsf/composite/my» и имени тега «spacer».
Для настройки включенного контента Facelets позволяет использовать параметры. С помощью этих параметров объекты могут передаваться во включенный контент, где они могут использоваться как переменные. Для этого можно использовать <ui:include>
механизм [17], тогда как для пользовательских тегов и составных компонентов можно использовать обычные атрибуты тегов. Составные компоненты требуют, чтобы параметры были объявлены в их разделе интерфейса [18], тогда как для пользовательских тегов такого требования нет, и значения, предоставленные для произвольных атрибутов, предоставляются как переменные с тем же именем, что и указанный атрибут.<ui:param>
Экспертная группа решила использовать Facelets в качестве основы для новых функций, оставив JSP в качестве уровня обратной совместимости.
Facelets — это замена JSP, которая изначально была разработана с учетом JSF. Новые функции, представленные в версии 2 и более поздних, доступны только авторам страниц, использующим Facelets. JSP сохранен для обратной совместимости.