Bu yaklaşımlar arasındaki fark nedir?
Facelet şablonları
Kullanım Facelet (olduğu gibi şablonları <ui:composition>
, <ui:include>
ve <ui:decorate>
sen reuseable şablonlarına ana sayfa düzeni parçaları bölmek istiyorsanız). Örneğin üstbilgi, menü, içerik, altbilgi vb.
Örnekler:
Facelet etiket dosyaları
Kod tekrarını önlemek / en aza indirmek için yeniden kullanılabilir bir bileşen grubuna sahip olmak istiyorsanız Facelet etiket dosyalarını kullanın. Örneğin bir grup etiket + girdi + mesaj bileşeni. Bileşik bileşenlerle en büyük fark, bir Facelet etiket dosyasının çıktısının tek UIComponent
bir bileşeni temsil etmemesidir ve bazı durumlarda bir bileşik bileşen yeterli olmadığında tek çözüm olabilir. Genel olarak, bir yönetilen bean özelliğini geçiren (ve dolayısıyla kodlanmış bir değer olmayan) <ui:include>
bir veya daha fazlasına <ui:param>
sahip olmak, içerme dosyasının daha iyi bir etiket dosyası olabileceğinin bir işaretidir.
Örnekler:
Kompozit bileşenler
Tek ve yeniden kullanılabilir bir özel oluşturmak istiyorsanız kompozit bileşenleri kullanın UIComponent
Salt XML kullanarak tek bir sorumlulukla kullanılabilir bir . Böyle bir kompozit bileşen genellikle bir grup mevcut bileşen ve / veya HTML'den oluşur ve fiziksel olarak tek bileşen olarak oluşturulur ve tek bir fasulye özelliğine bağlı olması beklenir. Örneğin, tek bir bağı, bir parça java.util.Date
3 bağımlı ozelliğıne <h:selectOneMenu>
bileşenler veya birleştiren bir bileşen <p:fileUpload>
ve <p:imageCropper>
bir tek içine <my:uploadAndCropImage>
tek bir özel atıfta com.example.Image
özelliği olarak varlık.
Örnekler:
Özel bileşenler
Standart / mevcut bileşen setinde destek eksikliğinden dolayı Facelet etiket dosyaları veya bileşik bileşenlerle işlevsellik elde edilemediğinde özel bir bileşen kullanın. Örnekler, PrimeFaces ve OmniFaces gibi açık kaynak bileşen kitaplıklarının kaynak kodunda her yerde bulunabilir .
Etiket işleyicileri
HTML çıktısının oluşturulması yerine JSF bileşen ağacının oluşturulmasını kontrol etmek istediğinizde, bileşen yerine bir etiket işleyici kullanmalısınız.
Örnekler:
Örnek projeler
İşte yukarıda belirtilen tüm teknikleri kullanan bazı örnek projeler.
Performans farklı olabilir mi?
Teknik olarak, performans endişesi önemsizdir. Seçim, somut işlevsel gereksinimlere ve uygulamanın nihai soyutlama, yeniden kullanılabilirlik ve sürdürülebilirlik derecesine göre yapılmalıdır. Her yaklaşımın kendi iyi tanımlanmış amacı ve sınırlamaları vardır.
Bununla birlikte, kompozit bileşenler, görünümün oluşturulması / geri yüklenmesi sırasında önemli bir ek yüke sahiptir (özellikle: görünüm durumunu kaydetme / geri yükleme sırasında). Ve Mojarra'nın eski sürümlerinde, bileşik bileşenlerin varsayılan değerleri atamayla ilgili performans sorunları vardı, bu 2.1.13'ten beri zaten düzeltildi. Ayrıca Mojarra bir vardı bellek sızıntısı bir zaman <cc:attribute method-signature>
yöntem ifadeleri kullanılır temelde tüm bileşen ağaç HTTP oturumda yeniden başvuruda bulunulan, bu 2.1.29 / 2.2.8 beri sabittir. Bellek sızıntısı, eski 2.1 sürümlerinde aşağıdaki gibi atlanabilir:
<context-param>
<param-name>com.sun.faces.serializeServerState</param-name>
<param-value>true</param-value>
</context-param>
Veya aşağıdaki gibi eski 2.2 sürümlerinde:
<context-param>
<param-name>javax.faces.SERIALIZE_SERVER_STATE</param-name>
<param-value>true</param-value>
</context-param>
Yine de, nispeten "çok" kompozit bileşene sahipseniz ve bunu javax.faces.STATE_SAVING_METHOD
ayarladıysanız client
, performans acı verici olacaktır. Yalnızca basit bir ekleme dosyası veya etiket dosyasıyla zaten mümkün olan temel işlevselliği istiyorsanız, bileşik bileşenleri kötüye kullanmayın. *.taglib.xml
Etiket dosyaları yerine bileşik bileşenleri tercih etmek için yapılandırma kolaylığını (okuma: dosya gerekmez) bir bahane olarak kullanmayın.
Mojarra 2.2.10 veya daha eski sürümleri kullanırken, üretim modu için nispeten kısa Facelets yenileme süresini devre dışı bırakmayı unutmayın:
<context-param>
<param-name>javax.faces.FACELETS_REFRESH_PERIOD</param-name>
<param-value>-1</param-value>
</context-param>
Bu ayarı geliştirme için kullanmayın, aksi takdirde Facelets dosyalarındaki değişiklikleri yansıtmak için tüm sunucuyu yeniden başlatmanız gerekir! Mojarra 2.2.11 ve daha yenisi ve MyFaces zaten varsayılan olarak -1
ne zaman javax.faces.PROJECT_STAGE
ayarlanmadığına ayarlıdır Development
.