2012-08-08 16 views
8

nitelik ayarlayıcı tetiklemez : Ben kullanırsanızMTU 2 özel bileşenler Ben etiketi şöyle</p> <p>JSF 2.0 özel bir bileşen oluşturmak zorunda

@FacesComponent("a.b.c.MyTag") 
public class UIMyTag extends UIInput { 

    private String name; 
    private String id; 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 


    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @Override 
    public void encodeBegin(FacesContext context) throws IOException { 
     ResponseWriter writer = context.getResponseWriter(); 
     logger.debug(getName()); //prints null for name="#{dummyBean.name}" 
           // and AAA for name="AAA" 
     logger.debug(getAttributes().get("name")); // always correct value 
    ... 
} 
    .... 

} 

<x:myTag id="1" name="AAA" /> 

her şey beklendiği gibi çalışır, ancak myTag öznitelikleri için EL kullanırken setName() yöntemi hiçbir zaman aranmaz.

<x:myTag id="#{dummyBean.id}" name="#{dummyBean.name}" /> 

, Yani hep encodeBegin yöntemi içinde name özellik için null olsun. Hata ayıkladıktan sonra, setName yönteminin hiçbir zaman çağrılmadığını fark ettim. Belki de EL ile ilgili bir şeyleri (belki de bunun sebebinin bununla bağlantılı olduğuna inanıyorum) bir şeyler düşündüğünü düşünmüştüm, ama gerçekten garip olan şu ki id özelliğinin iyi çalışması: setterin çağrılması ve değer değiştiğinde beklenen değerdir. başlar.

encodeBegin yönteminden getAttributes().get("name") yöntemini çağırırsam, doğru ad değerini aldığımı, ancak bunun neden alıcı ve ayarlayıcı ile çalışmadığını merak ettiğimi belirtmeliyim.

Bileşenimde eksik olan herhangi bir fikir var mı?

cevap

12

Bu davranış beklenen ve belirtme niteliğindedir. Değer ifadeleri olan öznitelik değerleri UIComponent#setValueExpression() tarafından belirlenir. Bunlar, genellikle görünüm oluşturma sırasında, gerçekten kullanıldığı zaman değerlendirilmeleri gerekir.

id (ve binding) özniteliği özel muamele vardır: o set oldu önce görünüm oluşturma zaman sırasında değerlendirilir, bu yüzden "normal" setter (yerine setValueExpression() ait aranmak bakış render olur aksi kazasında çünkü id (veya binding) özniteliği, bazı sebeplerden dolayı görünüm oluşturma süresinden farklı bir değere dinamik olarak değerlendirdiğinde).

Toplayıcılar/ayarlayıcıları yerel özellikler yerine UIComponent#getStateHelper()'a atamak daha iyidir. setValueExpression() nihayetinde StateHelper'da da sona erer (setter'ı hiç çağırmaz, sadece vericiye ihtiyaç duyarsanız getutörü arayın) ve getAttributes() ayrıca StateHelper değerlerini de çözer. onlar zaten uzanan ediyoruz UIComponentBase üst sınıfta definied çünkü güvenle ,getId() ve setId() yöntemleri kaldırabilir

public String getName() { 
    return (String) getStateHelper().eval("name"); 
} 

public void setName(String name) { 
    getStateHelper().put("name", name); 
} 

Not.

+0

Cevabınız için teşekkürler! Bileşenimin içindeki farklı öznitelik değerleri arasında ayrım yapmak için bazı özel yöntemler uygulamak zorunda mıyım diye sormak istiyorum. (UIComponentBase'in kendi başına ele aldığını anladım) Ve eğer evet ise, bunu yapmak için en iyi uygulama var mı ?! – RaresI

+0

Hayır ve genel olarak umurumda değil.(Değerlendirilen) öznitelik değerini almak için, yalnızca alıcıyı çağırınız. – BalusC

İlgili konular