2011-08-23 23 views
6

Tôi có một thành phần hỗn hợp với một giao diện có chứa này:Thành phần tổng hợp đặt thuộc tính trong bean sao lưu của khách hàng của nó như thế nào?

<cc:attribute name="model" 
        shortDescription="Bean that contains Location" > 
     <cc:attribute name="location" type="pkg.Location" 
         required="true" /> 
    </cc:attribute> 
</cc:interface> 

Vì vậy, tôi có thể truy cập vào Location đối tượng trong đánh dấu với # {} cc.attrs.model.location.

Tôi cũng truy cập vào đối tượng đó từ đậu ủng hộ của các thành phần hỗn hợp như thế này:

FacesContext fc = FacesContext.getCurrentInstance(); 
    Object obj = fc.getApplication().evaluateExpressionGet(fc, 
      "#{cc.attrs.model.location}", Location.class); 

Bây giờ thành phần hỗn hợp của tôi đã thực hiện công việc của mình - làm thế nào để gọi phương thức setter trên mô hình từ ủng hộ đậu? (Ví dụ model.setLocation (someValue)?

Trả lời

6

Sử dụng ValueExpression#setValue().

FacesContext facesContext = FacesContext.getCurrentInstance(); 
ELContext elContext = facesContext.getELContext(); 
ValueExpression valueExpression = facesContext.getApplication().getExpressionFactory() 
    .createValueExpression(elContext, "#{cc.attrs.model.location}", Location.class); 

valueExpression.setValue(elContext, newLocation); 

Các Application#evaluateExpressionGet() bằng cách này gọi ValueExpression#getValue() dưới lớp chăn, chính xác như mô tả của javadoc của nó (nếu bạn đã từng đọc nó. ..)


Không liên quan cho vấn đề cụ thể, bạn có nhận thức về khả năng tạo lớp sao lưu UIComponent cho thành phần hỗn hợp? Tôi đặt cược rằng điều này là dễ dàng hơn nhiều so với fiddling với ValueExpression s theo cách này. Sau đó, bạn có thể chỉ cần sử dụng phương thức được thừa kế getAttributes() để nhận được model.

Model model = (Model) getAttributes().get("model); 
// ... 

Bạn có thể tìm thấy ví dụ trong số composite component wiki page của chúng tôi.

+0

Bạn đang nói về việc sử dụng anotation @FacesComponent, phải không? Tôi đã đăng một câu hỏi khác về chủ đề này với một thẻ thành phần tổng hợp và tôi đoán điều này sẽ trả lời câu hỏi đó. – AlanObject

+0

Vâng, đúng vậy. Xem thêm wiki được liên kết. Tôi đã không nhìn thấy câu hỏi khác của bạn. Chú ý đến việc gắn thẻ thích hợp. Những người ở đây thường duyệt qua các thẻ (thú vị). – BalusC

1

thuộc tính "mặc định" là gì? Nó seam rằng nó không được thực hiện khi sử dụng việc thực hiện thành phần sao lưu.

xhtml:

<composite:interface> 
    <composite:attribute name="test" 
         type="java.lang.Boolean" 
         default="#{false}"/> 
</composite:interface> 
<composite:implementation > 
    TEST : #{cc.attrs.test} 
</composite:implementation > 

Java ủng hộ thực hiện:

testValue = (Boolean) getAttributes().get("test"); 

nếu thuộc tính kiểm tra được thiết lập trong xhtml chính không có vấn đề: cả hai xhtml và java ủng hộ có cùng giá trị. Nhưng khi không thiết lập giá trị mặc định là chỉ trên xhtml: Các html chứa

TEST : false 

nhưng testValue là null trong sự ủng hộ

Các vấn đề liên quan