Когда использовать , файлы тегов, композитные компоненты и/или пользовательские компоненты?
-
26-10-2019 - |
Вопрос
Я начал использовать JSF 2.0 с Facelets недавно и получил озадачен новыми компонентами, зная существующие <ui:include>
и другие методы шаблона, предлагаемые Facelets 1.x.
В чем разница между этими подходами? Функционально они, кажется, предлагают около того же: <ui:param>
против <cc:attribute>
, <ui:insert>
+<ui:define>
VS TAG -файлы, повторное использование существующих шаблонов. Есть ли что -то, кроме синтаксиса и чистой спецификации интерфейса в случае составных компонентов? Может ли производительность отличаться?
Решение
В чем разница между этими подходами?
Шаблоны лиц
Используйте шаблоны лиц (как в <ui:composition>
, <ui:include>
а также <ui:decorate>
) Если вы хотите разделить фрагменты макета основной страницы на повторные шаблоны. Например, заголовок, меню, содержание, нижний колонтитул и т. Д.
Примеры:
- Как включить еще один XHTML в XHTML с использованием фассовых ударов JSF 2.0?
- Какова реальная концептуальная разница между пользовательским интерфейсом: Украшение и пользовательский интерфейс: включить?
- Как настроить H: Head при использовании пользовательского интерфейса: шаблон композиции?
- Как изменить элементы головки страницы при использовании пользовательского интерфейса: композиция
- Как динамика Ajax-Refresh включает в себя контент путем навигационной меню? (JSF SPA)
Файлы тегов лиц
Используйте файлы тегов лиц, если вы хотите иметь повторную группу компонентов, чтобы предотвратить/минимизировать дублирование кода. Например, группа метки+вход+компоненты сообщения. Основное различие с композитными компонентами заключается в том, что выход файла тега лиц не представляет ни одного UIComponent
и в некоторых обстоятельствах может быть единственным решением, когда композитного компонента недостаточно. Как правило, имея <ui:include>
с одним или несколькими <ui:param>
который передает управляемое свойство бобов (и, следовательно, не жесткое значение) - это сигнал, что файл включения может быть лучше файлом тега.
Примеры:
- Как создать пользовательский тег Facelets?
- Как сделать сетку композитного компонента JSF?
- Как создать композитный компонент для столбца данных?
- Primefaces outputlabel для композитного компонента
Составные компоненты
Используйте композитные компоненты, если вы хотите создать единый и повторный пользователь UIComponent
с одной ответственностью с использованием чистого XML. Такой составной компонент обычно состоит из куча существующих компонентов и/или HTML и физически визуализируется как отдельный компонент и должен быть связан с свойством одного бобов. Например, компонент, который представляет собой один java.util.Date
свойство 3 -зависимым <h:selectOneMenu>
компоненты или компонент, который объединяет <p:fileUpload>
а также <p:imageCropper>
в сингл <my:uploadAndCropImage>
Ссылаясь на один обычай com.example.Image
сущность как собственность.
Примеры:
- Наша страница композитного компонента Wiki
- Код Balusc: композитный компонент с несколькими входными полями
- Split java.util.date Среди двух полей h: inputtext, представляющие час и минуту с F: ConvertDateTime
- Выберите все элементы в нескольких selectmanycheckbox с динамическими идентификаторами
- Расширение компонента CommandLink JSF
- Избегание дублирующих идентификаторов при повторном использовании композиций Facelets в том же контейнере именования
Пользовательские компоненты
Используйте пользовательский компонент всякий раз, когда функциональность не может быть достигнута с помощью файлов тегов лиц или составных компонентов из -за отсутствия поддержки в стандартном/доступном наборе компонентов. Примеры можно найти во всем месте в исходном коде библиотек компонентов с открытым исходным кодом, например, как Primefaces а также Всефакс.
Обработчики тегов
Если вы хотите контролировать построение дерева компонентов JSF вместо рендеринга выхода HTML, вы должны использовать обработчик метки вместо компонента.
Примеры:
- Пользовательский компонент лиц в JSF
- Как я могу получить доступ к содержанию чего -то, созданного сu003Cui:define> программно?
- Условное визуализация в TagFile в зависимости от того, указан ли атрибут или нет
- Выполнение перенаправления, когда преобразование / проверка, связанная с параметрами запроса
Пример проектов
Вот несколько примеров проектов, в которых используются все вышеупомянутые методы.
- Java ee -приложение для начала (шаблоны - включает - Tagfiles - композит)
- Omnifaces витрина (шаблоны - включает - Tagfiles - композит)
Может ли производительность отличаться?
Технически, проблема производительности незначительна. Выбор должен быть сделан на основе конкретных функциональных требований и окончательной степени абстракции, повторного использования и обслуживаемости реализации. Каждый подход имеет свою собственную определенную цель и ограничения.
Композитные компоненты, однако, имеют значительные накладные расходы во время строительства/восстановления вида (в частности: во время сохранения/восстановления состояния просмотра). И в более старых версиях Mojarra композитные компоненты имели проблемы с производительностью при назначении значений по умолчанию, это уже исправлено с 2.1.13. Кроме того, у Мохарры был утечка памяти когда <cc:attribute method-signature>
используется для выражений метода, в основном все дерево компонентов пересматривается в сеансе HTTP, это фиксируется с 2.1.29 / 2.2.8. Утечка памяти может быть обойден в более старых версиях 2.1, как показано ниже:
<context-param>
<param-name>com.sun.faces.serializeServerState</param-name>
<param-value>true</param-value>
</context-param>
Или в старых 2,2 версиях, как ниже:
<context-param>
<param-name>javax.faces.SERIALIZE_SERVER_STATE</param-name>
<param-value>true</param-value>
</context-param>
Тем не менее, когда у вас есть относительно «много» составных компонентов, и у вас есть javax.faces.STATE_SAVING_METHOD
установлен в client
, тогда выступление будет болью. Не злоупотребляйте составными компонентами, если вы просто хотите основную функциональность, которая уже возможно с помощью простого включения файла или файла TAG. Не используйте простоту конфигурации (читать: нет *.taglib.xml
Файл необходим) в качестве предлога, чтобы предпочесть композитные компоненты по сравнению с файлами тегов.
При использовании Mojarra 2.2.10 или старше, не забудьте отключить относительно короткий период обновления Facelets для производственного режима:
<context-param>
<param-name>javax.faces.FACELETS_REFRESH_PERIOD</param-name>
<param-value>-1</param-value>
</context-param>
Не используйте этот параметр для разработки, в противном случае вы перезагружаете весь сервер, чтобы получить изменения в файлах Facelets, которые будут отражены! Mojarra 2.2.11 и более новее, а Myfaces уже по умолчанию -1
когда javax.faces.PROJECT_STAGE
не настроен на Development
.