Jaka jest różnica między tymi podejściami?
Szablony facelet
Zastosowanie Facelet szablony (jak w <ui:composition>
, <ui:include>
i <ui:decorate>
), jeżeli chcesz podzielić główne fragmenty układu strony do reuseable szablonów. Np. Nagłówek, menu, treść, stopka itp.
Przykłady:
Pliki znaczników facelet
Użyj plików znaczników Facelet, jeśli chcesz mieć grupę komponentów do ponownego wykorzystania, aby zapobiec / zminimalizować powielanie kodu. Np. Grupa elementów etykieta + wejście + wiadomość. Główna różnica w porównaniu ze składnikami złożonymi polega na tym, że wynik pliku znaczników Facelet nie reprezentuje pojedynczego elementu UIComponent
i może w pewnych okolicznościach być jedynym rozwiązaniem, gdy składnik złożony nie jest wystarczający. Ogólnie rzecz biorąc, posiadanie <ui:include>
z co najmniej jednym, <ui:param>
który przekazuje właściwość zarządzanego komponentu bean (a zatem nie jest wartością zakodowaną na stałe), jest sygnałem, że plik dołączany może lepiej być plikiem znaczników.
Przykłady:
Komponenty kompozytowe
Użyj komponentów złożonych, jeśli chcesz utworzyć pojedynczy niestandardowy i wielokrotnego użytku UIComponent
z jedną odpowiedzialnością za pomocą czystego XML. Taki komponent złożony zazwyczaj składa się z wielu istniejących komponentów i / lub HTML i jest fizycznie renderowany jako pojedynczy komponent i powinien być powiązany z pojedynczą właściwością ziarna. Np. Komponent, który reprezentuje pojedynczą java.util.Date
właściwość przez 3 zależne <h:selectOneMenu>
komponenty lub komponent, który łączy <p:fileUpload>
i <p:imageCropper>
tworzy jedną, <my:uploadAndCropImage>
odnoszącą się do pojedynczej com.example.Image
jednostki niestandardowej jako właściwość.
Przykłady:
Komponenty niestandardowe
Użyj komponentu niestandardowego, gdy funkcjonalność nie może być osiągnięta za pomocą plików znaczników Facelet lub komponentów kompozytowych z powodu braku wsparcia w standardowym / dostępnym zestawie komponentów. Przykłady można znaleźć w każdym miejscu w kodzie źródłowym bibliotek komponentów open source, takich jak PrimeFaces i OmniFaces .
Programy obsługi tagów
Jeśli chcesz sterować budowaniem drzewa komponentów JSF zamiast renderować wyjście HTML, powinieneś użyć procedury obsługi tagów zamiast komponentu.
Przykłady:
Przykładowe projekty
Oto kilka przykładowych projektów, które wykorzystują wszystkie wymienione powyżej techniki.
Czy wydajność może się różnić?
Technicznie rzecz biorąc, problem z wydajnością jest znikomy. Wyboru należy dokonać na podstawie konkretnych wymagań funkcjonalnych oraz ostatecznego stopnia abstrakcji, możliwości ponownego wykorzystania i utrzymania implementacji. Każde podejście ma swój własny, dobrze określony cel i ograniczenia.
Komponenty złożone mają jednak znaczny narzut podczas tworzenia / przywracania widoku (w szczególności: podczas zapisywania / przywracania stanu widoku). W starszych wersjach Mojarra komponenty kompozytowe miały problemy z wydajnością przy przypisywaniu wartości domyślnych, zostało to już naprawione od 2.1.13. Ponadto Mojarra miał wyciek pamięci, gdy a <cc:attribute method-signature>
jest używany do wyrażeń metod, w zasadzie całe drzewo komponentów jest ponownie przywoływane w sesji HTTP, zostało to naprawione od 2.1.29 / 2.2.8. Wyciek pamięci można ominąć w starszych wersjach 2.1, jak poniżej:
<context-param>
<param-name>com.sun.faces.serializeServerState</param-name>
<param-value>true</param-value>
</context-param>
Lub w starszych wersjach 2.2, jak poniżej:
<context-param>
<param-name>javax.faces.SERIALIZE_SERVER_STATE</param-name>
<param-value>true</param-value>
</context-param>
Mimo to, gdy masz stosunkowo „dużo” komponentów kompozytowych i masz javax.faces.STATE_SAVING_METHOD
ustawione client
, to wydajność będzie uciążliwa. Nie nadużywaj komponentów złożonych, jeśli potrzebujesz jedynie podstawowej funkcjonalności, która jest już możliwa dzięki prostemu plikowi dołączania lub pliku znacznika. Nie używaj łatwości konfiguracji (czytaj: *.taglib.xml
plik nie jest potrzebny) jako wymówki, aby preferować komponenty złożone od plików znaczników.
Korzystając z Mojarra 2.2.10 lub starszej, nie zapomnij wyłączyć stosunkowo krótkiego okresu odświeżania Facelets dla trybu produkcyjnego:
<context-param>
<param-name>javax.faces.FACELETS_REFRESH_PERIOD</param-name>
<param-value>-1</param-value>
</context-param>
Nie używaj tego ustawienia do programowania, w przeciwnym razie musisz ponownie uruchomić cały serwer, aby zmiany w plikach Facelets zostały odzwierciedlone! Mojarra 2.2.11 i nowsze, a MyFaces już domyślnie ustawia -1
kiedy javax.faces.PROJECT_STAGE
nie jest ustawione na Development
.
NamingContainer
, w przeciwnym razie pojawią się problemy z duplikatami identyfikatorów, gdy ten sam komponent jest wielokrotnie używany.Image
właściwością w fasoli.