2010-02-09 18 views
5

Belirli bir bileşenin değerini çalışma zamanında dinamik olarak nasıl bağlarım? Örneğin, benim durumda aşağıdaki bileşen etiketi,JSF bileşeninin dinamik değer bağlaması

<h:inputText value="#{bean.someProp}" /> 

var "# {bean.someProp}" sadece zamanında bilinir.

Bunu uygulamak için en iyi strateji nedir?

Bileşen ağacından geçmeli ve değer bağını programsal olarak ayarlamalı mıyım? Cevabınız evet ise, hangi JSF yaşam döngüsü fazında geçiş yapmalıyım?

cevap

15

bean özelliğine String anahtarının dinamik özellik adına göre daha az veya daha fazla olduğu yere bağlayabilirsiniz. Sen EL aşağıdaki şekilde haritası değerleri erişebilirsiniz:

<h:inputText value="#{bean.map.someProp}" /> 

hatta someVar aslında "someProp" bir String değerine giderir daha dinamik bir tad yapılabilir

<h:inputText value="#{bean.map['someProp']}" /> 

:

<h:inputText value="#{bean.map[someVar]}" /> 

yalnızca aksi JSF erişemiyor, Map fasulye başlatma sırasında oluşturulan emin olmak gerekir harita değerleri. EL, sizin için "iç içe geçmiş özellikleri" oluşturmaz. Böylece, örn. direkt örnekleme:

public class Bean { 
    private Map<String, Object> map = new HashMap<String, Object>(); 
} 

.. veya isterseniz bir Oluşturucu içinde veya @PostConstruct.

+0

Tamam Ne demek istediğini anlıyorum. Bu, iyi bir fikir, ancak benim varlığımdaki ek açıklamalarda tanımlanan tüm meta verileri kaybedeceğim dışında. Bu, (SEAM'den hazırda bekletme doğrulama etiketi) ve ek açıklama meta verilerine bağlı olan tüm diğer altyapı kullanım avantajlarını da kaybetmemek anlamına gelir. FYI, bunu 'çıplak nesne' desenini uygulayan bir çerçeve yapmak için yapıyorum (bir ref uygulaması http://www.nakedobjects.org/). Temel olarak bir varlığı denetler ve otomatik olarak ilgili tabloları ve formları oluşturur (bu durumda, bileşen ağacı). – bungrudi

+0

Urm, ... ikinci düşüncede, bu yaklaşımı kullanarak tüm bu ek açıklamaları meta verilere kaybetmem gerekmiyor. Bunu deneyeceğim ve bilmenizi istiyorum. – bungrudi

+0

Halihazırda yaptığım yol budur. Bunu yaparak, 'un avantajını kaybediyorum ve başka bir yerde validasyonu yeniden uygulamak zorundayım. Yine de, hibernateValidator.validate (fasulye) çağırma meselesi. – bungrudi

0

Fasulyenize başka bir seçenek de bir katman katmanı ekleyebilirsiniz.

public String getDynamicProp() { 
    ...Code to determine and return the correct property based on the meta-data... 
} 

public void setDynamicProp(String input) { 
    ...Code to determine and return the correct property based on the meta-data... 
} 

Sonra dinamik pervane doğrudan JSF kravat olacaktır:

#{bean.dynamicProp} 

Ancak bu doğrulayıcılar gibi meta veriler ve isteyen varmış gibi asmak olmaz. Ancak, doğrulamayı programlanabilir ve kendiniz halledebilirsiniz.