2011-09-23 81 views
3

我已經創建了一個自定義組件。我爲它添加了一個動態輸入文本框(來自編碼函數)。如何將值自定義組件傳遞給託管Bean?

組件正確呈現爲HTML。

但我想將文本框的值綁定到託管Bean上的某個屬性。所以其他開發人員可以在他的jsp上使用他的託管bean。

我想知道,我該怎麼做,以便在文本框(我的組件動態創建的)中輸入的值設置爲某個Managed bean屬性。

回答

2

那麼問題就解決了。

在encodeEnd()方法我添加的元素作爲

HtmlInputHidden hidden = new HtmlInputHidden(); 
hidden.setParent(this); 
hidden.setId("someId"); 
ValueExpression ve = getValueExpression("value"); 
hidden.setValueExpression("value", ve); 
hidden.encodeBegin(context); 
hidden.encodeEnd(context); 

這似乎有一些問題。 。

然後,我改變這...

HtmlInputHidden hidden = new HtmlInputHidden(); 
hidden.setId("someId"); 
ValueExpression ve = getValueExpression("value"); 
hidden.setValueExpression("value", ve); 
this.getChildren().add(hidden); 
hidden.encodeBegin(context); 
hidden.encodeEnd(context); 

使用this.getChildren()的添加();解決了我的問題

P.S.顯然在添加元素之前,如果元素已經存在,需要檢查它。

3

您需要確保您的自定義組件類擴展爲UIInput,並且您在渲染器的encodeEnd()方法中將組件的客戶端ID編寫爲HTML輸入元素的name屬性。然後,您可以在渲染器的覆蓋方法decode()中從請求參數映射中獲取提交的值,並使用組件的客戶端ID作爲參數名稱,並將其設置爲UIInput#setSubmittedValue(),然後讓JSF完成轉換,驗證和更新作業的剩餘部分模型值。

@Override 
public void decode(FacesContext context, UIComponent component) { 
    // Do if necessary first validation on disabled="true" or readonly="true", if any. 

    // Then just get the submitted value by client ID as name. 
    String clientId = component.getClientId(context); 
    String submittedValue = context.getExternalContext().getRequestParameterMap().get(clientId); 
    ((UIInput) component).setSubmittedValue(submittedValue); 
} 

無關的具體問題,你是否知道在JSP的繼任Facelets的新的複合材料部件的支持?我的印象是,你不一定需要用於此目的的自定義組件。或者,儘管您已經使用JSF 2.x,您是否真的被限制使用舊版JSP作爲視圖技術?另請參見When to use <ui:include>, tag files, composite components and/or custom components?

+0

非常感謝,但我寫了上面的代碼。我甚至檢查了上面代碼的'submittedValue'變量,它是用戶輸入的。但仍然沒有到達Managed Bean。你能否幫我用編碼方法中的代碼來綁定動態控件和一些Managed bean屬性?用戶將自定義組件的某些「selectedValue」屬性值提供爲selectedValue =「#{TestBean.testProperty}」。現在,用戶在動態文本框中輸入的值應該設置爲'testPoperty'。 – Apurv

相關問題