stringtranslate.com

Фейслеты

В вычислительной технике 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= "&nbsp;" 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= "&nbsp;" escape= "false" /> </cc:implementation> </ui:composition>            

Вышеуказанный Facelet автоматически доступен как компонент в пространстве имен «http://java.sun.com/jsf/composite/my» и имени тега «spacer».

Параметризованные включения

Для настройки включенного контента Facelets позволяет использовать параметры. С помощью этих параметров объекты могут передаваться во включенный контент, где они могут использоваться как переменные. Для этого можно использовать <ui:include>механизм [17], тогда как для пользовательских тегов и составных компонентов можно использовать обычные атрибуты тегов. Составные компоненты требуют, чтобы параметры были объявлены в их разделе интерфейса [18], тогда как для пользовательских тегов такого требования нет, и значения, предоставленные для произвольных атрибутов, предоставляются как переменные с тем же именем, что и указанный атрибут.<ui:param>

Смотрите также

Ссылки

  1. ^ Бергстен, Ганс (9 июня 2004 г.). «Улучшение JSF путем отказа от JSP». ONJava . O'Reilly Media . Архивировано из оригинала 2018-04-05.
  2. ^ "Facelets: JavaServer Faces View Definition Framework". java.net . Архивировано из оригинала 2016-12-31.
  3. ^ ab Hookom, Jacob (17 августа 2005 г.). "Inside Facelets Part 1: An Introduction". JSFCentral . Архивировано из оригинала 2020-01-05.
  4. ^ Бернс, Эд; Шалк, Крис (2009). JavaServer Faces 2.0, Полный справочник . McGraw-Hill . ISBN 978-0-07-162509-8. стр. 55: Экспертная группа решила использовать Facelets в качестве основы для новых функций, оставив JSP в качестве уровня обратной совместимости.
  5. ^ Бернс, Эд; Китаин, Роджер, ред. (8 ноября 2010 г.). Спецификация JavaServer Faces, версия 2.1. JCP (технический отчет) (ред. MR2). Oracle . JSR-314. стр. 10-1: Facelets — это замена JSP, которая изначально была разработана с учетом JSF. Новые функции, представленные в версии 2 и более поздних, доступны только авторам страниц, использующим Facelets. JSP сохранен для обратной совместимости.
  6. ^ "Новейшие вопросы 'jsf'". stackoverflow.com . Получено 22 ноября 2016 г. .
  7. ^ JavaServer Faces 2.0, Полное руководство Эда Бернса и Криса Шалка
  8. ^ Core JavaServer Faces (3-е издание) Дэвида Гири и Кей С. Хорстманна
  9. ^ "JSF 2 fu, Часть 2: Шаблоны и составные компоненты". ibm.com . 2 июня 2009 г. . Получено 22 ноября 2016 г. .
  10. ^ "ui (JSF 2.0 Page Decraration Language: Facelets Variant)". oracle.com . Получено 22 ноября 2016 г. .
  11. ^ "include (JSF 2.0 Page Decraration Language: Facelets Variant)". oracle.com . Получено 22 ноября 2016 г. .
  12. ^ "Некоторые вещи, которые следует помнить: Facelets ui:include считается мощным". pilhuhn.blogspot.com . 4 декабря 2009 г. . Получено 22 ноября 2016 г. .
  13. ^ "Custom JSF components with Facelets". wordpress.com . 29 февраля 2008 г. Архивировано из оригинала 19 октября 2016 г. Получено 22 ноября 2016 г.
  14. ^ "composite(JSF 2.0 Page Decraration Language: Facelets Variant)". oracle.com . Получено 22 ноября 2016 г. .
  15. ^ «Что нового в JSF 2?». wordpress.com . 31 июля 2009 г. Получено 22 ноября 2016 г.
  16. ^ JSR 314, 10.3.3.1, http://jcp.org/en/jsr/detail?id=314
  17. ^ "param(JSF 2.0 Page Decraration Language: Facelets Variant)". oracle.com . Получено 22 ноября 2016 г. .
  18. ^ "interface (JSF 2.0 Page Decraration Language: Facelets Variant)". oracle.com . Получено 22 ноября 2016 г. .

Библиография

Внешние ссылки