Яка різниця між цими підходами?
Шаблони фейлеток
Використовуйте Facelet шаблони (як <ui:composition>
, <ui:include>
і <ui:decorate>
) , якщо ви хочете розділити основні фрагментів макета сторінки в багаторазові шаблони. Наприклад, заголовок, меню, вміст, колонтитул тощо.
Приклади:
Файли тегів Facelet
Використовуйте файли тегів Facelet, якщо ви хочете мати групу компонентів для повторного використання, щоб запобігти / мінімізувати дублювання коду. Наприклад, група міток + введення + компоненти повідомлень. Основна відмінність композиційних компонентів полягає в тому, що висновок файлу тегів Facelet не являє собою єдиного, UIComponent
а в деяких випадках може бути єдиним рішенням, коли складеного компонента недостатньо. Як правило, наявність <ui:include>
одного або декількох, <ui:param>
які передають властивість керованого боба (і, таким чином, не є твердим кодом), є сигналом про те, що файл включення може бути краще тегом.
Приклади:
Композитні компоненти
Використовуйте складені компоненти, якщо ви хочете створити єдиний та багаторазовий користувальницький звичай UIComponent
з єдиною відповідальністю за допомогою чистого XML. Такий складений компонент, як правило, складається з групи існуючих компонентів та / або HTML і фізично виводиться як єдиний компонент і повинен бути пов'язаний з одним властивістю боба. Наприклад, компонент, який представляє єдину java.util.Date
властивість 3 залежними <h:selectOneMenu>
компонентами, або компонент, який поєднує <p:fileUpload>
і <p:imageCropper>
в єдине, що позначає <my:uploadAndCropImage>
одну власну com.example.Image
сутність як властивість.
Приклади:
Спеціальні компоненти
Використовуйте спеціальний компонент, коли функціональних можливостей неможливо досягти за допомогою файлів тегів Facelet або складених компонентів через відсутність підтримки у стандартному / доступному наборі компонентів. Приклади можна знайти в усьому вихідному коді бібліотек компонентів з відкритим вихідним кодом, таких як PrimeFaces та OmniFaces .
Обробники тегів
Якщо ви хочете керувати побудовою дерева компонентів JSF замість надання виводу HTML, тоді вам слід використовувати обробник тегів замість компонента.
Приклади:
Приклад проектів
Ось кілька прикладних проектів, які використовують усі вищезгадані методи.
Чи можуть продуктивність відрізнятися?
У технічному плані занепокоєння результатами незначне. Вибір повинен бути зроблений виходячи з конкретних функціональних вимог та остаточного ступеня абстрагування, повторного використання та ремонтопридатності реалізації. Кожен підхід має своє чітко визначене призначення та обмеження.
Однак складові компоненти мають значні накладні витрати під час побудови / відновлення подання (зокрема: під час збереження / відновлення стану перегляду). У старих версіях Mojarra складені компоненти мали проблеми з продуктивністю із призначенням значень за замовчуванням, це вже виправлено з 2.1.13. Крім того, у Myrra виникла пам'ять, коли <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
, то продуктивність буде біль. Не зловживайте складовими компонентами, якщо ви просто хочете отримати базовий функціонал, який уже можливий за допомогою простого файлу включення або тегу. Не використовуйте простоту конфігурації (читайте: *.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
.