<Ui: include>, etiket dosyaları, bileşik bileşenler ve / veya özel bileşenler ne zaman kullanılır?


102

Yakın zamanda Facelets ile JSF 2.0 kullanmaya başladım <ui:include>ve Facelets 1.x tarafından sunulan mevcut ve diğer şablonlama tekniklerini bilen yeni kompozit bileşenler karşısında şaşırdım.

Bu yaklaşımlar arasındaki fark nedir? İşlevsel olarak aynı şeyi sunuyor gibi görünüyorlar: <ui:param>vs <cc:attribute>, <ui:insert>+ <ui:define>vs etiket dosyaları, mevcut şablonların yeniden kullanımı. Bileşik bileşenlerde sözdizimi ve açık arabirim belirtiminden başka bir şey var mı? Performans farklı olabilir mi?

Yanıtlar:


176

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 UIComponentbir 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 UIComponentSalt 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.Date3 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_METHODayarladı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.xmlEtiket 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 -1ne zaman javax.faces.PROJECT_STAGEayarlanmadığına ayarlıdır Development.


diyelim ki 3 (facelet etiket dosyası) yerine neden 1 bileşeni (bileşik bileşen) oluşturmak istersiniz? Demek istediğim, güneşli bir günde belki 3 yerine 1 hissedeceksin ... ama sanırım arkasında başka bir şey var. Örneğinizde UINamingContainer'ı genişletiyorsunuz ... bu bir cc için nedenlerden biri olabilir mi (yani bazı jsf uygulamasına özgü işlevlerin üzerine yazabilmek için)?
Toskan

2
Bir etiket dosyası, bir tür içerme olarak görülmelidir. Bir kompozit bileşen, gerçek bir bileşen olarak görülmelidir. Bir kompozit bileşenin uygulanması gerekirNamingContainer , aksi takdirde aynı bileşen birden çok kez tekrar kullanıldığında yinelenen kimlik sorunları yaşarsınız.
BalusC

@BalusC Diyelim ki, Adresleri (ve tüm özniteliklerini: cadde, numara, şehir vb.) Eklememe veya kaldırmama izin veren bir 'blok' oluşturan bir grup HTML ve JSF'ye sahibim. Aynı bloğu 2 veya 3 sayfada kullanmam gerekiyor. Bu, sizin bir Kompozit Bileşen tanımınıza uyuyor mu?
RinaldoPJr

1
@Rinaldo: Bunun için stackoverflow.com/questions/5713718/… ' de gösterildiği gibi dinamik olarak doldurulmuş bileşen kimliklerine sahip bir etiket dosyası kullanacağımı düşünüyorum . IMO, bir etiket dosyasıyla yapılabiliyorsa, onu kullanın. Bir etiket dosyasıyla yapılamıyorsa, bir bileşik kullanın. Tek bir özelliği işlemek için birden fazla bileşene ihtiyacınız varsa (adres değil, örneğin tek bir mülkte olması gereken sokak adı + ev numarası), o zaman tek çözüm bileşik bileşen olacaktır.
BalusC

2
@Tarik: Kompozitlerin etiket dosyalarına kıyasla çok fazla ek yükü vardır. Başka bir deyişle: düşük performans. Yalnızca birbiriyle yakından ilgili bir dizi mevcut bileşene dayalı tek bir özel UI bileşeni oluşturmanız gerekiyorsa kullanın. Bu bir etiket dosyasıyla yapılamaz. Örneğin ZEEF.com'un tek bir bileşimi vardır: sayfa resminde, profil resminde, bağlantı bloğu başlığında, resim bloklarında vb. Kullanılan karşıya yükleme / indirme / kırpma resmi hepsi bir arada şey. Sadece bir Imageözelliğe bağlıdır. fasulye içinde.
BalusC
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.